两个不同 iptables 版本的相同 iptables 规则

两个不同 iptables 版本的相同 iptables 规则

我在两个不同版本的 iptables 上使用一组 iptables 规则,这些规则利用 mangle 表,其中包含下面的行v1.3.8, 和v1.4.7

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 上运行

两台电脑的配置方式相同,但在较老的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

/etc/sysconfig/iptables版本中存在的文件v1.3.8包含以下几行:

*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

/etc/sysconfig/iptables版本中存在的文件v1.4.7包含以下几行:

*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

在新版本中设定标记已成为设置xmark掩码掩码也在场。

为什么相同的规则在新版本中不起作用?

更新 :

问题不在 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

答案1

两个系统之间的主要变化不是iptables但内核。较旧的内核是 2007 年的。

影响路由的一个显着变化(OP在这个问题中没有提供,但在OP的另一个问题) 与标记一起使用时是src_valid_mark:

net:恢复ip源验证

当使用策略路由和 skb 标记时:在某些情况下 反向路径验证要求我们使用与映射入口 dst ip 不同的路由表来验证 src ip。其中一种情况是透明代理,我们假装是目标系统,因此本地表用于传入数据包,但可能会在出站时使用主表。设置默认行为以允许上述行为如果用户需要通过 sysctl 打开对称性src_valid_mark

在此补丁之前(Fedora 8)的行为严格反向路径转发(由处理rp_filter):假设对称路由,与之后的(SL 6)不同:假设非对称路由用于一些非常特殊的设置,其中回复通过不同的路由以一种或另一种方式发送。

这个 ~ 11 年前的补丁才被记录在案沿内核 5.12今年2021年:

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

因为其中的最高值全部并采用任何接口值。

相关内容