
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 是預設網關,eth1
192.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
無論如何,這實際上更適合我的需求。
我還沒有將此作為答案,因為我還沒有找到這方面的文檔 - 如果我找到了,我將提供答案,除非有人比我先找到它。