我有一个带有两个接口的 Ubuntu 服务器:enp1s0
和ham0
(私有网络)。在接口中,ham0
我的 IP 地址是 25.70.228.164。此网络中的另一台机器的 IP 地址为 25.11.1.253。我尝试设置以下 iptables 规则:
iptables -F
iptables -t nat -F
iptables -X
iptables -t nat -A PREROUTING -p tcp --dport 9000:9005 -j DNAT --to-destination 25.11.1.253
iptables -t nat -A POSTROUTING -p tcp -d 25.11.1.253 --dport 9000:9005 -j SNAT --to-source 25.70.228.164
一切运行正常,但第二台机器 (25.11.1.253) 看不到传入数据包的真实 IP 地址。它看到的是第一台机器 (25.70.228.164) 的 IP 地址。
我听说可以通过设置默认网关来保存源 IP,但我不明白该怎么做。
使用 iptables 是否可行?我该怎么做?
答案1
可以使用iptables来保存源IP,这种行为其实是更正常的端口转发方法。
删除此行:
iptables -t nat -A POSTROUTING -p tcp -d 25.11.1.253 --dport 9000:9005 -j SNAT --to-source 25.70.228.164
更改此行:
iptables -t nat -A PREROUTING -p tcp --dport 9000:9005 -j DNAT --to-destination 25.11.1.253
对此:
iptables -t nat -A PREROUTING -p tcp -i enp1s0 --dport 9000:9005 -j DNAT --to-destination 25.11.1.253
如果 IP 地址enp1s0
已知且为静态 ($EXTIP),请添加以下行:
iptables -t nat -A POSTROUTING -o enp1s0 -j SNAT --to $EXTIP
如果 IP 地址enp1s0
未知(可能是动态的),请添加以下行:
iptables -t nat -A POSTROUTING -o enp1s0 -j MASQUERADE
此答案假设 FORWARD 链的默认策略为 ACCEPT。默认策略 DROP 可能更安全,这将需要以下附加规则(未经测试):
iptables -P FORWARD DROP
iptables -A FORWARD -i ham0 -o enp1s0 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i enp1s0 -o ham0 -p tcp --dport 9000:9005 -d 25.11.1.253 -j ACCEPT
您还需要启用转发(我认为您已经这样做了,但为了完整性):
echo "1" > /proc/sys/net/ipv4/ip_forward