Iptables

如何在 iptables 中一起添加標記(目標 MARK 和 CONNMARK)

  • May 17, 2016

當您想在 中標記數據包時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 將通過另一個路由表

引用自:https://unix.stackexchange.com/questions/282993