Debian

ip6table-restore 在 Debian buster/sid 中 失敗

  • March 22, 2019

我有以下 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-restoreand 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. 如何解決這個問題?

你肯定是在 nftables 上執行 iptables,因為這是 Debian buster 的預設設置。要確認是這種情況,請檢查(nf_tables)

# ip6tables-restore --version
ip6tables-restore v1.8.2 (nf_tables)

現在在ip6tables 手冊中,一直有:

-4, –ipv4

該選項在 iptables 和 iptables-restore 中無效。如果使用 ip6tables-restore 插入使用 -4 選項的規則(並且僅使用),它將被靜默忽略。任何其他用途都會引發錯誤。此選項允許在單個規則文件中使用 IPv4 和 IPv6 規則,以便與 iptables-restore 和 ip6tables-restore 一起使用。

問題是您現在正在執行ip6tables-nft-restore而不是 ip6tables-legacy-restore.

沒有提到與舊版 iptables-4的差異,這意味著它不應該有差異,但在這裡。這看起來確實像一個錯誤:要麼新版本應該處理它,要麼文件應該將它反映為可以接受的額外差異。ip6tables-nft-restore

順便說一句,相反(-6with iptables-nft-restore)看起來並不好:它被接受而不是被忽略,導致-A INPUT -p ipv6-icmp -j ACCEPT除了-A INPUT -p icmp -j ACCEPTIPv4 協議(這永遠不會發生,除非可能使用自定義測試,並且 IP 堆棧將忽略它反正)。

可能的解決方法:

  1. 送出錯誤報告,堅持會破壞現有規則和文件的回歸。這也會幫助其他人。
  2. 拆分規則

將您的文件分成兩個文件,但對每個文件應用不同的過濾器,例如:

grep -v -- '^ *-4 ' < before > after.v6
grep -v -- '^ *-6 ' < before > after.v4
  1. ip6tables-restore為in/usr/local/sbin/ip6tables-restore做同樣的事情(也為 做同樣的事情)創建一個包裝器iptables-restore,允許保留一個規則
  2. 放棄(暫時) 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) 5. 擁抱新功能並直接使用nft

這裡有一些命令可以提供幫助(但它們有與上面相同的問題):iptables-translate/ip6tables-translateiptables-restore-translate/ ip6tables-restore-translate,但結果通常需要重新處理(特別是對於花哨的匹配,如u32)。Nftables 有一個家族類型inet,它實際上可以混合 IPv4 和 IPv6 規則(在 nat 中可能需要更新的核心),所以它會簡化事情。

引用自:https://unix.stackexchange.com/questions/508019