这几天试图用openwrt代替哇为交换机做DHCP域的隔离,遇到了亿点点问题,这里记一下
准备
需要fw4的openwrt,(fw3的配合br_netfilter和ebtables大概也能用,但这里肯定是讲nft了)
接口配置
大约是同一个交换机下直接走硬件转发了,直接用nft配置桥过滤大约是不能用的
可以在你的设备上手动测试一下:
nft create table bridge filter
nft create chain bridge filter forward '{type filter hook forward priority 0; policy drop;}'
然后在桥的两个不同端口上互相ping下,如果还能通,说明交换没有过cpu,就要用以下的骚操作了,如果已经不通了,就可以跳到nft过滤了
绕来绕去的配置
我的设备红米AC2100配置非常水的直接用的7621的内置千兆phy导出来4个接口,新OpenWRT的DSA下分别是lan1-3@eth0和wan@eth0,其中三个lan通过桥br-lan进行桥接
两个dhcp域分别在lan1和lan2
先更改下配置(luci配置比较简单,uci/直接改文件有点脑子转不过来):
在Network/Interfaces的Devices选项卡中配置br-lan:
- Bridge VLAN filtering中打开Enable VLAN filtering
- 添加vlan 1,lan1为untagged,PVID,其余为关
- 添加vlan 2,lan2为untagged,PVID,其余为关
经过这波操作,我们已经将两个lan变成俩vlan了,先不要应用,因为访问路由器的接口从br-lan变成br-lan.1了,应用了路由器就失联了
回到Network/Interfaces的Interfaces选项卡,将lan接口的接口配置改为br-lan.1,这时可以保存,验证是否还能正常访问
接下来在Network/Interfaces的Devices选项卡中添加一个配置,设备类型为桥设备,名字随便起,我就叫br-test了,桥端口选择br-lan.1和br-lan.2,这时还是不要应用
回到Network/Interfaces的Interfaces选项卡,将lan接口的接口配置改为br-test,这时可以保存,验证是否还能正常访问
经过以上的骚操作,我们已经将硬交换变成软交换了,就可以下一步写过滤了
nft过滤
再次验证是否可行:
nft create table bridge filter
nft create chain bridge filter forward '{type filter hook forward priority 0; policy drop;}'
如果ping不通了,说明软交换可以做转发过滤了,接下来
nft delete chain bridge filter forward
nft create chain bridge filter forward '{type filter hook forward priority 0; policy accept;}'
# dhcp
nft add rule bridge filter forward udp dport { 67, 68, 546, 547 } drop
# ra
nft add rule bridge filter forward icmp type { router-solicitation, router-advertisement } drop
# nd
nft add rule bridge filter forward icmpv6 type { nd-router-solicit, nd-router-advert } drop
具体要drop哪些自己决定,参考 nft官方的快速指南
接下来持久化配置
通过nft list ruleset
可以看到所有配置
table bridge filter {
chain forward {
type filter hook forward priority 0; policy accept;
udp dport { 67, 68, 546, 547 } drop
icmpv6 type { nd-router-solicit, nd-router-advert } drop
icmp type { router-advertisement, router-solicitation } drop
}
}
不管fw4那些,把我们的表复制粘贴下来保存到/usr/share/nftables.d/ruleset-post/some.nft
,通过fw4 reload
重新加载路由表,就完事啦