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

Posted

技术标签:

【中文标题】如何使用 JavaScript 查询 STUN 服务器以获取公共 IP 和端口?【英文标题】:How to query a STUN server with JavaScript to get public IP and Port? 【发布时间】:2013-06-09 17:00:19 【问题描述】:

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

http://www.stunserver.org

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

function getMyIPAndPort() 
//query stun server for it

谢谢

【问题讨论】:

12 次浏览但没有答案..... Chuck Norris 请帮忙!!! :( 您说的是服务器端 nodejs 应用程序还是在 Web 浏览器中运行的 javascript? 哦,来吧。应该有答案。 【参考方案1】:

你可以同时获取本地和外部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

STUN 服务器用于外部 IP。 确保您没有使用任何阻止访问 stun:stun.l.google.com:19302 的代理或使用不同的 STUN 服务器

【讨论】:

【参考方案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];

他们似乎删除了端口。我不确定,但你可以用它来找出答案。

【讨论】:

【参考方案3】:

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

问候,

【讨论】:

以上是关于如何使用 JavaScript 查询 STUN 服务器以获取公共 IP 和端口?的主要内容,如果未能解决你的问题,请参考以下文章

如何自托管不依赖 WebRTC STUN 服务器 stun.l.google.com:19302?

如何使用 java 创建我自己的 STUN 或 TURN 服务器

如何设置 Node/Express 作为 STUN 服务器? [关闭]

如何使用 Stun 和 ice4j 接收公共 IP 和端口

如何使用 AWS EC2 创建 stun turn 服务器实例

如何在我的树莓派上使用 STUN/ICE 实现 NAT 遍历