IPTables - 僅當目標未偵聽時才進行 DNAT

IPTables - 僅當目標未偵聽時才進行 DNAT

我有介面 eth0 (網際網路存取)和 tap_vpn0 (vpn tap 接口,網路為 192.168.110.0/24)。我想要的是,透過 eth0 到 192.168.110.2 的所有傳入連線進行 DNAT,但前提是伺服器本身沒有偵聽服務(主要是 VPN 伺服器本身,但基本上出現在 中的任何其他服務,netstat -plunt包括實際的SSH) )。

現在我正在做的是 iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 22 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 443 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 5555 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 992 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 1194 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 4500 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 500 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 1194 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 1701 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 54700 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 63486 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 68 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p gre -j ACCEPT iptables -t nat -A PREROUTING -i eth0 -j DNAT --to-destination 192.168.110.2

寫出一長串靜態異常。但是,如果封包要在本機成功處理,是否有辦法告訴 IPTables 在實際主機上的連接埠未關閉的情況下不進行 DNAT?因此,如果例如我稍後在伺服器上打開了一個隨機連接埠 9988,我不需要添加另一個異常,例如iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 9988 -j ACCEPT但它不會被 DNAT 編輯?

答案1

看來確實iptables -t nat -I PREROUTING 1 -i eth0 -m socket --nowildcard -j ACCEPT有竅門。-m socket透過描述確實可以做到這一點 - 如果該資料包有任何接受套接字,則匹配。訣竅是使用--nowildcard我之前省略的選項 - 即使它的手冊頁上寫著“默認情況下,套接字匹配不會接受零綁定偵聽器,因為那時本地服務可以攔截本來會轉發的流量。” - 這實際上正是我所需要的 - 本地服務攔截(如果有可用的)!

由此產生的規則是: iptables -t nat -I PREROUTING 1 -i eth0 -m socket --nowildcard -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 22 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p gre -j ACCEPT iptables -t nat -A PREROUTING -i eth0 -j DNAT --to-destination 192.168.110.2

我保留了端口 22 (ssh),以防萬一它無法按預期工作 - 但從測試看來,它工作得很好!

相關內容