Linux

NAT後保留源IP

  • November 26, 2012

直到今天,我都在使用便宜的路由器,這樣我就可以在使用 NAT 的同時共享我的網際網路連接並保持網路伺服器線上。使用者 IP ($_SERVER

$$ ‘REMOTE_ADDR’ $$) 很好,我看到了 A 類使用者的 IP。 但隨著流量每天都在增長,我不得不安裝一個 Linux 伺服器 (Debian) 來共享我的 Internet 連接,因為我的舊路由器無法再保持流量了。我使用 NAT 通過 IPTABLES 共享網際網路,但現在,在將埠 80 轉發到我的網路伺服器後,現在我看到的不是真實使用者 IP,而是我的網關 IP(Linux 內部 IP)作為任何使用者 IP 地址。

如何解決這個問題?


我編輯了我的文章,所以我可以粘貼我目前使用的規則。

#!/bin/sh
#I made a script to set the rules

#I flush everything here.
iptables --flush
iptables --table nat --flush
iptables --delete-chain
iptables --table nat --delete-chain
iptables -F
iptables -X


# I drop everything as a general rule, but this is disabled under testing
# iptables -P INPUT DROP
# iptables -P OUTPUT DROP


# these are the loopback rules
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# here I set the SSH port rules, so I can connect to my server
iptables -A INPUT -p tcp --sport 513:65535 --dport 22 -m state --state NEW,ESTABLISHED     -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 --dport 513:65535 -m state --state ESTABLISHED -j ACCEPT


# These are the forwards for 80 port
iptables -t nat -A PREROUTING -p tcp -s 0/0 -d xx.xx.xx.xx --dport 80 -j DNAT --to     192.168.42.3:80
iptables -t nat -A POSTROUTING -o eth0 -d xx.xx.xx.xx -j SNAT --to-source 192.168.42.3
iptables -A FORWARD -p tcp -s 192.168.42.3 --sport 80 -j ACCEPT

# These are the forwards for bind/dns
iptables -t nat -A PREROUTING -p udp -s 0/0 -d xx.xx.xx.xx --dport 53 -j DNAT --to 192.168.42.3:53
iptables -t nat -A POSTROUTING -o eth0 -d xx.xx.xx.xx -j SNAT --to-source 192.168.42.3
iptables -A FORWARD -p udp -s 192.168.42.3 --sport 53 -j ACCEPT


# And these are the rules so I can share my internet connection
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i eth0:1 -j ACCEPT

如果我刪除 MASQUERADE 部分,我會在使用 PHP 回顯它時看到我的真實 IP,但我沒有網際網路。怎麼辦,在轉發埠的同時擁有網際網路並查看我的真實 IP?

** xx.xx.xx.xx - 是我的公共 IP。出於安全原因,我把它藏起來了。

解決了我自己的謎團,但感謝那些幫助到現在的人。研究了更多 iptables 手冊頁,並得出了一個似乎可以按我希望工作的解決方案:

將包含MASQUERADE *(iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE)*的行替換為以下行:

iptables -t nat -A POSTROUTING -s 192.168.42.0/24 -o eth0 -j SNAT --to-source XX.XX.XX.XX

現在我可以看到我的真實 IP 地址並且也可以上網了。

*XX.XX.XX.XX = 公共 IP

如果您使用了偽裝規則 ( -j MASQUERADE),這是正常行為。我認為您使用的是“目標網路地址轉換”(-j DNAT),例如:

/sbin/iptables -t nat -A PREROUTING -p tcp -d {$PUBLICADDRESS} --dport 80 -j DNAT --to {$WEBSERVER}:80

當然,根據您的其他規則,上述方法可能有效,也可能無效。您應該至少使用您目前擁有的與 Web 伺服器相關的規則來更新您的問題。

引用自:https://serverfault.com/questions/452183