如何在 iptables 中一起添加標記(目標 MARK 和 CONNMARK)
當您想在 中標記數據包時
iptables
,通常會在防火牆腳本中添加以下行:iptables -t mangle -A POSTROUTING -p tcp -m multiport --dports 80,443 -j MARK --set-mark 2
我知道這個主題有點複雜,但讓我們只關注單一規則。當您添加與上述類似的內容時,
/proc/net/nf_conntrack
文件中的某些條目將設置標記:ipv4 2 tcp 6 3706 ESTABLISHED ... mark=2
該規則的問題在於,當您添加另一個匹配的規則(例如源地址或目標地址)並設置另一個標記時,之前的標記將被重寫為您設置的內容。但是有一些方法可以“添加”標記。因此,如果一個規則集
mark=2
和另一個規則集mark=5
,那麼結果標記將是mark=7
,或類似的東西。我有一個基於mwan3的工作範例,但我真的不明白。我知道
mangle
啟動工具後表格是什麼樣的,以及添加了哪些規則:所以要理解這個機制,我必須知道到達的數據包到底發生了什麼。但是在這個例子中,標記規則是不同的。
我們有兩個不同的 WAN 介面。根據標記,數據包將進入不同的路由表。那麼,發往 443 埠(例如,1000 埠)的數據包實際上會發生什麼?誰能幫我分析一下規則?
目標“-j MARK –set-mark 2”將在數據包上設置標記 2,無論之前的值是什麼。如果你想避免你的標記被擦除,你可以簡單地用 -j ACCEPT 結束鏈中的數據包路徑。例如 :
iptables -t mangle -A POSTROUTING -p tcp --dport 80 -j MARK --set-mark 10 iptables -t mangle -A POSTROUTING -p tcp --dport 80 -j ACCEPT iptables -t mangle -A POSTROUTING -d 8.8.8.8 -j MARK --set-mark 20 iptables -t mangle -A POSTROUTING -d 8.8.8.8 --dport 80 -j ACCEPT # If you open a connection to 8.8.8.8:80, the mark will be 10
雖然,如果您在主鏈(例如 POSTROUTING)或自定義鏈中,您必須小心:ACCEPT 將結束主鏈,而 RETURN 將結束目前鏈。這取決於您的需求。
關於 mwan3 範例,如果沒有 filter、nat 和 raw 表以及沒有 tc 配置,很難確定。
但是,它看起來像這樣:
- “mwan3_rules”鏈將數據包從具有 dport 80 或 443 的新連接發送到“mwan3_policy_balanced”鏈
- “mwan3_policy_balanced”鏈在 40% 的數據包上設置了標記 200,在其他數據包上設置了標記 100
- “mwan3_rules”鏈將數據包從不使用 dport 80 或 443 的新連接發送到“mwan3_policy_wan_only”鏈
- “mwan3_policy_wan_only”鏈將標記設置為 100
- 我猜標記為 100 的數據包將通過電纜,而標記為 200 的數據包將通過 lte
因此,40% 的 http(s) 流量將通過 lte,60% 通過電纜,其他一切都通過電纜。
如果您的目標是在您的 2 個 ISP 上對連接進行負載平衡,您可能應該從頭開始編寫自己的 iptables 規則,因為 mwan3 的規則很難閱讀。
你可以從這個問題開始。
祝你好運 !
版:
該文件指出:
--set-xmark value[/mask] Zero out the bits given by mask and XOR value into the ctmark.
如果您有 0x100 標記,並嘗試將 xmark 設置為 0x200/0xff00:
- 在 ctmark 中,清除遮罩給出的位:0000 0001 0000 0000 AND NOT 1111 1111 0000 0000 –> 0000 0000 0000 0000
- XOR 值到 ctmark 中:0000 0000 0000 0000 XOR 0000 0010 0000 0000 –> 0000 0010 0000 0000 –> 0x200 –> 512
如果您有 0x100 標記,並嘗試設置 xmark 0x200/0xf000:
- 在 ctmark 中,清除遮罩給出的位:0000 0001 0000 0000 AND NOT 1111 0000 0000 0000 –> 0000 0001 0000 0000
- XOR 值到 ctmark 中:0000 0001 0000 0000 XOR 0000 0010 0000 0000 –> 0000 0011 0000 0000 –> 0x300 –> 768
如果您有 0x100 標記,並嘗試設置 xmark 0x100/0xf000:
- 在 ctmark 中,清除遮罩給出的位:0000 0001 0000 0000 AND NOT 1111 0000 0000 0000 –> 0000 0001 0000 0000
- XOR 值到 ctmark:0000 0001 0000 0000 XOR 0000 0001 0000 0000 –> 0000 0000 0000 0000 –> 0x000 –> 0
如果您有 0x100 標記,並嘗試將 xmark 設置為 0x100/0xff00:
- 在 ctmark 中,清除遮罩給出的位:0000 0001 0000 0000 AND NOT 1111 1111 0000 0000 –> 0000 0000 0000 0000
- 將值異或到 ctmark 中:0000 0000 0000 0000 XOR 0000 0001 0000 0000 –> 0000 0001 0000 0000 –> 0x100 –> 256
在 mwan3 文件中,情況總是這樣:
- 您有一個 0x0 標記,並嘗試設置 xmark 0x??00/0xff00
- 在 ctmark 中,清除遮罩給出的位:0000 0000 0000 0000 AND NOT 1111 1111 0000 0000 –> 0000 0000 0000 0000
- XOR值進入ctmark:0000 0000 0000 0000 XOR ???? ???0000 0000 –> ???? ???0000 0000 –> 0x??00 –> ?
- 使用此遮罩和這些值,set-xmark 只需替換以前的值
現在,讓我們通過鏈條:
- 預路由跳轉到 mwan3_hook。
- mwan3_hook 將 connmarks 還原為標記
- mwan3_hook 將新連接(標記 = 0x0)發送到 mwan3_ifaces
- mwan3_ifaces 將新連接發送到 mwan3_iface_wan
- 當源地址在 ipset 列表中時,mwan3_iface_wan 將標記 0xff00 設置為來自介面 eth0 的新連接
- mwan3_iface_wan 將標記 0x100 設置為介面 eth0 上的其他新連接
- mwan3_ifaces 將新連接發送到 mwan3_iface_lte
- 當源地址在 ipset 列表中時,mwan3_iface_lte 將標記 0xff00 設置為來自介面 wwan 的新連接
- mwan3_iface_lte 將標記 0x200 設置為介面 wwan 上的其他新連接
- 注意:此時,所有傳入連接都被標記
- mwan3_hook 將連接發送到 mwan3_connected
- mwan3_connected 當目標地址在 ipset 列表中時設置標記 0xff00 mwan3_connected
- mwan3_hook 將連接發送到 mwan3_track
- mwan3_track 將標記 0xff00 設置為連接如果目標 ip 在 ipset 列表中 mwan3_track_wan,數據包是 32 字節長度的 icmp echo
- mwan3_track 將標記 0xff00 設置為連接如果目標 ip 在 ipset 列表中 mwan3_track_lte,數據包是 32 字節長度的 icmp echo
- mwan3_hook 將連接發送到 mwan3_rules
- mwan3_rules 將新的 tcp/80 或 tcp/443 連接從內部發送到 mwan3_policy_balanced
- mwan3_policy_balanced 將標記 0x200 設置為新連接的 40%
- mwan3_policy_balanced 將標記 0x100 設置為另一個新連接
- mwan3_hook 將標記恢復為 connmarks
- mwan3_hook 將標記 0xff00 設置為仍未標記的連接(從內部,不是 icmp 類型 8、tcp/80 或 tcp/443)
- Prerouting 跳轉到 fwmark,但是鏈不在螢幕上
- 轉發修復mss
- 輸出跳轉到mwan3_hook,每一步都做一遍。
最後,我們有 3 個狀態:
- 0x100 標記 (256) : 來自 wan 的連接,以及 60% 的 http(s) 連接到網際網路
- 0x200 標記 (512) :來自 lte 的連接,以及 40% 的 http(s) 連接到網際網路
- 0xff00 標記 (65280) : 其他流量
由於我們沒有 ip 規則,我們只能猜測:
- 0x100 標記將通過 wan 路由表
- 0x200 標記將通過 lte 路由表
- 0xff00 將通過另一個路由表