我在两个不同版本的 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_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
因为其中的最高值全部并采用任何接口值。