iptables - 保留源 IP 的端口转发

iptables - 保留源 IP 的端口转发

我有一个带有两个接口的 Ubuntu 服务器:enp1s0ham0(私有网络)。在接口中,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

相关内容