![iptables:如何「覆蓋」連接埠重新導向?](https://rvso.com/image/1452245/iptables%EF%BC%9A%E5%A6%82%E4%BD%95%E3%80%8C%E8%A6%86%E8%93%8B%E3%80%8D%E9%80%A3%E6%8E%A5%E5%9F%A0%E9%87%8D%E6%96%B0%E5%B0%8E%E5%90%91%EF%BC%9F.png)
我的設定如下:
我有一個帶有兩個介面的 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 集 ( ),然後在您的DNAT
和SNAT
規則中新增反向比對:
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。