Debian buster/sid 中​​的 ip6table-restore 失败

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-restoreip6tables-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. 如何解决这个问题?

A.B*_*A.B 5

您肯定是在 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应该处理它,或者文档应该将其反映为可接受的附加差异。

顺便说一句,反过来(-6with iptables-nft-restore)看起来并不好:它被接受而不是被忽略,导致-A INPUT -p ipv6-icmp -j ACCEPT除了-A INPUT -p icmp -j ACCEPT在 IPv4 协议中(这永远不会发生,除非使用自定义测试,并且 IP 堆栈将忽略它反正)。

可能的解决方法:

  1. 提交错误报告,坚持会破坏现有规则和文档的回归。这也会帮助其他人。

  2. 拆分规则

    将您的文件拆分为两个文件,但对每个文件应用不同的过滤器,例如:

    grep -v -- '^ *-4 ' < before > after.v6
    grep -v -- '^ *-6 ' < before > after.v4
    
    Run Code Online (Sandbox Code Playgroud)
  3. 创建一个包装器 for ip6tables-restorein/usr/local/sbin/ip6tables-restore做同样的事情(并且对 做同样的事情iptables-restore),允许保留一个规则

  4. 在 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 模块。

  5. 拥抱新功能并直接使用nft

    这里有一些命令可以提供帮助(但它们有与上面相同的问题):iptables-translate/ip6tables-translateiptables-restore-translate/ ip6tables-restore-translate,但结果通常需要重新处理(尤其是像 那样的花哨匹配u32)。Nftables 有一个族类型inet,它实际上可以混合 IPv4 和 IPv6 规则(可能需要在 nat 中使用更新的内核),所以它会简化事情。