【发布时间】:2021-01-20 22:08:01
【问题描述】:
当尝试使用公共 STUN 服务器查找我的公共 IP 地址时,它适用于 IPv4,但不适用于 IPv6,无论我使用什么 STUN 服务器。
我只在 Candidate.address 下得到“59aeb370-1d93-44ee-a526-27d639256cf4.local”之类的东西。 有什么方法可以使用 STUN 通过 javascript 获取公共 IPv6?
我使用的代码是:
(不要介意 IPv4 正则表达式;无论如何,整个“候选人”都会记录在控制台中)
var ip_dups = {};
function getRTCPeerConnection () {
var iframe, content_window, rtc_peer_con = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection || window.msRTCPeerConnection;
return rtc_peer_con || (iframe = document.createElement("iframe"), iframe.style.display = "none", document.body.appendChild(iframe), content_window = iframe.contentWindow, rtc_peer_con = content_window.RTCPeerConnection || content_window.mozRTCPeerConnection || content_window.webkitRTCPeerConnection || content_window.msRTCPeerConnection), rtc_peer_con
};
var n = getRTCPeerConnection();
servers = {
iceServers: [{
urls: "stun:stun.l.google.com:19302"
}]
};
mediaConstraints = {
optional: [{
RTCPChannel: true
}]
};
pc = new n(servers, mediaConstraints);
function handleCandidate(candidate){
console.log(candidate);
//match just the IP address
var ip_regex = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/
var ip_addr = ip_regex.exec(candidate)[1];
if(ip_dups[ip_addr] === undefined) {
console.log(ip_addr);
ip_dups[ip_addr] = true;
}
pc.close()
}
pc.onicecandidate = function(ice){
//skip non-candidate events
console.log(ice)
if(ice.candidate) {
handleCandidate(ice.candidate.candidate);
}
};
pc.createDataChannel("");
void pc.createOffer(function(e) {
console.log(e)
console.log(e.sdp)
pc.setLocalDescription(e, function() {}, function() {})
}, function() {})
编辑:
似乎在某些情况下,在某些网页的控制台内运行代码时,我确实在响应中获得了 IPv6。
但是,例如,当从 chrome incognito 访问同一页面时,它不起作用,所以这不是因为域或类似的东西。
也不涉及任何权限。
那么到底发生了什么?其背后的逻辑是什么?有什么办法可以让我的网页始终让访问者收到他们的 IPv6 地址?
【问题讨论】:
-
IPv6 不需要 STUN(NAT 的会话遍历实用程序),因为您不使用 IPv6 的 NAT。主机获得全局 IPv6 地址,因此所有地址都是公共地址。
-
感谢您的回复!我就是这么想的。但是 IPv6 似乎是对“地址”的有效响应:developer.mozilla.org/en-US/docs/Web/API/RTCIceCandidateStats/… javascript API 有什么改变吗?因为它曾经被接收(至少在某些情况下?)stackoverflow.com/questions/48069862/stun-ip-address-javascript
-
@RefFil 我在下面回答。如果这解决了您的问题,请检查答案标记。
-
@RefFil 这不是返回 IPv6 地址,您要研究 the difference between IPv4 and IPv6。请进一步研究并编辑您的帖子。
-
但是,我编辑了我的帖子并给了你答案。
标签: javascript webrtc ipv6 stun