0%

浙江电信 IPTV 单线复用之后台配置分析

背景

接上文 浙江电信 IPTV 单线复用

为啥我又开始折腾这个。。。主要看到大佬(土豪)分享的 ubnt 全家桶方案,其中 SSID 绑定 VLAN 这个可以显著提高安全性。
出于设备利旧(穷)的考虑,得折腾下RT_AC86U。。。不搞懂原理是配不出来的。。。

AC86U 用的博通方案,配置各种水土不服。从之前图形配置还是很难理解这个网络怎么打通的。
参考大佬资料,固件里面也没有 robocfg 命令,配置 VLAN 需要使用 vlanctl 指令。

分析

之前配置

  • internet 无 vlan
  • iptv VID=43

基于之前配置的单线复用模型,整理了下系统内的拓扑

主要的命令是

  • brctl show
  • nvram show

几个坑的地方

  • 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.v0eth1.v0 都挂在 br1 下面,自然就通

抓包观察

在路由的 wan 口接了个交换机,mirror 流量后抓包

遗留问题

  • 未分析internet和iptv 同时配置 vlan 为什么不行
  • 不清楚 br1 收到 internet 流量后怎么和 br0 建立 nat 关系的

参考资料