WebRTCを使ってJavascriptから自分のPriavte IPアドレスを取得する事ができるようだ。
// Vender Prefixありバージョンの場合も考慮
window.RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;
// RTCPeerConnectionコネクションを作成。NAT越えは不要なのでiceServersは未指定
var pc = new RTCPeerConnection({iceServers:[]}), noop = function(){};
// データチャンネルを作成
pc.createDataChannel('');
// Offer送信
pc.createOffer(pc.setLocalDescription.bind(pc), noop);
pc.onicecandidate = function(ice) {
if (ice && ice.candidate && ice.candidate.candidate) {
console.log(ice.candidate.candidate);
// 正規表現を使ってIPアドレスだけ抜き出す。
var myIP = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/.exec(ice.candidate.candidate)[1];
console.log(myIP);
pc.onicecandidate = noop;
}
};
WebRTCはブラウザ同士でP2Pの通信ができる仕組みなのだけど、お互いにやり取りするときに、自分のIPなどを含む情報(Session Description Protocol[SDP])をやり取りする。
candidate:0 1 udp 2122260223 192.168.xxx.xxx 64980 typ host generation 0
この情報から自分のIPアドレス情報を抜き出す事でPrivateIPアドレスの取得を実現しているようだ。
下記の記事が参考になった。
現在、Chromeだとipアドレスが取得出来なくなっていた。ice.candidate
の出力内容にChromeとFirefoxの場合で違いがあるようだ。localhostとインターネット越しにつなぐ場合も結果が違うようだ。
mDNS を利用したWebRTC のローカル IP 隠蔽機能
によるとChromeや、Safariだと、IPアドレスではなく、UUID.local形式になるようだ。