首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当客户端被拴在小区上时,远程IP地址会发生变化。

当客户端被拴在小区上时,远程IP地址会发生变化。
EN

Stack Overflow用户
提问于 2014-11-20 16:40:09
回答 3查看 498关注 0票数 0

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

$ip = $_SERVER['REMOTE_HOST'];

效果很好。

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

我可以通过在谷歌上搜索“我的ip”来在客户端验证这一点,这给了我一个与我的服务器防火墙所报告的内容相匹配的IP。但是,这两种方法都不匹配$_SERVER['REMOTE_HOST']在服务器端包含的内容。

我的问题是:

  • 为什么这些地址在总体上是不同的?
  • 如何到达我的防火墙和google看到的ip地址,特别是使用php?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-01-28 17:51:11

事实上,这一直是使用javascript“特性”(我会把它称为漏洞)来完成的。可怕的东西,因为它也暴露了你的内部IP地址。不管怎么说,这是一个叫做WebRTC的东西,在火狐和chrome正式实现的这一周,它才开始引起人们的广泛关注:

代码语言: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 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/

票数 0
EN

Stack Overflow用户

发布于 2014-11-20 16:50:41

这取决于你的手机提供商。通常情况下,你的手机会从私人范围获得一个IP地址,并在连接“互联网”时获得NATed --就像大多数家庭网络一样。

不像家庭网络,供应商的网络可能有几个连接(网关)到互联网。所以你所做的每一个连接都可以通过一个不同的网关。因此,您可以在不同的电话中看到不同的地址。

在这些情况下(具有多个上行链路的网络),路由规则可能相当复杂。因此,例如,目标可能扮演一个角色-提供者可能在几个不同的地方(网络节点)窥视,并选择一个最近的目的地。因此,对于一个目的地,您可以有一致的源,但对于另一个目的地,可以有不同的源。

无论如何,您不能对这些地址做任何事情,因为提供程序不允许任何传入连接。

票数 1
EN

Stack Overflow用户

发布于 2014-11-20 16:43:27

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27044902

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档