Kernel Netfilter初探

![[Pasted image 20231022084145.png|Pasted image 20231022084145.png]]

  • prerouting:数据进来还未查询路由表之前的规则。
  • input:由外部发往用户空间内部的规则。(
    说直白点就是负责过滤目标地址是本机的数据包)
  • forward:不进入用户空间,进行路由转发的规则。(负责转发流经主机但不进入本机的数据包)
  • postrouting:查询完路由表后,将要转发的规则。
  • output:由用户空间内部发往外部的规则。(负责处理本机发出的数据包)

ebtables-nft: iptables源代码,不过后端是nftables. ebtables-legacy: 使用iptables作为后端

ebtables的brouting功能

![[Pasted image 20231020141953.png|Pasted image 20231020141953.png]] 用于控制进来的数据包是需要进行bridge转发还是进行route转发,即2层转发和3层转发。

ACCEPT DROP
BROUTE bridge it route it
FORWARD 接收,当前主Chain后rule不再匹配处理 丢弃

关于nftables中的brouting支持,直到linux kernel 6.4 才在nftables中引入 如果要使用应该对包设置Setting packet metainformation - nftables wikimeta broute set 1

代码实例: 对来自wan接口的流量,ipv6流量丢弃处理。

  • ebtables-legacy
ebtables -t broute -A BROUTING -p !ipv6 -j DROP -i wan
  • nftables
table bridge b {
	chain prerouting{
		type filter hook prerouting priority -250; policy accept;
		ether type !=ip6 iifname wan meta broute set 1 accept
	}
}

目前ebtables-nft 也接收到了相关patch,将自动对包添加该meta标记。

实际应用: ipv4 nat + ipv6 bridge cvmiller/v6brouter: IPv6 bridge and IPv4 router (NAT) shell script for OpenWRT (github.com)