服务器小记
扔掉机顶盒!实现内网任意设备看IPTV(下)
安装 udpxy 组播转单播,配置 systemd 自启,重启验证
本文是下篇。上篇介绍了环境准备,中篇完成了网桥搭建和抓包,本篇完成 udpxy 安装、systemd 固化和故障排查。
第一步:安装并配置 udpxy
udpxy 的作用是把 UDP 组播流转为 HTTP 单播流,这样内网任何设备只需要一个 HTTP URL 就能播放 IPTV。
1.1 编译安装
apt install -y gcc make wget
wget http://www.udpxy.com/download/1_0_24_1/udpxy_v1.0-24-1-prod.tar.gz
tar -xzf udpxy_v1.0-24-1-prod.tar.gz
cd udpxy-1.0.24-1
make
install -m 755 udpxy /usr/local/bin/1.2 手动启动测试
/usr/local/bin/udpxy -a <MGMT_IP> -p <UDPXY_PORT> -m <BRIDGE_IP> -S| 参数 | 含义 |
|---|---|
-a <MGMT_IP> | HTTP 服务监听地址(内网可达) |
-p <UDPXY_PORT> | HTTP 端口 |
-m <BRIDGE_IP> | 上游组播接口(br0 的 IP,必须用 IP 而非接口名) |
-S | 启用 status 页面 |
1.3 测试播放
VLC 打开网络串流:
http://<MGMT_IP>:<UDPXY_PORT>/udp/<组播地址>:<VIDEO_PORT>逐一播放,记录频道名称与地址的对应关系。
有画面说明 udpxy 工作正常,记下每个频道的组播地址。
1.4 对应频道名称
用 VLC 逐个播放 http://<MGMT_IP>:<UDPXY_PORT>/udp/<组播地址>:<VIDEO_PORT>,看画面确认频道名,建立映射表:
| 组播地址 | 频道 |
|---|---|
239.45.1.101 | 江苏卫视 |
239.45.1.102 | 浙江卫视 |
239.45.1.103 | 北京卫视 |
239.45.1.104 | 湖南卫视 |
239.45.1.105 | 东方卫视 |
239.45.1.106 | CCTV9 纪录 |
239.45.1.201 | CCTV13 新闻 |
239.45.1.202 | CCTV6 电影 |
以上地址为虚构示例,各地运营商组播地址不同,必须自己抓包获取,照抄必然失败。
第二步:固化 systemd 服务(开机自启)
手动命令重启后就没了,接下来把网桥和 udpxy 都写成 systemd 服务。
2.1 网桥服务
创建 /etc/systemd/system/iptv-bridge.service:
[Unit]
Description=IPTV bridge setup
Wants=network.target
After=network.target
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStartPre=/usr/sbin/ip link set <STB_NIC> up
ExecStartPre=/usr/sbin/ip link set <IPTV_NIC> up
ExecStartPre=-/usr/sbin/ip link del br0
ExecStartPre=/usr/sbin/ip link add name br0 type bridge vlan_filtering 1
ExecStartPre=/usr/sbin/ip link set br0 type bridge mcast_snooping 1
ExecStart=/usr/sbin/ip link set <STB_NIC> master br0
ExecStart=/usr/sbin/ip link set <IPTV_NIC> master br0
ExecStart=/usr/sbin/bridge vlan add dev <STB_NIC> vid 2-4094
ExecStart=/usr/sbin/bridge vlan add dev <IPTV_NIC> vid 2-4094
ExecStart=/usr/sbin/ip addr add <BRIDGE_CIDR> dev br0
ExecStart=/usr/sbin/ip link set br0 up
ExecStart=/usr/sbin/ip link set br0 promisc on
ExecStop=-/usr/sbin/ip link del br0
[Install]
WantedBy=multi-user.targetExecStartPre 前的 - 表示忽略命令失败(如 br0 不存在时删除不报错)。<STB_NIC> 和 <IPTV_NIC> 是占位符,替换为你自己的网卡接口名。
2.2 udpxy 服务
创建 /etc/systemd/system/udpxy.service:
[Unit]
Description=udpxy IPTV relay service
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/bin/udpxy -a <MGMT_IP> -p <UDPXY_PORT> -m <BRIDGE_IP> -S -B 2097152
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.targetType=forking 是必须的,因为 udpxy 默认会 daemonize(后台运行)。如果写成 Type=simple,systemd 会认为进程已退出并不断重启。
| 参数 | 说明 |
|---|---|
-B 2097152 | 2MB 缓冲区,减少卡顿 |
Restart=always | 崩溃后自动重启 |
RestartSec=5 | 重启间隔 5 秒 |
2.3 启用并启动
systemctl daemon-reload
systemctl enable iptv-bridge udpxy
systemctl restart iptv-bridge
systemctl restart udpxy
systemctl status iptv-bridge udpxy网桥服务保证先启动(需要几秒),然后 udpxy 才能绑定到 br0 的 IP。
第三步:重启验证
reboot重启后检查:
systemctl status iptv-bridge udpxy | grep Active
# 应输出:
# Active: active (exited) since ... (iptv-bridge)
# Active: active (running) since ... (udpxy)
ip addr show br0 | grep inet # 应有 inet <BRIDGE_CIDR>
ss -tulnp | grep <UDPXY_PORT> # 应显示 <MGMT_IP>:<UDPXY_PORT> 在监听用 VLC 测试任意频道,确认播放正常。
内网设备使用
| 设备 | 方法 |
|---|---|
| 电脑 | VLC / PotPlayer 直接输入 HTTP 地址 |
| 安卓电视/盒子 | VLC / Kodi 输入 HTTP 地址 |
| 手机/平板 | VLC 移动版 → 网络串流 |
所有设备需能访问 <MGMT_IP>:<UDPXY_PORT>(同一局域网)。
补充扩展
增加频道
- 用 VLC 播放
http://<MGMT_IP>:<UDPXY_PORT>/udp/<新组播地址>:<VIDEO_PORT> - 有画面 → 记录下来;黑屏 → 跳过或等待机顶盒开该频道时再试
- udpxy 会在客户端请求时自动发送 IGMP 加入,无需手动操作
故障排查
| 现象 | 可能原因 | 解决 |
|---|---|---|
| 机顶盒黑屏 | 网桥未正确建立 | bridge link show 检查,重建网桥 |
| VLC 打不开流 | udpxy 未运行或绑定失效 | systemctl restart udpxy |
| 播放黑屏无画面 | 组播流未推送 | 等待 udpxy 自动加入,或检查网桥 VLAN 配置 |
bridge vlan add 报错 | 网卡未在桥中 | 先执行 ip link set <网卡> master br0 |
ip maddr add 报错 Invalid address length | 新版 iproute2 不接受 IP | 不需要此命令,udpxy 会自动处理 |
| 重启后 USB 网卡名变化 | udev 重命名 | 更新 iptv-bridge.service 中的接口名 |
| udpxy 端口被占用 | 重复启动 | ss -tulnp | grep <UDPXY_PORT> 查进程,kill 后重启 |
| 服务 inactive (dead) | Type 不匹配 | udpxy 必须用 Type=forking |
关键技术参数速查
| 参数 | 值 | 说明 |
|---|---|---|
| 网桥名 | br0 | 可自定义,保持一致 |
| 网桥 IP | <BRIDGE_CIDR> | 仅用于组播收发,不需网关 |
| udpxy 监听 IP | <MGMT_IP> | WiFi 管理网卡地址 |
| udpxy 端口 | <UDPXY_PORT> | 可改 |
| udpxy 上游接口 | <BRIDGE_IP> | 必须用 br0 的 IP,不能用接口名 |
| VLAN 范围 | 2–4094 | 覆盖所有标签 |
| 视频 UDP 端口 | <VIDEO_PORT> | 根据实际抓包确定 |
| 组播地址段 | 239.x.x.x | 各地不同,以实际抓包为准 |
| udpxy 缓冲区 | -B 2097152 | 2MB,减少卡顿 |