我在 Ubuntu 20.10 上尝试为我的虚拟网络进行一些路由配置,并且我对现代 Linux 发行版中使用的 3 种主要防火墙技术之间的交互感到困惑,即:
iptables
nft
网络过滤器bpf
伯克利数据包过滤器
有人可以回答以下问题吗:
- 我如何检查已安装哪些?
- 这 3 个防火墙能否在一个客户端上和平共处?如果不能,我该如何安全地卸载其中一个?
- 包括哪些翻译层?例如,如果我
iptables
在 Ubuntu 20.10 上有一个可执行文件,那实际上是iptables
防火墙,还是 api 接口netfilter
? - 是否有用于常规防火墙任务的 API 程序
bpf
?(我见过很多跟踪程序,但没有一个是专门用于防火墙的)
5.10.11
此外,更复杂的是,我根据文件编译了自己的内核5.8.0-40-generic
.config
,并启用了所有netfilter
规则。这会给我的前进带来任何障碍吗?
因为大多数模块都是在内核中编译的,lsmod
所以不会给出典型的输出,但我还是会发布它。.config
如果那有帮助的话我可以发布。
以下是我目前lsmod
涉及的内容netfilter
:
# lsmod | egrep 'net|filter|table|nft|ipt|bpf'
vmnet 53248 13
ipt_REJECT 16384 0
nft_compat 20480 0
dell_wmi_descriptor 20480 2 dell_wmi,dell_smbios
ip_tables 28672 0
x_tables 45056 10 xt_conntrack,xt_cgroup,nft_compat,xt_multiport,xt_tcpudp,xt_owner,ipt_REJECT,ip_tables,xt_MASQUERADE,xt_mark
以下是我当前的 IP 转发规则:
# sysctl -a | grep forward | grep '= 1'
sysctl: reading key "kernel.spl.hostid"
net.ipv4.conf.all.forwarding = 1
net.ipv4.conf.default.forwarding = 1
net.ipv4.conf.eno1.forwarding = 1
net.ipv4.conf.lo.forwarding = 1
net.ipv4.conf.ovs-netdev.forwarding = 1
net.ipv4.conf.ovsdpdkbr0.forwarding = 1
net.ipv4.conf.tunl0.forwarding = 1
net.ipv4.conf.virbr0.forwarding = 1
net.ipv4.conf.virbr0-nic.forwarding = 1
net.ipv4.conf.vmnet1.forwarding = 1
net.ipv4.conf.vmnet8.forwarding = 1
net.ipv4.conf.vnet0.forwarding = 1
net.ipv4.conf.vnet1.forwarding = 1
net.ipv4.conf.vnet2.forwarding = 1
net.ipv4.conf.vnet3.forwarding = 1
net.ipv4.conf.vnet4.forwarding = 1
net.ipv4.conf.wlp110s0.forwarding = 1
net.ipv4.ip_forward = 1
net.ipv4.ip_forward_update_priority = 1
我注意到了这条消息dmesg
并且认为它可能会有所启发:
nf_conntrack: default automatic helper assignment has been turned off for security reasons and CT-based firewall rule not found. Use the iptables CT target to attach helpers instead.
答案1
Iptables 是内核 netfilter 钩子的前端。
所有这些客户端都使用相同的 netfilter 钩子来对数据包做出判决,我认为它们不会互相干扰。
用于传统防火墙任务的 BPF 是 bpfilter,但它相对较新,而且据我所知仍未合并到主线内核。
我们现在拥有的是 iptables-extensions 中的 xt-bpf,我想这就是你想要的。
内核 Netfilter 钩子点没有很好的 BPF 支持,真遗憾... 流量控制 BPF(tc-ebpf)在丢弃和修改数据包方面具有良好的功能,但钩子点不太方便。
答案2
笔记:该答案试图解释@Anthea Chen 的答案。
上述解释不应全信,因为它仅仅基于理论理解。
核心
过滤由 Linux 内核网络堆栈中的点执行
kernel netfilter hooks
,这些点允许某些功能(如 iptables)“接入”数据包处理流程。在这里,系统会决定如何处理网络数据包(例如,接受、拒绝、修改等)。该部分在数据包处理路径中的不同点工作(如PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING),非常适合实现防火墙和NAT。
内核还有另一部分,
tc-ebpf (Traffic Control eBPF)
负责流量控制。该部分在网络调度层运行,允许执行复杂的流量整形、数据包调度和分类任务。
tc-ebpf
可用于编写作为这些流量控制过程的一部分执行的 eBPF 程序。
客户netfilter
iptables
和nftables
是前面提到的前端(基本上是命令行实用程序)kernel netfilter hooks
,它们都存在于用户空间。bpfilter
,基于BPF
/eBPF
的防火墙,它也是一个前端,但由于它基于 BPF/eBPF,因此它会被编译成字节码,然后在内核空间的 BPF 虚拟机上沙盒运行,从而使其比 和 都更iptables
强大nftaples
。
正如@Anthea 提到的那样,他们都是 的客户kernel netfilter hooks
,可以毫无干扰地一起工作。
使用eBPF
bpfilter
被认为是iptables
和的替代方案nftables
。然而,它没有进入主线内核有一个
iptables
名为 的扩展xt-bpf
,它允许将BPF
字节码用于 中的规则。通过将 的语法包装到规则中iptables
,允许使用 的语法BPF
iptables
即使
tc-ebpf
在核心中可用并且可以直接使用BPF
语法,但它并不简单(不方便)并且会使防火墙的任务复杂化。