有人可以解释一下 iptables、nftables 和 bpf 之间的相互作用吗?

有人可以解释一下 iptables、nftables 和 bpf 之间的相互作用吗?

我在 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 的答案。

上述解释不应全信,因为它仅仅基于理论理解。


核心

  1. 过滤由 Linux 内核网络堆栈中的点执行kernel netfilter hooks,这些点允许某些功能(如 iptables)“接入”数据包处理流程。在这里,系统会决定如何处理网络数据包(例如,接受、拒绝、修改等)。

    该部分在数据包处理路径中的不同点工作(如PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING),非常适合实现防火墙和NAT。

  2. 内核还有另一部分,tc-ebpf (Traffic Control eBPF)负责流量控制。

    该部分在网络调度层运行,允许执行复杂的流量整形、数据包调度和分类任务。tc-ebpf可用于编写作为这些流量控制过程的一部分执行的 eBPF 程序。

客户netfilter

  • iptablesnftables是前面提到的前端(基本上是命令行实用程序)kernel netfilter hooks,它们都存在于用户空间。

  • bpfilter,基于BPF/eBPF的防火墙,它也是一个前端,但由于它基于 BPF/eBPF,因此它会被编译成字节码,然后在内核空间的 BPF 虚拟机上沙盒运行,从而使其比 和 都更iptables强大nftaples

正如@Anthea 提到的那样,他们都是 的客户kernel netfilter hooks,可以毫无干扰地一起工作。

使用eBPF

  • bpfilter被认为是iptables和的替代方案nftables。然而,它没有进入主线内核

  • 有一个iptables名为 的扩展xt-bpf,它允许将BPF字节码用于 中的规则。通过将 的语法包装到规则中iptables,允许使用 的语法BPFiptables

  • 即使tc-ebpf在核心中可用并且可以直接使用BPF语法,但它并不简单(不方便)并且会使防火墙的任务复杂化。

相关内容