Iptables

兩個不同 iptables 版本的相同 iptables 規則

  • August 20, 2021

我在兩個不同版本的 iptables v1.3.8v1.4.7上使用了一組使用 mangle 表的 iptables 規則,該表包含以下行。

iptables v1.3.8 在 Fedora 8 核心 2.6.23.1-42.fc8 上執行 Iptables v1.4.7 在 Scientific Linux(RHEL 複製)6.10 核心 2.6.32-573.1 上執行

兩台 PC 的配置方式相同,但在版本的 iptables v1.3.8中配置有效,但在v1.4.7中卻沒有

規則是:

iptables -A PREROUTING -t mangle -s 10.200.0.0/16 ! -d 192.168.0.0/16 -j MARK --set-mark 0x1
iptables -A PREROUTING -t mangle -s 192.168.0.0/16 ! -d 192.168.0.0/16 -j MARK --set-mark 0x2
iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j CONNMARK --save-mark
iptables -t mangle -I OUTPUT -m connmark ! --mark 0 -j CONNMARK --restore-mark
iptables -A OUTPUT -t mangle -s 172.16.62.100 -j MARK --set-mark 1
iptables -A OUTPUT -t mangle -s 172.16.61.2   -j MARK --set-mark 2
iptables -A OUTPUT -t mangle -s 172.16.61.3   -j MARK --set-mark 2
iptables -A OUTPUT -t mangle -s 172.16.61.4   -j MARK --set-mark 2
iptables -A OUTPUT -t mangle -s 172.16.61.5   -j MARK --set-mark 2
iptables -A OUTPUT -t mangle -s 172.16.61.6   -j MARK --set-mark 2
iptables -A OUTPUT -t mangle -s 172.16.61.7   -j MARK --set-mark 2

v1.3.8版本中的**/etc/sysconfig/iptables**文件包含以下幾行:

*mangle
-A PREROUTING -s 10.200.0.0/255.255.0.0 -d ! 192.168.0.0/255.255.0.0 -j MARK --set-mark 0x1 
-A PREROUTING -s 192.168.0.0/255.255.0.0 -d ! 192.168.0.0/255.255.0.0 -j MARK --set-mark 0x2 
-A PREROUTING -m mark ! --mark 0x0 -j CONNMARK --save-mark 
-A OUTPUT -m connmark ! --mark 0x0 -j CONNMARK --restore-mark 
-A OUTPUT -s 172.16.62.100 -j MARK --set-mark 0x1 
-A OUTPUT -s 172.16.61.2 -j MARK --set-mark 0x2 
-A OUTPUT -s 172.16.61.3 -j MARK --set-mark 0x2 
-A OUTPUT -s 172.16.61.4 -j MARK --set-mark 0x2 
-A OUTPUT -s 172.16.61.5 -j MARK --set-mark 0x2 
-A OUTPUT -s 172.16.61.6 -j MARK --set-mark 0x2 
-A OUTPUT -s 172.16.61.7 -j MARK --set-mark 0x2 
COMMIT

版本v1.4.7中的**/etc/sysconfig/iptables**文件包含以下幾行:

*mangle
-A PREROUTING -s 10.200.0.0/255.255.0.0 ! -d 192.168.0.0/255.255.0.0 -j MARK --set-xmark 0x1/0xffffffff 
-A PREROUTING -s 192.168.0.0/255.255.0.0 ! -d 192.168.0.0/255.255.0.0 -j MARK --set-xmark 0x2/0xffffffff 
-A PREROUTING -m mark ! --mark 0x0 -j CONNMARK --save-mark --nfmask 0xffffffff --ctmask 0xffffffff 
-A OUTPUT -m connmark ! --mark 0x0 -j CONNMARK --restore-mark --nfmask 0xffffffff --ctmask 0xffffffff 
-A OUTPUT -s 172.16.62.100 -j MARK --set-xmark 0x1/0xffffffff 
-A OUTPUT -s 172.16.61.2 -j MARK --set-xmark 0x2/0xffffffff 
-A OUTPUT -s 172.16.61.3 -j MARK --set-xmark 0x2/0xffffffff 
-A OUTPUT -s 172.16.61.4 -j MARK --set-xmark 0x2/0xffffffff 
-A OUTPUT -s 172.16.61.5 -j MARK --set-xmark 0x2/0xffffffff 
-A OUTPUT -s 172.16.61.6 -j MARK --set-xmark 0x2/0xffffffff 
-A OUTPUT -s 172.16.61.7 -j MARK --set-xmark 0x2/0xffffffff 
COMMIT

在新版本中,set-marks變成了set-xmarknfmaskctmask也出現了。

為什麼相同的規則在新版本中不起作用?

更新 :

問題不在 iptables 上,而是在**/etc/sysctl.conf**上:

我已經設置了以下參數,現在它可以工作了:

net.ipv4.conf.default.log_martians = 1
net.ipv4.conf.all.log_martians = 1

net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.all.rp_filter=0

兩個系統之間的主要變化不是iptables,而是核心。較舊的核心來自 2007 年。

與標記一起使用時影響路由的一個顯著變化(OP 在這個問題中沒有提供,但在OP 的另一個問題src_valid_mark中)是:

net:恢復 ip 源驗證

使用策略路由和 skb 標記時:在某些情況下, 反向路徑驗證要求我們使用不同的路由表進行 src ip 驗證,而不是用於映射入口 dst ip 的路由表。一種這樣的情況是透明代理,我們假裝是目標系統,因此本地表用於傳入數據包,但主表可能用於出站。如果使用者需要通過 sysctl 打開對稱性,則設置預設行為以允許上述情況src_valid_mark

在此更新檔之前(Fedora 8),嚴格反向路徑轉發的行為(由 處理rp_filter):假設對稱路由,與之後(SL 6)不同:假設對於一些非常特殊的設置採用不對稱路由,其中​​回復以一種或另一種方式發送一條不同的路線。

這個有 11 年曆史的更新檔僅在 2021 年的核心 5.12中被記錄

src_valid_mark - 布爾值

  • 0 -數據包的 fwmark 不包括在反向路徑路由查找中。這允許僅在一個方向上使用 fwmark 的非對稱路由配置,例如透明代理。
  • 1 - 數據包的 fwmark 包含在反向路徑路由查找中。當 fwmark 用於雙向路由流量時,這允許 rp_filter 起作用。

在為 ICMP 回复執行源地址選擇或確定為IPOPT_TS_TSANDADDRIPOPT_RRIP 選項儲存的地址時,此設置也會影響 fmwark 的使用率。

使用來自的最大值conf/{all,interface}/src_valid_mark

預設值為 0

因此,要在保持嚴格反向路徑轉發設置 ( ) 的同時使用標記進行對稱路由,必須做的rp_filter=1是:

sysctl -w net.ipv4.conf.all.src_valid_mark=1

或在中添加等價物/etc/sysctl.conf

net.ipv4.conf.all.src_valid_mark = 1

因為取所有和任何介面值中的最高值。

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