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

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

我有以下 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-restoreip6tables-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应该处理它,要么文档应该将其反映为可接受的额外差异。

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

可能的解决方法:

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

  2. 分割规则

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

    grep -v -- '^ *-4 ' < before > after.v6
    grep -v -- '^ *-6 ' < before > after.v4
    
  3. 创建一个包装器 forip6tables-restore执行/usr/local/sbin/ip6tables-restore大约相同的操作(并且也为 执行相同的操作iptables-restore),允许保留单个规则

  4. (暂时)放弃 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-saveip6tables-savenft_nat)

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

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

相关内容