![NAT后保留源IP](https://linux22.com/image/601371/NAT%E5%90%8E%E4%BF%9D%E7%95%99%E6%BA%90IP%20.png)
直到今天,我都使用廉价路由器,这样我就可以共享我的互联网连接,同时使用 NAT 保持网络服务器在线。用户 IP ($_SERVER['REMOTE_ADDR']) 很好,我看到的是用户的 A 类 IP。
但随着流量每天都在增长,我不得不安装 Linux 服务器 (Debian) 来共享我的 Internet 连接,因为我的旧路由器无法再承载流量。我使用 NAT 通过 IPTABLES 共享互联网,但现在,在将端口 80 转发到我的 Web 服务器后,我现在看到的不是真正的用户 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。出于安全原因,我隐藏了它。
答案1
解决了我自己的难题,但还是要感谢那些迄今为止提供帮助的人。进一步研究了 iptables 手册页,并找到了一个似乎符合我期望的解决方案:
替换包含化装舞会 (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
答案2
如果您使用了伪装规则 ( -j MASQUERADE
),则这是正常行为。我认为您使用的是“目标网络地址转换”( -j DNAT
),例如:
/sbin/iptables -t nat -A PREROUTING -p tcp -d {$PUBLICADDRESS} --dport 80 -j DNAT --to {$WEBSERVER}:80
当然,以上方法可能有效,也可能无效,具体取决于您的其他规则。您应该至少使用当前与 Web 服务器相关的规则来更新您的问题。