NAT後保留源IP
直到今天,我都在使用便宜的路由器,這樣我就可以在使用 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 伺服器相關的規則來更新您的問題。