Netfilter hooks

Netfilter hooks—-https://wiki.nftables.org/wiki-nftables/index.php/Netfilter_hooks
kernel 在线源码(代码可跳转)—-https://elixir.bootlin.com/linux/v5.4.281/source/net
Netfilter 与iptables/ebtables
ebtables
Netfilter 在 链路层(L2)提供了以下 6 个 hook 点
|
|
ebtables 即以太网桥防火墙,以太网桥工作在数据链路层,ebtables用来过滤数据链路层数据包。在内核中,ebtables 的数据截获点比 iptables 更“靠前”,它获得的数据更“原始”,ebtables 多用于桥模式,比如控制 VLAN ID 等。 ebtables 的配置分为表、链和规则三级。
- ebtables 有三个tables:filter ,nat ,broute
- filter:过滤本机流入流出的数据包时默认使用的表。 它包含有 3 条链,分别为 INPUT 链、OUTPUT 链、FORWARD 链。
- nat :主要用于修改数据帧的MAC地址,实现地址转换(mac-NAT)。 它包含有 3 条链,分别为 PREROUTING 链、OUTPUT链、POSTROUTING 链。
- broute:网桥的一种特殊工作模式,它可以根据配置对满足某些规则的包送入三层进行路由;也可以根据配置对满足某些规则的二层包进行 bridge。类似于 VPP(Vector packet processing)中的 bridge-domain。它只有 1 个 BROUTING 链。
- ebtables 共分为以下 6 条内置链:
- INPUT: 数据帧的目的地址是网桥本身。
- FORWARD: 被网桥转发的数据帧。
- OUTPUT: 处理网桥自身产生并向外发送的数据帧。同样用于修改目的MAC地址,但作用范围仅限于本机发出的流量
- PREROUTING: 处理刚进入网桥的数据帧,在桥接决策之前生效。这是修改目的MAC地址(MAC DNAT)的理想位置,可以实现流量重定向。
- POSTROUTING: 处理即将离开网桥的数据帧,在桥接决策之后生效。这是修改源MAC地址(MAC SNAT)的地方,可以实现MAC地址伪装
- BROUTING: 以太帧进入网桥设备后首先通过的就是 BROUTING 链,经过 BROUTING 后才决定数据包是进入网桥转发处理流程还是本地路由处理流程。
BROUTING链,当规则返回ACCEPT时,意味着“我允许这个帧通过”。这个帧会被视为普通的桥接流量,进入标准的桥接处理流程。接下来,内核会去查找MAC地址表,根据目的MAC决定是将它转发到另一个桥接端口,还是递交给本机的上层协议栈(如果目的MAC是本机网桥的MAC)。当规则返回 DROP 时,在 BROUTING 链的语境下,它有一个特殊含义:“中断桥接”(skb should be routed, not bridged.)。内核收到这个信号后,就不会再把这个数据帧当成二层流量来处理了。相反,它会把这个帧“踢”给上层的 IP 协议栈。此时,这个帧就变成了一个普通的 IP 数据包,后续会进入 iptables 的 PREROUTING 链,并最终根据路由表来决定是发给本机还是路由转发。可查看
bridge\netfilter\ebtable_broute.c的 ebt_broute 函数。
|
|
iptables
Netfilter 在 网络层(L3)提供了以下 5 个 hook 点,包经过协议栈时会触发内核模块注册在这里的处理函数。触发哪个 hook 取决于包的方向(ingress/egress)、包的目的地址、包在上一个 hook 点是被丢弃还是拒绝等等
|
|
|
|
-
iptables 有四个表raw ,mangle ,nat ,filter
- filter 表:过滤(放行/拒绝)
- nat 表:网络地址转换
- mangle 表:修改 IP 头,可以修改数据包的 TTL;还可以对数据包打上只在内核内有效的“标记”(internal kernel “mark”),后续的 table 或工具可以根据这些标记进行处理。标记不会修改包本身,只是在包的内核表示上做标记。iptables 只能在 mangle 表中打 mark,在 ebtables 中,所有的表(filter、nat、broute)都可以用来打 mark。
- raw 表:conntrack 相关,iptables 防火墙是有状态的:对每个数据包进行判断的时候是依赖已经判断过的数据包。建立在 netfilter 之上的连接跟踪(connection tracking)特性使得 iptables 将数据包看作是已有连接或会话的一部分,而不是一个由独立、不相关的数据包而组成的流。
-
不同场景下报文的游走流程:
- 收到的、目的是本机的包: PRETOUTING -> INPUT
- 收到的、目的是其他主机的包: PRETOUTING -> FORWARD -> POSTROUTING
- 本地产生的包: OUTPUT -> POSTROUTING