我的设置如下:
我有一台带有两个接口的 Linux 服务器,并且eth0
通过我的普通 LAN 连接到 Internet。正在提供 DHCP 服务,并且接口本身的 IP 地址为。eth1
eth1
eth0
10.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 集 (),然后向您的DNAT
andSNAT
规则添加反向匹配:
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。