一些客户端在更新Chrome后无法获得其IP

时间:2019-06-26 10:25:31

标签: javascript google-chrome ip

  • 使用Chrome 75.0.3770.100 64位版本的客户端:有些可以提供有效的IP,有些则不能(有效或无效,请参见下面的示例)

我尝试过的是: (ps x是下面的数字) 1.无效的IP提供的客户端:卸载Chrome->更新至旧版本:71.0.3578.80 64bit (获得的有效IP例如1x2.1x.2.x1)

  1. 提供的IP地址无效的客户端:卸载Chrome->更新至较旧版本->更新至最新版本:75.0.3770.100 64位->重新启动计算机(无效,IP地址无效:候选人:7x3x0x8x0 1 udp 21x3x3x1x1x1 31xcxece-ax6f -x3f2-abx9-f1f4fb9x5x6x.local 4xx1x typ host generation 0 ufrag Bkiq network-cost 999)

代码:

    //compatibility for firefox and chrome
    var myPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;
    var pc = new myPeerConnection({
        iceServers: []
    }),
    noop = function() {},
    localIPs = {},
    ipRegex = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/g,
    key;

    function iterateIP(ip) {
        if (!localIPs[ip]) onNewIP(ip);
        localIPs[ip] = true;
    }

     //create a bogus data channel
    pc.createDataChannel("");

    // create offer and set local description
    pc.createOffer().then(function(sdp) {
        sdp.sdp.split('\n').forEach(function(line) {
            if (line.indexOf('candidate') < 0) return;
            line.match(ipRegex).forEach(iterateIP);
        });

        pc.setLocalDescription(sdp, noop, noop);
    }).catch(function(reason) {
        // An error occurred, so handle the failure to connect
    });

    //listen for candidate events
    pc.onicecandidate = function(ice) {
        return ice.candidate.candidate; // comment below, as it will return nothing as the ip does not match the ipRegex
        // if (!ice || !ice.candidate || !ice.candidate.candidate || !ice.candidate.candidate.match(ipRegex)) return;
        // ice.candidate.candidate.match(ipRegex).forEach(iterateIP);
    // };
}

// Usage

getUserIP(function(ip){
    alert("Got IP! :" + ip);
});

我希望甚至可以将最新版本的chrome(75.0.3770.100 64bit)更新为所有客户都可以提供有效的ip

3 个答案:

答案 0 :(得分:1)

iceServers配置中使用stun / turn服务器ips /域,而不是空的,例如{ "iceServers": [ { urls: 'stun:stun.l.google.com:19302' } ] }。当客户端位于不同的网络上时,必须使用电击/转弯服务器。

答案 1 :(得分:0)

我找到了一种解决方法,让用户ip在更新最新的chrome后可以发送回服务器:

  1. 用户转到chrome:// flags
  2. 搜索“匿名化WebRTC公开的本地IP。”使用mDNS主机名隐藏本地IP地址。 – Mac,Windows,Linux,Chrome操作系统
  3. 禁用它

答案 2 :(得分:0)

这不是错误,可以预料,因为将来您将无法以这种方式获取地址。

WebRTC主机候选者现在将使用随机的mDNS主机名进行匿名处理,以防止网站转移WebRTC来监听本地IPv4地址。该行为已逐渐为所有Chrome用户启用。它也在Firefox中实现。

以下是ChromiumFirefox的相应错误,以及WebRTC mDNS候选者的当前IETF draft