Firefox 跟 Chrome支持WebRTC可以向STUN服务器请求,返回内外网IP,不同于XMLHttpRequest请求,STUN请求开发者工具当中看不到网络请求的。

//get the IP addresses associated with an account
function getIPs(callback){
    var ip_dups = {};

    //compatibility for firefox and chrome
    var RTCPeerConnection = window.RTCPeerConnection
        || window.mozRTCPeerConnection
        || window.webkitRTCPeerConnection;
    var mediaConstraints = {
        optional: [{RtpDataChannels: true}]
    };

    //firefox already has a default stun server in about:config
    //    media.peerconnection.default_iceservers =
    //    [{"url": "stun:stun.services.mozilla.com"}]
    var servers = undefined;

    //add same stun server for chrome
    if(window.webkitRTCPeerConnection)
        servers = {iceServers: [{urls: "stun:stun.services.mozilla.com"}]};

    //construct a new RTCPeerConnection
    var pc = new RTCPeerConnection(servers, mediaConstraints);

    //listen for candidate events
    pc.onicecandidate = function(ice){

        //skip non-candidate events
        if(ice.candidate){

            //match just the IP address
            var ip_regex = /([0-9]{1,3}(\.[0-9]{1,3}){3})/
            var ip_addr = ip_regex.exec(ice.candidate.candidate)[1];

            //remove duplicates
            if(ip_dups[ip_addr] === undefined)
                callback(ip_addr);

            ip_dups[ip_addr] = true;
        }
    };

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

    //create an offer sdp
    pc.createOffer(function(result){

        //trigger the stun server request
        pc.setLocalDescription(result, function(){});

    }, function(){});
}

//Test: Print the IP addresses into the console
getIPs(function(ip){console.log(ip);});

本地测试了一下,挂上VPN的效果……

JS绕过代理、VPN获取真实IP及内网IP,Get local and public IP addresses in JavaScript

From: https://github.com/diafygi/webrtc-ips 

吐槽

ACGT | 2015-01-27 13:19

这不就是两年前的东西被重写了一遍吗 https://github.com/natevw/ipcalf/

而且要获取内网IP不需要stun server,iceServers留空就可以,也就是说客户端浏览器不能连接外网也没关系

留言评论(旧系统):

cccc @ 2015-01-29 11:59:21

openvpn、思科vpn、pptp,都能穿?

本站回复:

自己测试一下不就知道了么~

佚名 @ 2015-02-01 19:40:01

感觉文中和吐槽的还不是一个东西,试了一下,随便挂一个Socks代理,文中叙述的可以准确获取真实外网IP,吐槽里的就返回了代理的IP,技术还是有进步的。

本站回复:

嗯。

佚名 @ 2015-02-04 23:34:39

请在这里填写留言内容,最长不超过 1000 字。

本站回复:

[暂无回复]

echotxl @ 2015-02-04 23:35:47

使用ssl VPN测试无效,还是显示的是代理的iP

本站回复:

这个玩意儿仅供参考。