我有以下 iptable 规则/etc/iptables/rule.V6
和/etc/iptables/rule.V4
-4 -A INPUT -p icmp -j ACCEPT
-6 -A INPUT -p ipv6-icmp -j ACCEPT
当我尝试重新启动 时netfilter-persistent
,它在内部调用iptables-restore
和ip6tables-restore
。
ip6tables-restore
失败,因为它无法理解以下规则
-4 -A INPUT -p icmp -j ACCEPT
下面是错误
root@rs-dal:/etc/iptables# ip6tables-restore rules.q
Error occurred at line: 15
Try `ip6tables-restore -h' or 'ip6tables-restore --help' for more information.
理想情况下,以 开头的规则-4
将被 忽略ip6tables-restore
,但这似乎在 Debian Buster 中不起作用。
但是,iptables-restore
工作得很好,这只是 的问题ip6tables-restore
。如何解决这个问题?
答案1
您肯定是在 nftables 上运行 iptables,因为这是 Debian buster 上的默认设置。要确认这种情况,请检查(nf_tables)
:
# ip6tables-restore --version
ip6tables-restore v1.8.2 (nf_tables)
现在在ip6tables手册,一直以来都有:
-4, --ipv4
此选项在 iptables 和 iptables-restore 中无效。如果使用 -4 选项的规则与(且仅与)ip6tables-restore 一起插入,它将被静默忽略。任何其他用途都会引发错误。此选项允许单个规则文件中的 IPv4 和 IPv6 规则与 iptables-restore 和 ip6tables-restore 一起使用。
问题是你现在正在跑步ip6tables-nft-restore
而不是 ip6tables-legacy-restore
。
-4
里面没有提到与传统 iptables 的差异,这意味着它应该没有区别,但它就是这样。这确实看起来像一个错误:要么新版本ip6tables-nft-restore
应该处理它,要么文档应该将其反映为可接受的额外差异。
顺便说一句,另一种方式(-6
with iptables-nft-restore
)看起来并不好:它被接受而不是被忽略,导致-A INPUT -p ipv6-icmp -j ACCEPT
除了 IPv4 协议之外-A INPUT -p icmp -j ACCEPT
(这永远不会发生,除非使用自定义测试,并且 IP 堆栈将忽略它反正)。
可能的解决方法:
提交错误报告,坚持进行回归,这会破坏现有的规则和文档。这也会对其他人有所帮助。
分割规则
将文件拆分为两个文件,但对每个文件应用不同的过滤器,例如:
grep -v -- '^ *-4 ' < before > after.v6 grep -v -- '^ *-6 ' < before > after.v4
创建一个包装器 for
ip6tables-restore
执行/usr/local/sbin/ip6tables-restore
大约相同的操作(并且也为 执行相同的操作iptables-restore
),允许保留单个规则(暂时)放弃 iptables 而不是 nftables,并恢复到旧版 iptables:
# readlink -f $(which ip6tables-restore) /usr/sbin/xtables-nft-multi # update-alternatives --config ip6tables There are 2 choices for the alternative ip6tables (providing /usr/sbin/ip6tables). Selection Path Priority Status ------------------------------------------------------------ * 0 /usr/sbin/ip6tables-nft 20 auto mode 1 /usr/sbin/ip6tables-legacy 10 manual mode 2 /usr/sbin/ip6tables-nft 20 manual mode Press <enter> to keep the current choice[*], or type selection number: 1 update-alternatives: using /usr/sbin/ip6tables-legacy to provide /usr/sbin/ip6tables (ip6tables) in manual mode # readlink -f $(which ip6tables-restore) /usr/sbin/xtables-legacy-multi
相关命令的链接也改变了,好吧。
对 执行同样的操作
iptables
。目前的规则仍然适用于 nftables。您可以使用
iptables-nft-save
+转储它们并使用+ip6tables-nft-save
恢复它们。这将导致规则运行两次:一次使用内核的 iptables 后端,一次使用内核的 nftables 后端,并且 NAT 可能无法始终在内核 4.19 上正常工作(通常第一个加载的模块获胜:此处。最好重新启动,或者知道如何刷新规则并删除相关 (nat) nftables 模块。iptables-save
ip6tables-save
nft_nat)
拥抱新功能并直接使用
nft
。这里有一些命令可以提供帮助(但它们有与上面相同的问题):
iptables-translate
/ip6tables-translate
和iptables-restore-translate
/ip6tables-restore-translate
,但结果通常需要重新设计(尤其是像这样的奇特匹配u32
)。 Nftables 有家庭类型inet
它实际上可以混合 IPv4 和 IPv6 规则(在 nat 中可能需要更新的内核),因此它会简化事情。