服务器小记
扔掉机顶盒!实现内网任意设备看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/null1.2 启动物理网卡
ip link set <STB_NIC> up
ip link set <IPTV_NIC> up1.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 br01.5 允许 VLAN 2–4094 通过
双网卡都要加,否则 VLAN 标签会被丢弃。
bridge vlan add dev <STB_NIC> vid 2-4094
bridge vlan add dev <IPTV_NIC> vid 2-40941.6 给网桥配私有 IP 并启用
ip addr add <BRIDGE_CIDR> dev br0
ip link set br0 up
ip link set br0 promisc on1.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 开机自启。