圣堂之魂
服务器小记

扔掉机顶盒!实现内网任意设备看IPTV(中)

搭建 VLAN 透传网桥,旁路监听电信 IPTV 组播流量,抓包提取频道信息

本文是中篇。上篇介绍了整体思路、硬件准备和软件环境,本篇开始实际搭建网桥并抓包提取频道信息。


网卡角色

网卡接口名连接对象
USB 网卡<IPTV_NIC>光猫 IPTV 口
板载网卡<STB_NIC>机顶盒
WiFi 管理网卡<MGMT_NIC>不参与桥接,IP:<MGMT_IP>

以上接口名为占位符,请用 ip link 查看你自己的网卡名称,后续所有命令中替换为实际值。

占位符速查

本文及下篇中所有命令均使用占位符,开始前请先确定你自己的实际值:

占位符含义获取方式
<IPTV_NIC>接光猫 IPTV 口的网卡ip link 查看
<STB_NIC>接机顶盒的网卡ip link 查看
<MGMT_NIC>WiFi 管理网卡ip link 查看
<MGMT_IP>管理网卡的 IP 地址ip addr show <MGMT_NIC>
<BRIDGE_IP>网桥私有 IP自定义,如 10.0.0.1
<BRIDGE_CIDR>网桥 IP + 子网10.0.0.1/24
<UDPXY_PORT>udpxy HTTP 端口自定义,如 4022
<VIDEO_PORT>IPTV 视频 UDP 端口第二步抓包确定

第一步:搭建 VLAN 透传网桥

目的:将光猫 IPTV 口与机顶盒透明桥接,Linux 同时可监听所有流量。

1.1 清理残留

如果之前有残留网桥,先清理:

ip link del br0 2>/dev/null

1.2 启动物理网卡

ip link set <STB_NIC> up
ip link set <IPTV_NIC> up

1.3 创建带 VLAN 过滤的网桥

ip link add name br0 type bridge vlan_filtering 1
ip link set br0 type bridge mcast_snooping 1
参数说明
vlan_filtering 1启用 VLAN 过滤,支持 802.1Q 标签透传
mcast_snooping 1启用组播侦听,避免组播洪泛到所有端口

1.4 将物理网卡加入网桥

ip link set <STB_NIC> master br0
ip link set <IPTV_NIC> master br0

1.5 允许 VLAN 2–4094 通过

双网卡都要加,否则 VLAN 标签会被丢弃。

bridge vlan add dev <STB_NIC> vid 2-4094
bridge vlan add dev <IPTV_NIC> vid 2-4094

1.6 给网桥配私有 IP 并启用

ip addr add <BRIDGE_CIDR> dev br0
ip link set br0 up
ip link set br0 promisc on

1.7 验证

bridge link show               # 两个网卡均在 br0 中
bridge vlan show | head -5     # 应包含 vid 2–4094
ip addr show br0 | grep inet   # 应有 inet <BRIDGE_CIDR>

此时机顶盒开机应能正常获取 IP、播放电视。


第二步:抓包获取频道组播信息

网桥搭好后,机顶盒正常看电视,Linux 在中间默默旁路所有流量。接下来抓包提取频道的组播地址和端口。

2.1 抓取组播 UDP 流量

tcpdump -i br0 -n 'udp and dst net 239.0.0.0/8' -w iptv_all.pcap

保持终端运行,不要关闭。

2.2 机顶盒逐频道换台

用遥控器换台,每个频道停留约 5 秒,尽可能切完所有频道。换台结束按 Ctrl+C 停止抓包。

2.3 提取组播地址列表

tcpdump -r iptv_all.pcap -n 'udp' | grep -oP '239\.\d+\.\d+\.\d+' | sort -u

例如本案例中提取到的组播地址:

239.45.1.101
239.45.1.102
239.45.1.103
239.45.1.104
239.45.1.105
239.45.1.106
239.45.1.201
239.45.1.202

以上为虚构示例,你实际提取到的地址会完全不同。

2.4 确定 UDP 端口

tcpdump -r iptv_all.pcap -n 'udp' | grep -oP '\d+\.\d+\.\d+\.\d+\.\K\d+' | sort | uniq -c | sort -nr | head -20

本案例中视频端口为 <VIDEO_PORT>


下一步

完成抓包后,我们已经掌握了所有频道的组播地址和 UDP 端口。接下来在下篇中,将安装 udpxy 把组播流转为 HTTP 单播,然后逐个播放确认频道名称,并配置 systemd 开机自启。


本页目录