Edited at

Javascriptで自分のPrivate IPアドレスを取得

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とインターネット越しにつなぐ場合も結果が違うようだ。