I know question but didn't find real answer on stackoverflow. This is not X_FORWARDED_FOR, SERVER_NAME or SERVER_REMOTE_ADDR, I want get local IP address of remote client connected to my server to detect who is really on local remote network is connected.
Explain this:
ISP <----> ROUTER <----> LOCAL NETWORK <----> LOCAL PC
What I want to know?
- Public IP address of connected remote client
$_SERVER["REMOTE_ADDR"], okay, but!... - Local IP address of connected client on public network (192.168.x.x, 10.x.x.x, 172.x.x.x)
How to solve this problem? I have answer, so I think this should be know for everyone if want to know local IP address:
You should use CURL and curl_getinfo() function. Then, point URL address anyone that you want (your main server ip or whatever), for example:
<?php
$ch = curl_init();
$opt = curl_setopt($ch, CURLOPT_URL, "YOUR_SOME_URL_ADDRESS");
curl_exec($ch);
$response = curl_getinfo($ch);
$result = array('client_public_address' => $response["primary_ip"],
'client_local_address' => $response["local_ip"]
);
var_dump($result);
curl_close($ch);
?>
Focus on $response["primary_ip"] which responses your Public address and $response["local_ip"] which reponses local address. Now this is example:
ISP <----> ROUTER <----> LOCAL NETWORK <----> LOCAL PC
/\ /\
|| ||
\/ \/
$response["primary_ip"] <----> $response["local_ip"]
213.x.x.x (for example) 192.168.1.3 (for example)
Result:
array (size=2)
'client_public_address' => string '213.xxx.xxx.xxx' (length=14)
'client_local_address' => string '192.168.1.3' (length=11)
This will NOT be giving a REAL local IP address!
Thank you.
4 Answers
This will never get to work.
First, you need an HTTP server on a client to make it response to CURL.
Even if ther would be - it is not guarantted to return whatever "local IP".
Next, an HTTP server which pings it's clients back looks suspicious and most likely gets banned.
Anyway, I tried your code on a remote IP:
array(2) {
["client_public_address"]=>
string(7) "8.8.8.8"
["client_local_address"]=>
string(0) ""
}
it returned nothing
While when I tried my local router it works okay
array(2) {
["client_public_address"]=>
string(13) "XXX"
["client_local_address"]=>
string(12) "192.168.1.37"
}
It works only for your own local router, but it cannot get whatever local address from a remote system.
Frankly, it shows you just local IP address assigned to your PC.
The local IP addressed is not exposed to the application layer by default. You need lower level tools that can extract this information from the network packets.
You can use HTML5 features (CORS and WebSocket) for determining the range () see this live example:
How its work? You can scan range of IP addresses (192.168.1.0/24, 192.168.0.1/24, etc) and find the range that used by user, however, finding exact IP address is still difficult.
Result: Doesn't work. IP is 192.168.1.200 returns 192.168.1.2; site invalid, tools don't really work.
function getRealIpAddr(){
//check ip from share internet
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
$ip=$_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
//to check ip is pass from proxy
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$ip=$_SERVER['REMOTE_ADDR'];
}
return $ip;
}