如何使用JavaScript查询STUN服务器以获取公共IP和端口?

时间:2013-06-13 10:32:36

标签: javascript html html5 nat stun

我正在尝试使用JavaScript查找一些代码示例来查询STUN服务器以获取我的公共IP和端口。也许在

使用服务器

http://www.stunserver.org

虽然这里解释了STUN规范http://www.ietf.org/rfc/rfc3489.txt(这是一篇很长的文档,显然我不希望你阅读它),但我一直找不到任何代码示例,这将使我的生活更轻松。像

这样的东西
function getMyIPAndPort() {
//query stun server for it
}

谢谢

3 个答案:

答案 0 :(得分:2)

很晚才回答。看看这个迷你项目:https://diafygi.github.io/webrtc-ips/

它确实为您提供了IP,但似乎没有给出端口。但是,如果你看一下这些行://match just the IP address var ip_regex = /([0-9]{1,3}(\.[0-9]{1,3}){3})/ var ip_addr = ip_regex.exec(candidate)[1];

似乎他们删除了端口。我不确定,但你可以用它来发现。

答案 1 :(得分:1)

我还检查了项目(https://diafygi.github.io/webrtc-ips),即使它是一个我不太喜欢的精彩剧本。我的意思是,原因是它假设哪些IP是公共的和私有的。如果IP不是10 / 8,172.16 / 12或192.168 / 16,则它是公共IPv4。这并非总是如此。您可以(不幸的是)在您的LAN中具有其他范围的IPv4地址并对其进行NAT。   这个想法是通过STUN服务器获取IP地址返回,而不是假设它。

此致

答案 2 :(得分:0)

您可以同时获取本地IP和外部IP

 function  determineIps() {
    const pc = new RTCPeerConnection({ iceServers: [ {urls: 'stun:stun.l.google.com:19302'} ] });
    pc.createDataChannel('');
    pc.createOffer().then(offer => pc.setLocalDescription(offer))
    pc.onicecandidate = (ice) => {
        if (!ice || !ice.candidate || !ice.candidate.candidate) {
          console.log("all done.");
          pc.close();   
          return;
        }
        let split = ice.candidate.candidate.split(" ");
        if (split[7] === "host") {
          console.log(`Local IP : ${split[4]}`);
        } else {
          console.log(`External IP : ${split[4]}`);
         }
    };
  }
determineIps();

例如https://jsbin.com/zosayiyidu/1/edit?js,console