我有一個路由器。它有幾個介面。其中之一是 VPN,稱為 vpn0,一個是到實體介面的預設路由,稱為 out0,還有一個輸入介面 in0。
來自 in0 且目標連接埠為 993 的封包永遠不會放置在 out0 上。我透過這樣標記資料包來做到這一點:
iptables -t mangle -A PREROUTING -i in0 -p tcp --dport 993 -j MASK --set-mark 100
iptables -t mangle -A PREROUTING -i in0 -p tcp --dport 993 -j CONNMARK --save-mark
要停用 out0 上的轉發,我執行以下操作:
iptables -A FORWARD -i in0 ! -o vpn0 --match-mark 100 -j DROP -m conntrack --ctstate NEW
我遇到的問題是來自主機的輸出資料包。要破壞 vpn0 的資料包,我有以下規則:
iptables -t mangle -A OUTPUT --protocol tcp --dport 993 --jump MARK --set-mark 100
iptables -t mangle -A OUTPUT --protocol tcp --dport 993 --jump CONNMARK --save-mark
iptables -t mangle -A OUTPUT --protocol tcp --dport 993 --jump RETURN
效果相當好。只有當 vpn0 不工作時才會發生。我嘗試新增規則:
iptables -A OUTPUT --protocol tcp --dport 993 -o out0 --match mark --mark 100 --jump DROP -m conntrack --ctstate NEW
但這會丟棄會流出 VPN 的封包。我透過將 DROP 更改為 LOG 來檢查這一點,並且輸出介面是 out0,而不是 vpn0。
是什麼賦予了?