Kar*_*hik 4 debian iptables ip6tables nftables
我有以下 iptable 规则/etc/iptables/rule.V6
和/etc/iptables/rule.V4
-4 -A INPUT -p icmp -j ACCEPT
-6 -A INPUT -p ipv6-icmp -j ACCEPT
Run Code Online (Sandbox Code Playgroud)
当我尝试重新启动 时netfilter-persistent
,它在内部调用iptables-restore
和ip6tables-restore
。
ip6tables-restore
失败,因为它无法理解以下规则
-4 -A INPUT -p icmp -j ACCEPT
Run Code Online (Sandbox Code Playgroud)
下面是错误
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.
Run Code Online (Sandbox Code Playgroud)
理想情况下,开头的规则-4
将被 忽略ip6tables-restore
,但这似乎不适用于 Debian Buster。
但是,iptables-restore
工作正常,这只是ip6tables-restore
. 如何解决这个问题?
您肯定是在 nftables 上运行 iptables,因为这是 Debian buster 上的默认设置。要确认是这种情况,请检查(nf_tables)
:
# ip6tables-restore --version
ip6tables-restore v1.8.2 (nf_tables)
Run Code Online (Sandbox Code Playgroud)
现在在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
除了-A INPUT -p icmp -j ACCEPT
在 IPv4 协议中(这永远不会发生,除非使用自定义测试,并且 IP 堆栈将忽略它反正)。
可能的解决方法:
提交错误报告,坚持会破坏现有规则和文档的回归。这也会帮助其他人。
拆分规则
将您的文件拆分为两个文件,但对每个文件应用不同的过滤器,例如:
grep -v -- '^ *-4 ' < before > after.v6
grep -v -- '^ *-6 ' < before > after.v4
Run Code Online (Sandbox Code Playgroud)创建一个包装器 for ip6tables-restore
in/usr/local/sbin/ip6tables-restore
做同样的事情(并且对 做同样的事情iptables-restore
),允许保留一个规则
在 nftables 上放弃(现在)iptables 并恢复到传统的 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
Run Code Online (Sandbox Code Playgroud)
相关命令的链接也变了,很好。
做同样的事情iptables
。
当前的规则仍然适用于 nftables。你可以把它们扔掉iptables-nft-save
+ ip6tables-nft-save
,并恢复它们iptables-save
+ ip6tables-save
。这将导致规则运行两次:一次使用内核的 iptables 后端,一次使用内核的 nftables 后端,NAT 可能并不总是在内核 4.19 上正常工作(通常第一个加载的模块获胜:这里nft_nat)
。更好的重启,或者知道如何刷新规则并删除相关的 (nat) nftables 模块。
拥抱新功能并直接使用nft
。
这里有一些命令可以提供帮助(但它们有与上面相同的问题):iptables-translate
/ip6tables-translate
和iptables-restore-translate
/ ip6tables-restore-translate
,但结果通常需要重新处理(尤其是像 那样的花哨匹配u32
)。Nftables 有一个族类型inet
,它实际上可以混合 IPv4 和 IPv6 规则(可能需要在 nat 中使用更新的内核),所以它会简化事情。
归档时间: |
|
查看次数: |
3171 次 |
最近记录: |