背景
接上文 浙江电信 IPTV 单线复用
为啥我又开始折腾这个。。。主要看到大佬(土豪)分享的 ubnt 全家桶方案,其中 SSID 绑定 VLAN 这个可以显著提高安全性。
出于设备利旧(穷)的考虑,得折腾下RT_AC86U
。。。不搞懂原理是配不出来的。。。
AC86U 用的博通方案,配置各种水土不服。从之前图形配置还是很难理解这个网络怎么打通的。
参考大佬资料,固件里面也没有 robocfg
命令,配置 VLAN 需要使用 vlanctl
指令。
分析
之前配置
- internet 无 vlan
- iptv VID=43
基于之前配置的单线复用模型,整理了下系统内的拓扑
主要的命令是
几个坑的地方
- lan 口和 ethx 为逆序匹配
- 找不到 vlan 处理的地方
通过配置的 VID=43
这个条件进行匹配,总数找到点配置了
1 2 3 4 5 6 7 8 9
| # nvram show | grep switch switch_stb_x=4 switch_wan0prio=0 switch_wan0tagid= switch_wan1prio=0 switch_wan1tagid=43 <--- 配置的 VID switch_wan2prio=0 switch_wan2tagid= switch_wantag=manual
|
switch_wan
这段还是比较难理解的,最后是在梅林的源码内找到解释
1 2 3 4 5
| https://github.com/MerlinRdev/86u-merlin/blob/9fab6492cdb7ba656bb0bc355a6c03b2539a41bb/release/src/router/rc/sysdeps/init-broadcom.c#L4332-L4339
wan_vid = nvram_get_int("switch_wan0tagid") & 0x0fff; iptv_vid = nvram_get_int("switch_wan1tagid") & 0x0fff; voip_vid = nvram_get_int("switch_wan2tagid") & 0x0fff;
|
vlan 规则分析
进一步源码查找,找到了配置 vlan 的地方,也就是vlanctl
调用的地方
vlanctl
也是坑,支持对规则的导出,但是输出到系统日志了。。在web 系统记录 - 一般记录文件
里面可以看到,后台在/tmp/syslog.log
用法 vlanctl --if eth0 --rx --tags 0 --show-table
处理 wan 流量
将 eth0
上,无 tag 流量(internet),都桥接到 eth0.v0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| eval("vlanctl", "--mcast", "--if-create", "eth0", "0"); // 都允许广播吧
# vlanctl --if eth0 --rx --tags 0 --set-rxif eth0.v0 --rule-append Nov 1 19:46:48 kernel: VLAN Rule Table : eth0, Rx, nbrOfTags 0, default DROP Nov 1 19:46:48 kernel: -------------------------------------------------------------------------------- Nov 1 19:46:48 kernel: ===> eth0 (ONT) : RX, 0 tag(s) Nov 1 19:46:48 kernel: Tag Rule ID : 0 Nov 1 19:46:48 kernel: Rx VLAN Device : eth0.v0 Nov 1 19:46:48 kernel: Filters Nov 1 19:46:48 kernel: VlanDev MacAddr : No Nov 1 19:46:48 kernel: Commands Nov 1 19:46:48 kernel: 00:[NOP, 0x00000000, 0x00000000] Nov 1 19:46:48 kernel: Rule Type : Flow Nov 1 19:46:48 kernel: Hit Count : 10831935 Nov 1 19:46:48 kernel: --------------------------------------------------------------------------------
# vlanctl --if eth0 --tx --tags 0 --filter-txif eth0.v0 --rule-append Nov 1 19:56:22 kernel: VLAN Rule Table : eth0, Tx, nbrOfTags 0, default ACCEPT Nov 1 19:56:22 kernel: -------------------------------------------------------------------------------- Nov 1 19:56:22 kernel: ===> eth0 (ONT) : TX, 0 tag(s) Nov 1 19:56:22 kernel: Tag Rule ID : 0 Nov 1 19:56:22 kernel: Rx VLAN Device : DEFAULT Nov 1 19:56:22 kernel: Filters Nov 1 19:56:22 kernel: Rx REALIF : Nov 1 19:56:22 kernel: Tx VLANIF : eth0.v0 Nov 1 19:56:22 kernel: Commands Nov 1 19:56:22 kernel: 00:[NOP, 0x00000000, 0x00000000] Nov 1 19:56:22 kernel: Rule Type : Flow Nov 1 19:56:22 kernel: Hit Count : 9623580 Nov 1 19:56:22 kernel: --------------------------------------------------------------------------------
|
https://github.com/MerlinRdev/86u-merlin/blob/9fab6492cdb7ba656bb0bc355a6c03b2539a41bb/release/src/router/rc/sysdeps/init-broadcom.c#L5336-L5342
处理 iptv 流量
- config ethPort1 = IPTV
- Forward packets from wan:eth0 to vlanDev1 (untag)
从 wan 进来 iptv 流量转发到 eth0.v0
,此处没有扒掉 vlan
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| # vlanctl --if eth0 --rx --tags 1 -filter-vid 0x2B 0 --set-rxif eth0.v0 --rule-append Nov 2 21:22:04 kernel: VLAN Rule Table : eth0, Rx, nbrOfTags 1, default DROP Nov 2 21:22:04 kernel: -------------------------------------------------------------------------------- Nov 2 21:22:04 kernel: ===> eth0 (ONT) : RX, 1 tag(s) Nov 2 21:22:04 kernel: Tag Rule ID : 0 Nov 2 21:22:04 kernel: Rx VLAN Device : eth0.v0 Nov 2 21:22:04 kernel: Filters Nov 2 21:22:04 kernel: VlanDev MacAddr : No Nov 2 21:22:04 kernel: VLAN Tag 0 : pbits -, cfi -, vid 43, (tci 0x0FFF/0x002B), ether - Nov 2 21:22:04 kernel: Commands Nov 2 21:22:04 kernel: 00:[NOP, 0x00000000, 0x00000000] Nov 2 21:22:04 kernel: Rule Type : Flow Nov 2 21:22:04 kernel: Hit Count : 4038665 Nov 2 21:22:04 kernel: --------------------------------------------------------------------------------
|
从 eth1 进来(rx)的流量(iptv 发出方向),自然需要添加 vlan,然后发到 eth1.v0
上
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| # vlanctl --if eth1 --rx --tags 0 --push-tag --set-vid 0x2B 0 --set-rxif eth1.v0 --rule-append Nov 1 19:51:52 kernel: VLAN Rule Table : eth1, Rx, nbrOfTags 0, default DROP Nov 1 19:51:52 kernel: -------------------------------------------------------------------------------- Nov 1 19:51:52 kernel: ===> eth1 (ONT) : RX, 0 tag(s) Nov 1 19:51:52 kernel: Tag Rule ID : 0 Nov 1 19:51:52 kernel: Rx VLAN Device : eth1.v0 Nov 1 19:51:52 kernel: Filters Nov 1 19:51:52 kernel: VlanDev MacAddr : No Nov 1 19:51:52 kernel: Commands Nov 1 19:51:52 kernel: 00:[PUSH_TAG, 0x00008100, 0x00000001] Nov 1 19:51:52 kernel: 01:[SET_VID, 0x0000002B, 0x00000000] <--- 设置 vid 43 Nov 1 19:51:52 kernel: Rule Type : Flow Nov 1 19:51:52 kernel: Hit Count : 2125 Nov 1 19:51:52 kernel: --------------------------------------------------------------------------------
|
从 eth1 出去的流量(进入iptv 方向),就要扒掉 vlan
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| # vlanctl --if eth1 --tx --tags 1 --filter-vid 0x2B 0 --filter-txif eth1.v0 --pop-tag --rule-append Nov 1 20:00:58 kernel: VLAN Rule Table : eth1, Tx, nbrOfTags 1, default ACCEPT Nov 1 20:00:58 kernel: -------------------------------------------------------------------------------- Nov 1 20:00:58 kernel: ===> eth1 (ONT) : TX, 1 tag(s) Nov 1 20:00:58 kernel: Tag Rule ID : 0 Nov 1 20:00:58 kernel: Rx VLAN Device : DEFAULT Nov 1 20:00:58 kernel: Filters Nov 1 20:00:58 kernel: Rx REALIF : Nov 1 20:00:58 kernel: Tx VLANIF : eth1.v0 Nov 1 20:00:58 kernel: VLAN Tag 0 : pbits -, cfi -, vid 43, (tci 0x0FFF/0x002B), ether - Nov 1 20:00:58 kernel: Commands Nov 1 20:00:58 kernel: 00:[POP_TAG, 0x00000000, 0x00000000] Nov 1 20:00:58 kernel: Rule Type : Flow Nov 1 20:00:58 kernel: Hit Count : 4038604 Nov 1 20:00:58 kernel: --------------------------------------------------------------------------------
|
https://github.com/MerlinRdev/86u-merlin/blob/9fab6492cdb7ba656bb0bc355a6c03b2539a41bb/release/src/router/rc/sysdeps/init-broadcom.c#L5546-L5566
另外,eth0.v0
、eth1.v0
都挂在 br1
下面,自然就通
抓包观察
在路由的 wan 口接了个交换机,mirror 流量后抓包
遗留问题
- 未分析internet和iptv 同时配置 vlan 为什么不行
- 不清楚 br1 收到 internet 流量后怎么和 br0 建立 nat 关系的
参考资料