web-dev-qa-db-ja.com

JavaScriptを使用してローカル/内部IPを取得する方法

WebRTCを使用してローカルクライアントIPを取得するにはどうすればよいですか。

クライアントのREMOTE_ADDRは必要ありませんが、彼のローカルネットワークIPは必要です。これはsharedrop.comのようなWebサイトで以前に見たことがあり、WebRTCを使用して同じネットワーク内のコンピューターを認識します。

PHP私はクライアントにリモートIPを取得するためにこれを行います:

<?php
  echo $_SERVER["REMOTE_ADDR"]; // which would return 72.72.72.175
?>

私はstackoverflowを調べましたが、すべての質問はリモートアドレスを使用して回答されます。

リモートアドレスの代わりにJavaScriptを使用してローカルIP(たとえば192.168.1.24)を取得するにはどうすればよいですか。

11
Pascal Raszyk

ここからコードを取得しました-> ソース

デモは-> デモ にあります。

パブリックIPではなくローカルIPのみが必要なため、ソースコードを変更し、行を減らし、スタンリクエストを作成しませんでした。以下のコードは最新のFirefoxとChromeで機能します。

    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;
        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('my IP: ', myIP);   
        pc.onicecandidate = noop;
    };

ここで起こっていることは、ダミーのピア接続を作成していることです。リモートピアから連絡を受けるために、通常、氷の候補を相互に交換します。そして、氷の候補を読むと、ユーザーのIPを知ることができます。

23
mido

このバージョンは、最新のブラウザで使用できます(Promisesおよびasync / await

// minified onliner, 219b
const ip = await new Promise((s,f,c=new RTCPeerConnection(),k='candidate')=>(c.createDataChannel(''),c.createOffer(o=>c.setLocalDescription(o),f),c.onicecandidate=i=>i&&i[k]&&i[k][k]&&c.close(s(i[k][k].split(' ')[4]))))
// cleaned, 363b
const ip = await new Promise((resolve, reject) => {
  const conn = new RTCPeerConnection()
  conn.createDataChannel('')
  conn.createOffer(offer => conn.setLocalDescription(offer), reject)
  conn.onicecandidate = ice => {
    if (ice && ice.candidate && ice.candidate.candidate) {
      resolve(i.candidate.candidate.split(' ')[4])
      conn.close()
    }
  }
})
2
kigiri