【問題】抓瀏覽網頁的IP



贊助商連結


blankgenius
2007-05-31, 10:19 AM
各位大大好
小弟自己用LINUX MANDRAKE 9.2 AND WEB SERVER
然後我用一台主機架NAT伺服器用2張網路卡
eth0 對內
eht1 對外
問題是我要在WEB SERVER上面要抓CLIENT的IP時老是抓到192.168.1.1
我用 APACHE + PHP

我的iptables 的設定是
-iptables -t -nat -A PREROUTING -p -tcp -d 外部IP --dport 80 -j DNAT --to-destination 網頁伺服器IP:80
-iptables -t -nat -A POSTROUTING -d 網頁伺服器IP -p -tcp --dport 80 -j SNAT --to 192.168.1.1

我有試過把 192.168.1.1 改成 防火牆外部 IP
改完之後 網頁的IP變成抓到防火牆的

請問要如何在這個環境抓到對方的IP

贊助商連結


阿 土
2007-05-31, 11:34 AM
可試看看改變 php 偵測 IP 語法



if ($_SERVER["HTTP_X_FORWARDED_FOR"]) {
if ($_SERVER["HTTP_CLIENT_IP"]) {
$proxy = $_SERVER["HTTP_CLIENT_IP"];
} else {
$proxy = $_SERVER["REMOTE_ADDR"];
}
$ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
} else {
if ($_SERVER["HTTP_CLIENT_IP"]) {
$ip = $_SERVER["HTTP_CLIENT_IP"];
} else {
$ip = $_SERVER["REMOTE_ADDR"];
}
}
echo "Your IP $ip";
if (isset($proxy)) {
echo "Your proxy IP is $proxy";
}

Another php 語法


$iipp=$_SERVER["REMOTE_ADDR"];
echo $iipp;
?>

///////////////////////////////////////////////

$user_IP = ($_SERVER["HTTP_VIA"]) ? $_SERVER["HTTP_X_FORWARDED_FOR"] : $_SERVER["REMOTE_ADDR"];
$user_IP = ($user_IP) ? $user_IP : $_SERVER["REMOTE_ADDR"];

echo $user_IP;
?>

///////////////////////////////////////////////

function get_real_ip(){
$ip=false;
if(!empty($_SERVER["HTTP_CLIENT_IP"])){
$ip = $_SERVER["HTTP_CLIENT_IP"];
}
if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ips = explode (", ", $_SERVER['HTTP_X_FORWARDED_FOR']);
if ($ip) { array_unshift($ips, $ip); $ip = FALSE; }
for ($i = 0; $i < count($ips); $i++) {
if (!eregi ("^(10|172\.16|192\.168)\.", $ips[$i])) {
$ip = $ips[$i];
break;
}
}
}
return ($ip ? $ip : $_SERVER['REMOTE_ADDR']);
}

echo get_real_ip();
?>

///////////////////////////////////////////////

//php獲取ip的算法
if ($HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"])
{
$ip = $HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"];
}
elseif ($HTTP_SERVER_VARS["HTTP_CLIENT_IP"])
{
$ip = $HTTP_SERVER_VARS["HTTP_CLIENT_IP"];
}
elseif ($HTTP_SERVER_VARS["REMOTE_ADDR"])
{
$ip = $HTTP_SERVER_VARS["REMOTE_ADDR"];
}
elseif (getenv("HTTP_X_FORWARDED_FOR"))
{
$ip = getenv("HTTP_X_FORWARDED_FOR");
}
elseif (getenv("HTTP_CLIENT_IP"))
{
$ip = getenv("HTTP_CLIENT_IP");
}
elseif (getenv("REMOTE_ADDR"))
{
$ip = getenv("REMOTE_ADDR");
}
else
{
$ip = "Unknown";
}
echo "你的IP:".$ip ;
?>

///////////////////////////////////////////////

if(getenv('HTTP_CLIENT_IP')) {
$onlineip = getenv('HTTP_CLIENT_IP');
} elseif(getenv('HTTP_X_FORWARDED_FOR')) {
$onlineip = getenv('HTTP_X_FORWARDED_FOR');
} elseif(getenv('REMOTE_ADDR')) {
$onlineip = getenv('REMOTE_ADDR');
} else {
$onlineip = $HTTP_SERVER_VARS['REMOTE_ADDR'];
}
echo $onlineip;
?>

CrownJJ
2007-05-31, 02:50 PM
這裏先假設你的NAT的內部ip為 192.168.1.1
因為你設了二條類似的 iptables rule,而在第二條中作了 SNAT
意即把送往網頁伺服器的封包中,將 source ip 都改成了 192.168.1.1
所以 apache 或 php 怎麼抓都會是 192.168.1.1

改一下看看:
● 確定你的 nat 設定正確(打開了 ip_forward、有加上 MASQUERADE)
即nat內部的電腦可透過 nat 連上網路
● 拿掉你的第二條 iptables rule

然後再從外部 client 連進 web,再看看 apache 抓到的 client ip 是否正確?

blankgenius
2007-05-31, 05:24 PM
這裏先假設你的NAT的內部ip為 192.168.1.1
因為你設了二條類似的 iptables rule,而在第二條中作了 SNAT
意即把送往網頁伺服器的封包中,將 source ip 都改成了 192.168.1.1
所以 apache 或 php 怎麼抓都會是 192.168.1.1

改一下看看:
● 確定你的 nat 設定正確(打開了 ip_forward、有加上 MASQUERADE)
即nat內部的電腦可透過 nat 連上網路
● 拿掉你的第二條 iptables rule

然後再從外部 client 連進 web,再看看 apache 抓到的 client ip 是否正確?

#########
您第一種的方法我已經確認是正常的 MASQUERADE 跟 IPFORWARD一定要開的 內部才能上網:)
然後第2種方法如果把 iptables 的第二個拿掉 WEB server會連不上 因為外面連進來了但是風包送不出去 所以WEB伺服器無法開啟網頁

謝謝各位大大的回答 我繼續努力 如果有人有這個經驗麻煩在分享哦 感恩

chiahsin.liu
2007-06-02, 10:02 PM
的確是iptables的問題~
第二條規則就是把人家的IP都改成192.168.1.1
所以第二條規則的確是要除去的
然後你要確定你的web server的default route
方便的話show一下吧

blankgenius
2007-06-04, 10:35 AM
這是我防火牆的 route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.1.0 * 255.255.255.0 U 0 0 0 eth0
XX.248.XX.0 * 255.255.255.0 U 0 0 0 eth1
127.0.0.0 * 255.0.0.0 U 0 0 0 lo
default XX.248.XX.254 0.0.0.0 UG 0 0 0 eth1
^^^^^^^^^Hinet 的固定IP gateway

我的 web_server default gateway 是 192.168.1.1