我正在构建一个php解决方案,这需要我准确地知道请求者的ip。对于大多数情况,经典调用
$ip = $_SERVER['REMOTE_HOST'];
工作得很好。
但是,我已经注意到,在客户通过系留连接发出请求的情况下,我得到的地址与Google和我的防火墙报告完全不同。
我可以通过在google上搜索"my ip"来验证客户端(系留)端的这一点,这样我就可以获得与我的服务器防火墙报告的IP相匹配的IP。这些都不符合$_SERVER['REMOTE_HOST']
在服务器端包含的内容。
我的问题是:
答案 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);});