如何使用nft在Linux网桥br0上阻止特定IP地址的访问?
没问题,针对你这个网桥场景,用nftables来实现IP拦截完全可行,而且比老的ebtables更灵活。我给你一步步讲清楚怎么做:
先确认nftables已安装
Ubuntu默认应该已经预装了nftables,如果没装的话,执行这条命令安装:sudo apt update && sudo apt install nftables创建网桥专用的nft表和链
因为我们要处理网桥的转发流量,得用bridge族的表。先创建一个自定义表(比如叫br_filter),并启用forward链——网桥的转发流量默认走这个链:sudo nft add table bridge br_filtersudo nft add chain bridge br_filter forward { type filter hook forward priority 0 ; policy accept ; }添加拦截规则
你的需求是阻止PC(eth1接口)和1.1.1.1之间的所有通信,所以要加两条双向拦截规则:
- 阻止PC发往1.1.1.1的流量:
sudo nft add rule bridge br_filter forward iifname eth1 ip daddr 1.1.1.1 drop - 阻止1.1.1.1发往PC的流量:
sudo nft add rule bridge br_filter forward oifname eth1 ip saddr 1.1.1.1 drop
简单解释下关键参数:
iifname eth1:匹配从eth1接口进来的流量(也就是PC发出来的数据包)ip daddr 1.1.1.1:匹配目标IP是1.1.1.1的流量drop:直接丢弃符合条件的流量,不让它通过网桥oifname eth1:匹配要发往eth1接口的流量(也就是给PC的数据包)ip saddr 1.1.1.1:匹配源IP是1.1.1.1的流量
验证规则生效
执行sudo nft list ruleset,你应该能看到刚才添加的两条规则。然后从PC那边尝试ping 1.1.1.1,应该无法连通;同时访问其他外网IP正常,就说明规则生效了。永久保存规则(可选)
如果测试完想保留这个拦截规则,把当前规则导出到配置文件:sudo nft list ruleset > /etc/nftables.conf
然后重启nftables服务让配置生效:sudo systemctl restart nftables
这样系统重启后规则会自动加载。如果只是临时模拟故障测试,不用这一步——重启机器或者用nft delete rule命令删掉规则就能恢复正常。
备注:内容来源于stack exchange,提问作者Michael

