如何利用nftables拦截macvtap接口流量并配置防护规则?
如何利用nftables拦截macvtap接口流量并配置防护规则?
嘿,这个问题我太熟了!macvtap的流量路径和普通网卡不一样,默认的nftables规则(比如ip/inet表的那些)根本碰不到它,因为它直接在数据链路层和物理网卡交互,没走主机的IP转发栈。不过别担心,用对nftables的表和hook点就能搞定,我给你拆解一下:
为什么你的规则不生效?
macvtap本质是物理网卡上的“虚拟tap设备”,它的流量绕过了主机的IP层处理流程——也就是说,那些在ip filter表的input/forward/output链上的规则,根本看不到macvtap的数据包。你之前用meta tracing只看到物理网卡enp88s0的流量,就是这个原因。
解决方案:用对nftables的表和Hook点
根据你的macvtap工作模式,分两种情况处理:
情况1:macvtap用的是VEPA/Private模式(默认)
这种模式下,macvtap直接绑定物理网卡,流量不经过网桥,你需要用netdev表——这个表专门处理进出网络设备的底层流量,不管有没有经过IP层。
举个符合你需求的规则示例:
# 创建netdev表和对应的链 table netdev macvtap_filter { # 处理macvtap0的入站流量 chain ingress_macvtap { type filter hook ingress device "macvtap0" priority -100; policy accept; # 先放行你需要的例外地址(替换成你的实际网关/DNS/广播) ip daddr 192.168.1.1 accept # 网关IP ip daddr 192.168.1.2 accept # DNS服务器IP ip daddr 255.255.255.255 accept # 广播地址 # 拒绝其他192.168.0.0/16的流量 ip daddr 192.168.0.0/16 drop # 剩下的流量默认放行 } # 处理macvtap0的出站流量 chain egress_macvtap { type filter hook egress device "macvtap0" priority -100; policy accept; # 同样放行例外地址,拒绝其他192.168段的出站流量 ip saddr 192.168.0.0/16 ip daddr != {192.168.1.1, 192.168.1.2, 255.255.255.255} drop } }
情况2:macvtap连接到Linux网桥(Bridge模式)
如果你的macvtap是挂在网桥上的,那就要用bridge表来处理转发流量:
table bridge macvtap_bridge_filter { chain forward { type filter hook forward priority -100; policy accept; # 针对macvtap0的入站流量,放行例外,拒绝其他192.168段 iifname "macvtap0" ip daddr {192.168.1.1, 192.168.1.2, 255.255.255.255} accept iifname "macvtap0" ip daddr 192.168.0.0/16 drop # 针对macvtap0的出站流量,同理处理 oifname "macvtap0" ip saddr 192.168.0.0/16 ip daddr != {192.168.1.1, 192.168.1.2, 255.255.255.255} drop } }
验证规则是否生效
你可以用nft的trace功能来确认规则是否命中:
nft monitor trace
然后在虚拟机里发起测试流量(比如ping一个被拒绝的192.168地址),如果看到trace信息里显示macvtap0的数据包被你的规则处理,就说明生效了。
最后别忘了保存规则
把配置好的规则保存到nftables的配置文件里,确保开机自动加载:
nft list ruleset > /etc/nftables.conf systemctl enable --now nftables
备注:内容来源于stack exchange,提问作者Etki
相关产品推荐
相关产品推荐

