iptables:如何“覆盖”端口重定向?

iptables:如何“覆盖”端口重定向?

我的设置如下:

我有一台带有两个接口的 Linux 服务器,并且eth0通过我的普通 LAN 连接到 Internet。正在提供 DHCP 服务,并且接口本身的 IP 地址为。eth1eth1eth010.0.0.1

我想要实现以下目标:

我希望将来自连接到的机器的端口 80 上的数据包eth0重定向到路由机器本身的端口 80,而响应数据包当然也会重定向回来。这本身很简单,但我还有一个要求。我希望具有eth0某些 IP 地址的客户端能够免受此限制,并像往常一样路由端口 80 数据包。我该怎么做?到目前为止,我已完成以下操作,将所有端口 80 数据包重定向到eth0本地机器。它正在工作,但我不知道如何实现我的第二个要求。

iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 10.0.0.1:80 -i eth0

iptables -t nat -A POSTROUTING -p tcp -d 127.0.0.1 --dport 80 -j SNAT --to-source 10.0.0.1

答案1

您需要PREROUTING在到达该DNAT行之前退出表格:

iptables -t nat -I PREROUTING -p tcp -s <exempt ip> -j RETURN

这应该插入(-I)一条新规则,以退出(-j RETURN)来自豁免 IP()的任何数据包的路由表-s <exempt ip>作为第一条规则,因此它在达到规则之前就被命中DNAT

(您可能还需要在 上做类似的事情POSTROUTING,不确定。)


另一个选项是man ipset针对您想要豁免的 IP 创建一个 IP 集 (),然后向您的DNATandSNAT规则添加反向匹配:

ipset create exempt hash:ip
ipset add exempt <exempt ip 1>
ipset add exempt <exempt ip 2>
ipset add exempt <exempt ip 3>
iptables -t nat -A PREROUTING -p tcp --dport 80 -m set ! --match-set exempt src -j DNAT --to-destination 10.0.0.1:80 -i eth0

这更容易管理,因为你可以轻松地从 ipset 中添加或删除豁免 IP,而无需修改 iptables。

相关内容