為什麼應用於 FORWARD 或 OUTPUT 鏈的 iptables 標記上的策略路由會不一致?

為什麼應用於 FORWARD 或 OUTPUT 鏈的 iptables 標記上的策略路由會不一致?

iptables我使用標記和規則在 SSH 隧道 (-w) 上路由 HTTPS 連接iproute2,至少可以說,我需要這樣做的原因是人為的,所以大多數替代解決方案可能根本不適合我。

tun0 設備存在並且正在按照我的意願工作,並且當我在 OUTPUT 鏈中應用 MARK 時路由正在工作,但由於某種原因,如果在 FORWARD 鏈中應用 MARK,則路由規則似乎不起作用。

作業系統是 CentOS 6.7,核心為 2.6.32,iptables 為 1.4.7。標記iptables和記錄:

# iptables -t mangle -A FORWARD -p tcp --dport 443 -j MARK --set-mark 1 
# iptables -t mangle -A OUTPUT -p tcp --dport 443 -j MARK --set-mark 1 
# iptables -t mangle -A POSTROUTING -m mark --mark 1 -j LOG --log-prefix "marked: "

規則iproute2設定:

# cat 201 tunneled >> /etc/iproute2/rt_tables
# ip rule add fwmark 1 table tunneled
# ip route add default via 192.168.100.1 dev tun1 table tunneled

日誌中的一小部分顯示結果:

Feb 17 19:11:35 nhopm kernel: marked: IN= OUT=eth0 SRC=192.168.82.2 DST=69.30.217.90 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=16734 DF PROTO=TCP SPT=34619 DPT=443 WINDOW=29200 RES=0x00 SYN URGP=0 MARK=0x1 
Feb 17 19:12:00 nhopm kernel: marked: IN= OUT=tun1 SRC=192.168.81.8 DST=69.30.217.90 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=62747 DF PROTO=TCP SPT=55349 DPT=443 WINDOW=14600 RES=0x00 SYN URGP=0 MARK=0x1 

主機有 2 個 NIC,eth0即 192.168.81.8,其中 192.168.81.1 是預設網關,eth1192.168.82.8 充當 192.168.82.0/24 的默​​認網關 - 此設定沒有問題,它按預期工作。隧道 tun0 的遠端有 192.168.100.1。

我試圖將其範圍縮小到最簡單的情況,以說明問題,但不會提供過多的細節,但會提供盡可能多的細節,以試圖找到問題所在,請在評論中詢問任何可能有幫助的內容。希望我只是誤解了它的工作原理的一小部分。

解決方法

我嘗試執行上述操作是基於以下iptables流程圖: 來自 iptables.info

這掩蓋了一個事實,即同一組路由決策不適用於來自 OUTPUT 鏈的資料包,就像來自 FORWARD 鏈的資料包一樣。

為了完成這項工作,我需要將 FORWARD 鏈中完成的標記替換為 PREROUTING 鏈中的類似條目。

iptables -t mangle -A PREROUTING -p tcp --dport 443 ! -d 192.168.0.0/16 -j MARK --set-mark 1

無論如何,這實際上更適合我的需求。

我還沒有將此作為答案,因為我還沒有找到這方面的文檔 - 如果我找到了,我將提供答案,除非有人比我先找到它。

相關內容