ip6table-restore 在 Debian buster/sid 中 失敗
我有以下 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
andip6tables-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
順便說一句,相反(
-6
withiptables-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
ip6tables-restore
為in/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)
5. 擁抱新功能並直接使用nft
。這裡有一些命令可以提供幫助(但它們有與上面相同的問題):
iptables-translate
/ip6tables-translate
和iptables-restore-translate
/ip6tables-restore-translate
,但結果通常需要重新處理(特別是對於花哨的匹配,如u32
)。Nftables 有一個家族類型inet
,它實際上可以混合 IPv4 和 IPv6 規則(在 nat 中可能需要更新的核心),所以它會簡化事情。