我希望在出口上应用防火墙规则来控制 Docker 容器的 DHCP 输出。我不希望 DHCP 容器共享主机的网络堆栈,因为添加CAP_NET_ADMIN
有效地赋予了容器对网络堆栈的控制权。
我注意到这里在内核 5.7 中的 netfilter 中添加了一个出口钩子(uname -r
说我有 5.10)。
根据资料中这提交后,我添加了下表:
table netdev filterfinal_lan {
chain egress {
type filter hook egress device enp1s0 priority 0; policy accept;
}
}
但是,当我尝试应用该配置时,它告诉我它未被识别:
/etc/nftables.conf:107:20-25: Error: unknown chain hook
type filter hook egress device enp1s0 priority 0; policy accept;
^^^^^^
我不确定哪个版本的 nftables 支持 egress hook,但我的nft --version
是nftables v0.9.8 (E.D.S.)
.有关出口挂钩的信息似乎很难捉摸。
需要什么才能使用这个钩子?
答案1
实际上nftables内核 5.16 中添加了 egress hook,并fwd
在 5.17 中改进了支持 ( )。
早些时候有过几次尝试,其中一次在最初提交的同时被 NACK-ed,使其出现在 5.7 版本的 Kernel Newbies 中,显然甚至nftables' wiki 链接到 Linux 5.7 的 Kernelnewbies 而不是 Linux 5.16 是错误的。
以下是 2020 年 3 月的相关邮件列表链接(内核 5.7 左右):
主题:回复:[PATCH 00/29] Netfilter 更新 net-next
来自:大卫·米勒 <davem() davemloft !网>来自:阿列克谢·斯塔罗沃伊托夫 <[电子邮件受保护]>
日期:2020 年 3 月 17 日星期二 20:55:46 -10002020 年 3 月 17 日星期二下午 2:42 Pablo Neira Ayuso[电子邮件受保护]写道:
- 添加来自 Lukas Wunner 的新出口挂钩。
NACKed-by:阿列克谢·斯塔罗沃伊托夫[电子邮件受保护]
抱歉,我在推回此拉取请求后才看到此内容。
请有人通过恢复或类似方式处理此问题。
随后在此提交中恢复了它:netfilter:恢复出口钩子的引入。此回复可能尚未发布在所有相关邮件列表中,这增加了一些混乱。
快进快两年了。问题和疑虑(其中包括与 tc/qdisc 的交互)已得到解决,出口在内核 5.16(2022 年 1 月 9 日)中再次添加。Linux 5.16 的内核新手有这个条目:
网络过滤器
在 Linux 内核驱动程序数据库上:
CONFIG_NETFILTER_EGRESS:Netfilter 出口支持
[...]
- Linux 内核中发现:5.16–5.19、5.19+HEAD
同样地,nftables用户态支持出口仅在 nf-next 中提交内核支持后才正式添加(因此在 5.16 发布之前),并在nftables 1.0.1 发布:
此版本包含 Linux 内核 5.16-rc1 版本之前可用的新功能:
[...]
- 出口挂钩支持(自 5.16-rc1 起可用)。
OP 的规则集在具有相关内核选项的内核上被接受,CONFIG_NETFILTER_EGRESS
该内核选项的版本必须 >= 5.16nftables>= 1.0.1。