诊断一次光猫桥接拨号不通故障
主要是电信偷偷摸摸升级了光猫固件,导致我之前的部分光猫配置失效了,导致了接口异常。
今天早上还在睡懒觉,就被媳妇摇起来说网络不通了,让媳妇连到光猫的无线上先凑合用着。
先摆出咱家的简单拓扑图
+------+ +-------+ +----+
| 光 猫 +------>+ 路由器 +------>+ AP |
+------+ +-------+ +----+
光猫:2019年办宽带送的天邑TEWA-708E
路由器:2011年上大学时候买的TP-Link tl-wr1041n v2
AP:2017年看到koolshare论坛做活动买的UniFi AC Pro AP
光猫除了光电转换,还负担着分离电信的电话和iTV业务,也没法简单地用Pon Stick替换。
路由器上架着小飞机透明代理(刚需)、KMS(刚需)、网络启动服务,所以没有直接通过光猫上网。家里网速还没超过500Mbps,这个路由器还能hold得住nat转发;只是算力不够,小飞机只能负载到20Mbps左右。
AP是802.11ac的,虽然802.11ax已经出来了,但是家里目前802.11ac也够用了。
它们仨组成了咱贫穷但实用的家庭网络核心。
这次事故的主要问题是在光猫上,我之前想要通过路由器转发IPTV而设置的VLAN绑定,在运营商后台更新固件之后异常了。事故解决很简单,删掉重建就搞定了。
下面是排查过程
网络结构
起因
一开始,就是上面简单的拓扑结构,后来媳妇想要看某流量男星的《天天向上》,刚好想到电信套餐里面由iTV,就去营业厅领了个机顶盒,插上光猫的iTV口就自动配置好,就能看了;后来媳妇觉得大周末的在大屏幕前,正襟危坐地看片不舒服,要能在床上、沙发上用手机/iPad看,于是开始了折腾之旅。
光猫侧变动
首先,拿到光猫超密,开启千兆端口的桥接模式。(其实不用超管也行,主界面上就有直接开启桥接)。关于拿到TEWA-708E的超密,可以看koolshare的帖子和我的例子。
拿到超密后,新建了一个跟INTERNET-R-VID-1274很像的INTERNET-B-VID-1274。1274是成都电信我这个片区的PPP通道的VLAN id,B就是bridge,R就是router。
R模式绑到无线的SSID 1上,方便路由器挂了之后让媳妇切换过去,不用挨骂,毕竟路由器可能会有一段折腾的时间;B模式绑定到1和4号口,1号口是千兆口给路由器用的,4号口是笔记本直接插上去做测试用的。
然后顺便把Other_B_VID_43(iTV业务)绑到2号口(iTV口)和3号口上去。3号口也是方便笔记本直接插上去测试IPTV用的,毕竟我还没试过用电脑直接播放过IPTV过。
接着新建VLAN绑定,新建1号口和4号口到Other_B_VID_43的绑定,用户侧VLAN可以随意(1-4095,0和4096在不同厂商那儿可能是保留id),我定的也是43,和上游保持一致,好对照着找。
光猫侧测试
首先,直连测试iTV,保证上游没出毛病。
找个网上下载的比较新的咱这儿四川电信的IPTV播放列表,.m3u格式的;电脑直接插3号口,打开VLC/PotPlayer,把m3u丢进去,能正常播放,说明电脑能直接播放IPTV,不错不错。第一次接触组播,感觉挺神奇,电脑拿到的是169的保留地址,没有网关,IPTV的RTP组播是224-239段的地址,居然还能成功拿到视频数据。
然后,电脑直接插4号口,测试PPPoE拨号,大概率能通,保证拨号是正常的。
接着,测试iTV,电脑网口开启VLAN,Windows设备在网卡驱动里面可以设置,macOS在网络-(加减号旁边的下拉框)管理虚拟接口-新建VLAN。在连接到4号口的网口上新建VLAN 43。再重复一次上面测试播放的流程,macOS需要关闭雷雳接口的网络,避免组播走默认路由的雷雳接口,而不走VLAN接口。这个测试也是大概率成功。
路由器侧准备工作
抓取iTV机顶盒的认证信息。
成都电信的机顶盒是通过DHCP认证信息获取IP地址,然后通过内置的客户信息进行付费服务支付;我们只需要认证信息就行了。
机顶盒关机,和电脑网线直连
在机顶盒屁股上找到他的mac
电脑上启动wireshark,wireshark里面找到和机顶盒直连的网口,设置初始过滤器为"ether host 机顶盒mac",点击start开始抓包;然后设置实时过滤器为"eth.src == 机顶盒mac",抓到第一个"DHCP Discover "就可以停了。可以找到类似下面的信息
Dynamic Host Configuration Protocol (Discover)
Message type: Boot Request (1)
Hardware type: Ethernet (0x01)
Hardware address length: 6
Hops: 0
Transaction ID: 0x9a5823da
Seconds elapsed: 0
Bootp flags: 0x0000 (Unicast)
0... .... .... .... = Broadcast flag: Unicast
.000 0000 0000 0000 = Reserved flags: 0x0000
Client IP address: 0.0.0.0
Your (client) IP address: 0.0.0.0
Next server IP address: 0.0.0.0
Relay agent IP address: 0.0.0.0
Client MAC address: SichuanT_31:3e:05 (c0:1b:23:31:3e:05)
Client hardware address padding: 00000000000000000000
Server host name not given
Boot file name not given
Magic cookie: DHCP
Option: (53) DHCP Message Type (Discover)
Length: 1
DHCP: Discover (1)
Option: (12) Host Name
Length: 32
Host Name: 00109116060100A00000C01B23313E55
Option: (60) Vendor class identifier
Length: 5
Vendor class identifier: SCITV
Option: (61) Client identifier
Length: 7
Hardware type: Ethernet (0x01)
Client MAC address: SichuanT_31:3e:05 (c0:1b:23:31:3e:05)
Option: (55) Parameter Request List
Length: 7
Parameter Request List Item: (1) Subnet Mask
Parameter Request List Item: (3) Router
Parameter Request List Item: (6) Domain Name Server
Parameter Request List Item: (15) Domain Name
Parameter Request List Item: (28) Broadcast Address
Parameter Request List Item: (31) Perform Router Discover
Parameter Request List Item: (33) Static Route
Option: (255) End
Option End: 255
Padding: 000000000000000000000000000000000000000000000000000000000000000000000000…
其中关键的字段是
Client MAC address:对应OpenWRT的网口macaddr。
Option: (12) Host Name:是设备上的STB ID,对应OpenWRT的网口hostname。
Option: (60) Vendor class identifier:对应OpenWRT的网口venderid。
Option: (61) Client identifier:对应OpenWRT的网口clientid。
对这些识别码做轻微的变更,譬如末位数加一,备用。
路由器侧变更
首先编译一个带igmp proxy和udpxy(用于通过http看iptv,不是必要)的固件,当然如果你的固件支持安装这两个包也行。
进入OpenWRT的交换机页面,新建一个vlan,绑定到wan口,编号为43(与上文的用户侧VLAN一致。
进入OpenWRT的接口界面,新建一个接口,绑定到刚刚新建的vlan 43的交换机接口上,同时新建一个叫做IPTV的防火墙域。传输协议为DHCP客户端,网关跃点为20(反正比0大就行),hostname、客户端id、vendor class选项、重设mac地址填上刚刚准备的数据。这样我们就有一个伪造的虚拟机顶盒了。
然后改配置文件的时候到了,ssh或者winscp连到路由器上。
打开/etc/config/network文件,找到lan的配置,新增一个 option igmp_snooping '1'。
打开/etc/config/igmpproxy,配置改成这样,细节请去查OpenWRT的IGMP Proxy文档。
config igmpproxy
option quickleave 1
# option verbose [0-3](none, minimal[default], more, maximum)
config phyint
option network iptv
option zone iptv
option direction upstream
list altnet 0.0.0.0/0
config phyint
option network lan
option zone lan
option direction downstream
打开/etc/config/firewall,新增如下配置。
config rule
option proto 'udp'
option name 'IPTV-DHCP'
option family 'ipv4'
option src 'iptv'
option dest_port '68'
config rule
option target 'ACCEPT'
option name 'IPTV-IGMP'
option family 'ipv4'
option proto 'igmp'
option src 'iptv'
config rule
option target 'ACCEPT'
option dest 'lan'
option name 'ALLOW-MULTICAST'
option proto 'udp'
option dest_ip '224.0.0.0/4'
option family 'ipv4'
option src 'iptv'
config rule
option name 'udpxy'
option src 'iptv'
option proto 'udp'
option dest_ip '224.0.0.0/4'
option target 'ACCEPT'
option family 'ipv4'
最后是udpxy的配置,去OpenWRT界面上就行:启用,bind interface为br-lan,端口4022保存完成。
路由侧测试
老样子,开启播放器测一把就行。我这边测出来直连路由器的设备播放不卡顿,而通过AP连接的设备,卡成狗。原因很简单,AP还没开启IGMP转发。
AP侧变动
开启ubnt的controller软件,找到AP的无线配置,就是设置密码那里,有个高级设置,展开后勾选IGMPv3,保存。然后测试通过。
其他变动
因为每次查看光猫都要切换网络,有点嫌麻烦,于是把光猫的IP改到192.168.0.1,然后把在路由器上再加了一个静态IP客户端,名字叫做modem,跃点设置为40(比IPTV优先级还低),这样就能在路由器网络下也能登陆光猫了。
网络结构部分完成。
诊断过程
首先,路由器上查看日志,已经好几个小时都拨号不上了,但是媳妇连接的光猫无线却能正常上网;所以确认光纤线路是没有问题的。然后打开了机顶盒,IPTV也能正常看,再次确认光纤线路没问题;那么只能出在路由器到光猫这段线路。
笔记本直接连到光猫的4号口,拿不到IP,预料之内,本来也没有在4号口开DHCP。
设置静态IP,ping不通猫,不正常,说明问题在猫一侧。
启用笔记本上之前的iTV VLAN,IPTV播放不了,看来VLAN有问题。
笔记本做PPPoE拨号,不通,看来拨号也有问题。
笔记本无线连到光猫,能上网,可以搜点资料。
打开光猫页面,发现软件版本更新时间为2020/09/23 09:20:56,看来电信的确在后台升级过光猫,去网络界面,发现路由模式的配置下面有个"PPPoE路由桥混合模式",决定干掉我的桥接配置,启用这个混合模式。测试PPPoE还是失败,当然,还没有去动那个VLAN呢。
删除VLAN绑定,PPPoE测试通过;重新建立VLAN绑定,IPTV测试通过。
打开路由器界面,重新连接几个接口,PPPoE拨号成功,IPTV试看成功。顺便把路由器的modem接口改成DHCP客户端,跃点也根之前一样,一切回归日常。
至此,完结撒花???