当客户端通过单元格连接时,远程IP地址会有所不同

时间:2014-11-20 16:40:09

标签: php ip network-protocols cellular-network

我正在构建一个php解决方案,这需要我准确地知道请求者的ip。对于大多数情况,经典调用

$ip = $_SERVER['REMOTE_HOST'];

工作得很好。

但是,我已经注意到,在客户通过系留连接发出请求的情况下,我得到的地址与Google和我的防火墙报告完全不同。

我可以通过在google上搜索"my ip"来验证客户端(系留)端的这一点,这样我就可以获得与我的服务器防火墙报告的IP相匹配的IP。这些都不符合$_SERVER['REMOTE_HOST']在服务器端包含的内容。

我的问题是:

  • 为什么这些地址一般不同?
  • 如何获取我的防火墙和谷歌看到的IP地址,特别是使用php?

3 个答案:

答案 0 :(得分:1)

Thast取决于您的手机提供商。通常情况下,您的手机会从私人范围获取IP地址,并在与互联网建立连接时获得NAT服务 - 就像大多数家庭网络一样。

与家庭网络不同,提供商的网络可能具有多个到互联网的连接(网关)。因此,您所做的每个连接都可能通过不同的网关。因此,您会在不同的呼叫中看到不同的地址。

在这些情况下(具有多个上行链路的网络),路由规则可能非常复杂。因此,例如,目的地可能起作用 - 提供者可能在几个不同的地方(网络节点)对等并选择最接近目的地的那个。因此,您可以拥有关于一个目的地的一致来源,但是在另一个目的地上有不同的来源。

在任何情况下,您都无法对这些地址执行任何操作,因为提供商不允许任何传入连接。

答案 1 :(得分:0)

他们很可能正在使用您无法控制的代理服务器。如果是这种情况,底层客户端IP将不可见。

答案 2 :(得分:0)

嗯,结果发现这是使用javascript"功能" (我一直在考虑调用漏洞)。可怕的东西,因为它也暴露了你的内部IP地址。无论如何,这个名为WebRTC的东西本周开始受到很多关注,因为它已经被firefox和chrome正式实现了:

//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);});

来源:https://github.com/diafygi/webrtc-ips

演示:https://diafygi.github.io/webrtc-ips/