兩個不同 iptables 版本的相同 iptables 規則
我在兩個不同版本的 iptables v1.3.8和v1.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-xmark,nfmask和ctmask也出現了。
為什麼相同的規則在新版本中不起作用?
更新 :
問題不在 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_TSANDADDR
和IPOPT_RR
IP 選項儲存的地址時,此設置也會影響 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
因為取所有和任何介面值中的最高值。