WebブラウザはSTUNクライアントを実装している
STUNサーバーを利用すれば、NATの外側のIPアドレスを調べることができる。
インターネットには一般公開されたSTUNサーバーが存在する。
Webブラウザは、STUNクライアントを実装している。
WebRTC APIを使ってSTUNで調べたIPアドレスを取得できる。
ブラウザ互換性
パブリックSTUNサーバー
googleのパブリックSTUNサーバーstun.l.google.com:19302
を利用する
function getIPAddresses() {
const S = "stun.l.google.com:19302";
return new Promise(resolve => {
const pc = new RTCPeerConnection({
iceServers: [
{
urls: ["stun:" + S]
}
]
});
const rslt = [];
pc.onicecandidate = e => {
if (!e.candidate) {
return resolve(rslt);
}
const [ip, , , type] = e.candidate.candidate.split(" ", 8).slice(4);
if (type == "srflx") {
rslt.push(ip);
}
};
pc.onnegotiationneeded = async () => {
await pc.setLocalDescription(await pc.createOffer());
};
pc.createDataChannel("");
});
}
-
ice candidateの書式 rfc 5245 S-15.1
- ローカルアドレスは、type "host"で取得できる
- type "srflx"は、server reflexiveという意味
- ice gatheringの終了判定
- onicecandiateのe.candidate == null でcompleteの判別
- onicegatheringstatechangeのcompleteでも判別可能
- onicegatheringstatechange VS onicecandidate with candidate==null · Issue #166 · w3c/webrtc-pc
- mediatrackかdatachannelが無いとiceGatheringが始まらない
- createDataChannelの第1引数は必須だが使用しないので""を指定