圣堂之魂
服务器小记

扔掉机顶盒!实现内网任意设备看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.106CCTV9 纪录
239.45.1.201CCTV13 新闻
239.45.1.202CCTV6 电影

以上地址为虚构示例,各地运营商组播地址不同,必须自己抓包获取,照抄必然失败。


第二步:固化 systemd 服务(开机自启)

手动命令重启后就没了,接下来把网桥和 udpxy 都写成 systemd 服务。

2.1 网桥服务

创建 /etc/systemd/system/iptv-bridge.service

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.target

ExecStartPre 前的 - 表示忽略命令失败(如 br0 不存在时删除不报错)。<STB_NIC><IPTV_NIC> 是占位符,替换为你自己的网卡接口名。

2.2 udpxy 服务

创建 /etc/systemd/system/udpxy.service

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.target

Type=forking 是必须的,因为 udpxy 默认会 daemonize(后台运行)。如果写成 Type=simple,systemd 会认为进程已退出并不断重启。

参数说明
-B 20971522MB 缓冲区,减少卡顿
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>(同一局域网)。


补充扩展

增加频道

  1. 用 VLC 播放 http://<MGMT_IP>:<UDPXY_PORT>/udp/<新组播地址>:<VIDEO_PORT>
  2. 有画面 → 记录下来;黑屏 → 跳过或等待机顶盒开该频道时再试
  3. 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 20971522MB,减少卡顿

本页目录