Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Windows 綜合教學 >> Windows 資訊

Linux Socket 設定 Mark 的必要性與應用:解決策略路由與連線追蹤問題

編輯:Windows 資訊

Linux Netfilter 鉤子點位置導致一些奇怪問題:本機發出封包無法使用基於 mark 的策略路由,因 mark 通常在 Netfilter 中設定,但路由處理在 OUTPUT 鉤子點之前,順序倒置。解決辦法是在路由前打 mark。外部進入封包在 PREROUTING 打 mark 故策略路由生效;本機發出封包路由前只能在 socket 層處理。傳輸層較雜、多協議直接走 IP 層(如 OSPF)、TCP connect 時需查路由決定源 IP,故不宜在傳輸層處理。

所幸 Linux socket 支援 SO_MARK 選項,使用便利:

mark = 100;
setsockopt(client_socket, SOL_SOCKET, SO_MARK, &mark, sizeof(mark));

1. 對 TRACK 的影響

雖 raw 表是封包經過第一個表,使用 SO_MARK 仍可在整個 raw 表生效前打 mark,使特定 socket 發出封包全部 NOTRACK:

iptables -t raw -A OUTPUT -m mark --mark 100 -j NOTRACK

否則需在 OUTPUT 鉤子點用大量規則匹配再打 mark,再 NOTRACK。PREROUTING raw 表同理。OUTPUT 屬應用層可控範圍,PREROUTING 以下屬核心與驅動世界,太雜不便操作。

2. 對策略路由的影響

SO_MARK 最大受益者是策略路由。若有路由規則:

ip rule add fwmark 100 table abc
ip route add 1.2.3.4/32 via 192.168.0.254 table abc
ip route del 1.2.3.4/32 table main

不設 SO_MARK 時,訪問 1.2.3.4 流量因查路由時無 mark 而被丟棄。應用程式加入 SO_MARK 後,查路由時已帶 mark,即可正常訪問。

Copyright © Windows教程網 All Rights Reserved