WebRTC 获取 IP 不一致

WebRTC get IP inconsistencies

我的朋友最近完成了一个我听说了一段时间的项目,我想测试一下。可以找到源代码here。我首先尝试将代码包含在我脑海中的 <script> 标记中,但他说 jsdelivr 尚未更新他们的数据库。 但是,他告诉我/dist文件夹是代码,所以我复制production.min.js并粘贴到JSFiddle中进行测试。

现在,我得到的结果非常不一致。例如,在 fiddle 中它没有 return 任何东西,但是当我查看控制台时,我看到了这个图像:

公开我的 3 个 IP,我的本地 IPv6,临时 IPv6 和我的 IPv4,只是复制的,它完成了一项令人难以置信的工作。然而,它在一个集合中,而且,我得到一个错误: No IP addresses found 当 Private 或 Public 的 returned 数组时,它(在查看源代码时)似乎被抛出空。

现在,我再次联系了我的朋友,他向我展示了位于 here 的工作 fiddle。但是,当我在这里测试时,它不起作用:

function getPrivateIPs(timer) {
    return new Promise((resolve, reject)=>{
        var ipArray = [];
        var emptyConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;
        var pc = new emptyConnection();
        var emptyFunc = function(){};
        var ipList = {};
        var simpleIPRegex = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/g;

        function start(){
            pc.createDataChannel("");
                pc.onicecandidate = handleCandidates;
            createConnection();
            startTimer();
        };

        function push(ip) {
            if (!ipList[ip]) ipArray.push(ip);
            ipList[ip] = true;
        };
        
        function createConnection(){
            pc.createOffer(function(data) {
                data.sdp.split('\n').forEach(function(line) {
                    if (line.indexOf('candidate') === -1) return;
                    line.match(simpleIPRegex).forEach(push);
                });
    
                pc.setLocalDescription(data);
            }, emptyFunc);
        };

        function handleCandidates(ice) {
            if (!ice || !ice.candidate || !ice.candidate.candidate || !ice.candidate.candidate.match(simpleIPRegex)) return;
            ice.candidate.candidate.match(simpleIPRegex).forEach(push);
        };

        function startTimer(){
            setTimeout(()=>{
                if(ipArray && ipArray.length){
                    resolve(ipArray);
                    stop();
                } else{
                    reject('No IPs found.');
                    stop();
                };
            }, timer || 500);
        }

        function stop(){
            if (pc) {
                try {
                    pc.close();
                } finally {
                    pc.onicecandidate = () => {};
                    pc = null;
                };
            };
        };
        
        return start();
    })
}

getPrivateIPs(200).then(console.log)

此外,将代码片段粘贴到各个网站的开发者控制台似乎会产生不同的结果。例如,空白 Google 选项卡 100% 的时间对我来说 returned 我的 IP,而 Whosebug return 和其他网站一样 Github 也是错误。

是什么导致了这些不一致?似乎有些站点混淆了 IP,而其他站点则没有(我得到的 IP 像 a15b7927-5ef6-4f58-9748-1e40aec155b4.local、mDNS IP)。这很常见吗?谢谢!

这与@SeanDuBois 在评论中所说的有关。 WebRTC 数据通道现在使用 mDNS IP 而不是您的私有 IP,正如 Phillip Hanke 所说 here,您可以对这些 IP 进行去混淆处理,但永远无法在浏览器中进行。