LXC 容器無法載入大型 iptables 規則

LXC 容器無法載入大型 iptables 規則

當我嘗試在 LXC 容器上載入一大組 iptables 規則時,我遇到了一個奇怪的問題(它在虛擬機器上運作良好)。

容器正在運行 Linux Debian 12 bookworm。

我可以配置規則並保存它們:

 /usr/sbin/netfilter-persistent save

但是,如果我嘗試加載它們,我會收到此錯誤訊息(文件長度為 694 個字元)

$ sudo  iptables-restore < /etc/iptables/rules.v4
sendmsg() failed: Message too long
iptables-restore: line 692 failed: Message too long.

奇怪的是,如果我添加詳細模式,它可以正常工作

$ sudo  iptables-restore -v < /etc/iptables/rules.v4 && echo ok
(...)
# Completed on Fri Sep 15 08:57:48 2023
ok

但是,如果我嘗試載入大檔案(33750 行),無論是否處於詳細模式,我總是會收到「訊息太長」錯誤。

所有載入測試都在虛擬機器(相同作業系統)上正常運作。

所以我想知道 LXC 中是否存在行限製或記憶體限制?我嘗試過玩,limits.conf但它還沒有改變任何東西。

任何想法 ?

編輯以下是重現此行為的更多資訊:

核心版本:

Linux xxxxxx 6.2.16-10-pve #1 SMP PREEMPT_DYNAMIC PMX 6.2.16-10 (2023-08-18T11:42Z) x86_64 GNU/Linux

一些軟體包版本(來賓容器):

ii  iptables                            1.8.9-2                                 amd64        administration tools for packet filtering and NAT
ii  iptables-persistent                 1.0.20                                  all          boot-time loader for netfilter rules, iptables plugin
ii  libip4tc2:amd64                     1.8.9-2                                 amd64        netfilter libip4tc library
ii  libip6tc2:amd64                     1.8.9-2                                 amd64        netfilter libip6tc library
ii  libnetfilter-conntrack3:amd64       1.0.9-3                                 amd64        Netfilter netlink-conntrack library
ii  libxtables12:amd64                  1.8.9-2                                 amd64        netfilter xtables library
ii  netfilter-persistent                1.0.20                                  all          boot-time loader for netfilter configuration

主機包:

ii  lxc-pve                              5.0.2-4                             amd64        Linux containers userspace tools
ii  lxcfs                                5.0.3-pve3                          amd64        LXC userspace filesystem
ii  pve-lxc-syscalld                     1.3.0                               amd64        PVE LXC syscall daemon

小規則集是:

# Generated by iptables-save v1.8.9 (nf_tables) on Fri Sep 15 08:57:48 2023
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:block_spam2 - [0:0]
:block_spam1 - [0:0]
:block_spam3 - [0:0]
:incoming_net - [0:0]
:sensitive_daemons - [0:0]
-A INPUT -j block_spam1
-A INPUT -j block_spam2
-A INPUT -j block_spam3
-A INPUT -j sensitive_daemons
-A INPUT -j incoming_net
-A INPUT -j sensitive_daemons
-A block_spam2 -s 1.0.1.0/24 -j DROP
-A block_spam2 -s 84.22.192.0/19 -j DROP
-A block_spam1 -s 103.39.156.0/22 -j DROP
-A block_spam1 -s 5.255.220.0/22 -j DROP
-A block_spam3 -s 87.245.234.136/32 -j DROP
-A block_spam3 -s 217.199.224.0/19 -j DROP
[...] 675 lines here : block_spam[1-3] with a uniq ip address [...]
-A incoming_net -d 192.168.1.248/29 -p tcp -m tcp --dport 80 -j ACCEPT
-A incoming_net -d 192.168.1.248/29 -p tcp -m tcp --dport 443 -j ACCEPT
-A incoming_net -d 192.168.1.248/29 -p tcp -j DROP
-A sensitive_daemons -s 192.168.1.248/29 -p tcp -m tcp --dport 22 -j DROP
-A sensitive_daemons -s 192.168.1.0/24 -d 192.168.1.24/32 -p tcp -m tcp --dport 22 -j ACCEPT
-A sensitive_daemons -p tcp -m tcp --dport 22 -j DROP
COMMIT
# Completed on Fri Sep 15 08:57:48 2023

答案1

您應該考慮使用 ipset 來保留 block_spam* 規則的主機/網路位址(並且可能會將它們合併為一組),這會更快。或者只是轉移到 nftables 並使用內建集。

答案2

如果您查找 sendmsg() 手冊頁,您會發現它實際上沒有回應表明訊息太大。然而,如果訊息緩衝區中沒有足夠的空間,它會返回 ENOBUFS - 類似,但不是同一件事。我懷疑這就是這裡正在發生的事情。當沒有任何內容清空訊息緩衝區時會導致 - 套接字通訊以某種方式失敗。為什麼 iptables-restore 會寫入套接字?最有可能的是它試圖寫入日誌條目(或一個大的日誌條目),但這主要是猜測。在大多數現代 Linux 上,「iptables-restore」是一個符號鏈接,指向資料包過濾工具的幾種實作之一。

如果iptables-restore -v有效,那麼您就有一個解決方法,但是擁有大量防火牆規則的最可能原因是您直接添加有關各個客戶端位址的規則。這對於少量地址來說很好,但無法擴展。正如@Tomek 所說,使用ipset是一個更好的解決方案(這確實可以擴展)。

相關內容