このサイト は、パブリックIPv6、パブリックIPv4、およびローカルIPアドレスを示しています。 1つ目と2つ目は明らかですが、ルーターがそのような慣行を防ぐために作られ、プライベートホームネットワークをグローバルパブリックネットワークから分離するために作られているため、WWWにあるWebサービスがローカルIPアドレスをどのように決定できるでしょうか。
だから私の質問は、インターネットにあるwebsericeが、コンピューターがローカルプライベートネットワーク内の他のユーザーと会話するために使用するローカルIPアドレスをどのように決定できるのかということです。
結局のところ、HTML5の最近のWebRTC拡張機能により、JavaScriptはローカルクライアントのIPアドレスを照会できます。概念実証はこちらから入手できます: http://net.ipcalf.com
この機能は明らかに仕様によるものであり、バグではありません。しかし、物議を醸している性質を考えると、私はこの振る舞いに依存することに慎重になるでしょう。それにもかかわらず、私はそれが完全かつ適切にあなたの意図した目的に対処していると思います(ブラウザがリークしているものをユーザーに明らかにします)。
Whatismyip.comのようなWebサービスは、JavaScriptを使用してローカルIPアドレスを決定します。以下は、上記の site から抽出されたコードです。
function checkLocal() {
window.RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection; //compatibility for firefox and chrome
var pc = new RTCPeerConnection({iceServers: []}), noop = function () {
};
pc.createDataChannel(""); //create a bogus data channel
pc.createOffer(pc.setLocalDescription.bind(pc), noop); // create offer and set local description
pc.onicecandidate = function (ice) { //listen for candidate events
if (!ice || !ice.candidate || !ice.candidate.candidate) return;
//reads out local 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];
jQuery(document).ready(function () {
jQuery("#local-ip").append("Your Local IP is: " + myIP);
jQuery("#local-ip").show("slow");
});
pc.onicecandidate = noop;
};
}
コードはPCにバインドしますが(PCは自己参照です)、インターフェースを使用すると、ソケットの詳細を読み取ることができ、ローカルエリアネットワークでコンピューターが認識されているローカルIPが含まれます。これは、ローカルIPアドレスを取得するための一般的な方法です。 JavaScriptで実行できるのは私にとっては初めてです。
RTCPeerConnection
js APIの詳細: https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection