iptables:如何「覆蓋」連接埠重新導向?

iptables:如何「覆蓋」連接埠重新導向?

我的設定如下:

我有一個帶有兩個介面的 Linux 伺服器,eth0並且eth1.eth1透過我的普通 LAN 連接網路。eth0正在為 DHCP 提供服務,且介面本身的 IP 位址為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 集 ( ),然後在您的DNATSNAT規則中新增反向比對:

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。

相關內容