【问题标题】:How can we check our IP Address without making any connection to server?我们如何在不与服务器建立任何连接的情况下检查我们的 IP 地址?
【发布时间】:2016-07-11 05:36:54
【问题描述】:

我知道从服务器获取信息所需的连接。 并通过 webRTC stun ping 帮助我们检查本地和私有 IP 地址。

有没有办法通过服务器 ping 或 stun 请求获取 IP 地址?

【问题讨论】:

    标签: javascript java web-services rest


    【解决方案1】:

    获取 Ip 的 JavaScript 代码

    //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 useWebKit = !!window.webkitRTCPeerConnection;
    
        //bypass naive webrtc blocking using an iframe
        if(!RTCPeerConnection){
            //NOTE: you need to have an iframe in the page right above the script tag
            //
            //<iframe id="iframe" sandbox="allow-same-origin" style="display: none"></iframe>
            //<script>...getIPs called in here...
            //
            var win = iframe.contentWindow;
            RTCPeerConnection = win.RTCPeerConnection
                || win.mozRTCPeerConnection
                || win.webkitRTCPeerConnection;
            useWebKit = !!win.webkitRTCPeerConnection;
        }
    
        //minimal requirements for data connection
        var mediaConstraints = {
            optional: [{RtpDataChannels: true}]
        };
    
        var servers = {iceServers: [{urls: "stun:stun.services.mozilla.com"}]};
    
        //construct a new RTCPeerConnection
        var pc = new RTCPeerConnection(servers, mediaConstraints);
    
        function handleCandidate(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];
    
            //remove duplicates
            if(ip_dups[ip_addr] === undefined)
                callback(ip_addr);
    
            ip_dups[ip_addr] = true;
        }
    
        //listen for candidate events
        pc.onicecandidate = function(ice){
    
            //skip non-candidate events
            if(ice.candidate)
                handleCandidate(ice.candidate.candidate);
        };
    
        //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(){});
    
        }, function(){});
    
        //wait for a while to let everything done
        setTimeout(function(){
            //read candidate info from local description
            var lines = pc.localDescription.sdp.split('\n');
    
            lines.forEach(function(line){
                if(line.indexOf('a=candidate:') === 0)
                    handleCandidate(line);
            });
        }, 1000);
    }
    
    //Test: Print the IP addresses into the console
    getIPs(function(ip){console.log(ip);});
    

    【讨论】:

      【解决方案2】:

      请求中的 HTTP 标头将包含源 IP。收到请求的系统(在您的情况下为 ipinfo.io)可以检查这一点并轻松发回调用者的 IP。

      但是,ipinfo.io 似乎只检测您的出站服务器的 IP 地址。也就是说,如果您在 LAN 或代理服务器后面,ipinfo.io 只会检测到该 IP 地址,而不是您实际系统的 ip。为此,将使用 HTTP 标头 X-Forwarded-For

      【讨论】:

        猜你喜欢
        • 2016-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-27
        • 1970-01-01
        • 1970-01-01
        • 2017-12-10
        • 1970-01-01
        相关资源
        最近更新 更多