今天早上还在睡懒觉,就被媳妇摇起来说网络不通了,让媳妇连到光猫的无线上先凑合用着。

先摆出咱家的简单拓扑图

+------+       +-------+       +----+
| 光 猫 +------>+ 路由器 +------>+ 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客户端,跃点也根之前一样,一切回归日常。

至此,完结撒花🎉🎉🎉