华硕梅林路由器设置电信IPTV
背景
自己留存一下。来自
https://www.bilibili.com/opus/765197554107285511?spm_id_from=333.1387.0.0
既然搞单线复用IPTV,原因就不多说了。。。
环境
- 电信的宽带
- 闲鱼二手淘的华硕AC66U B1,自己刷了梅林
配置
光猫
怎么拿超级管理员账号,这里就不赘述了,根据自己的型号搜索吧
网络链接配置
找到自己的网络连接和IPTV连接,把下边LAN端口绑定都取消掉
我这里网络是,IPTV是
VLAN绑定
把网络连接和IPTV都绑定到一个端口上;我插在光猫上的网线,用了LAN1端口,所以这里都选
至此,光猫的设置就搞定了
路由器
其实在路由器的设置很简单,进入菜单,根据以下设置就好
在配置光猫的时候,IPTV的VID写了43,这里在上填入,互联网那个不用填写
保存配置后路由器会自动重启。重启完成后重新连接路由器,整体就可以正常工作了。
完成上述设置后的核心效果是:可以把光猫原本的 IPTV 口“迁移”到路由器的某个 LAN 口上。这样做的好处很明显:
-
后续抓包更方便(直接在路由器 LAN 侧做镜像/抓包,定位组播信息更直观)
-
更容易拿到运营商的组播地址(multicast/rtp/udp 链接)
-
拿到组播源之后,可以进一步通过路由器把 IPTV 流量分发到局域网内其他设备使用(例如电脑、电视、NAS、软路由播放器等)
不过这里有一个坑需要特别记录:
由于 梅林固件自身对 IPTV 组播/IGMP 处理的限制(或某些型号/配置组合下的表现),组播流量在默认情况下并不会按预期进入 CPU/转发路径,导致局域网内其他设备即使在同一网段,也可能出现“拿不到流量 / 播放不了 / 只能机顶盒能看”的情况。
因此,实际使用中往往需要手动跑一段脚本,对组播转发/桥接/iptables/ebtables/IGMP 相关逻辑做一次补偿处理,确保:
-
组播能够正确在 LAN 侧转发
-
其他设备能接收到组播数据
-
后续才能继续做“组播链接提取 → 转 HTTP/单播 → 全网分发”等玩法
简单说:配置完成后“机顶盒能看”只是第一步;想要“局域网内其他设备也能用”,还需要额外脚本把组播链路打通。
脚本如下,手动写其实不需要这么复杂,我只不过为了通用性,写了很多判断逻辑。这里的转发的端口是 4000 ,vlan id 是默认的 43 。
# Merlin: Auto-enable IPTV VLAN43 -> CPU, auto-pick a free 10.x IP, start udpxy PATH="/sbin:/bin:/usr/sbin:/usr/bin" # ====== User settings (only change these if needed) ======
PREFIX_DEFAULT="10.166.195" # 你当前 IPTV 网段前三段
CIDR="/24"
CANDIDATES="250 251 252 253 254"
UDPXY_PORT="4000"
UDPXY_CLIENTS="20"
# ======================================================== log() { echo "[$(date '+%F %T')] $*" >> /tmp/iptv_udpxy_autofix.log; } LAN_IP="$(nvram get lan_ipaddr)"
[ -z "$LAN_IP" ] && LAN_IP="192.168.1.1" # 1) VLAN43 加入 CPU 口(让 Linux 能看到 VLAN43 的流量)
robocfg vlan 43 ports "0 4t 8t" >/dev/null 2>&1 # 2) 确认 VLAN 子接口存在(你现在是 eth0.43)
IFACE="eth0.43"
ip link show "$IFACE" >/dev/null 2>&1 || {
# 有些环境可能用 vconfig 创建 vlan43
if command -v vconfig >/dev/null 2>&1; then
vconfig set_name_type VLAN_PLUS_VID_NO_PAD >/dev/null 2>&1
vconfig add eth0 43 >/dev/null 2>&1
IFACE="vlan43"
fi
} ip link show "$IFACE" >/dev/null 2>&1 || {
log "ERROR: VLAN interface not found (eth0.43/vlan43)."
exit 0
} ip link set "$IFACE" up >/dev/null 2>&1 # 2.1) 尝试从邻居表推断网段(如果能看到机顶盒 10.x,就自动用它的前三段)
PREFIX="$(
ip neigh show dev "$IFACE" 2>/dev/null \
| awk '/^10\./{split($1,a,"."); print a[1]"."a[2]"."a[3]; exit}'
)"
[ -z "$PREFIX" ] && PREFIX="$PREFIX_DEFAULT" # 2.2) 在候选里挑一个没冲突的 IP(优先用 arping)
pick_free_ip() {
for last in $CANDIDATES; do
ip_try="${PREFIX}.${last}" if command -v arping >/dev/null 2>&1; then
out="$(arping -I "$IFACE" -c 2 -w 2 "$ip_try" 2>/dev/null)"
echo "$out" | grep -q "Received 0 reply" && { echo "$ip_try"; return 0; }
# 如果 arping 输出格式不一致,再加一道兜底:只要出现 replies 就认为冲突
echo "$out" | grep -qi "reply" && continue
else
# 没有 arping 的兜底:用邻居表判断(不如 arping 稳,但比没有强)
ping -I "$IFACE" -c 1 -W 1 "$ip_try" >/dev/null 2>&1
ip neigh show dev "$IFACE" | grep -q "^$ip_try " && continue
echo "$ip_try"; return 0
fi
done
return 1
} IPTV_IP="$(pick_free_ip)"
if [ -z "$IPTV_IP" ]; then
log "ERROR: No free IP found in ${PREFIX}.{$CANDIDATES}"
exit 0
fi # 2.3) 配置 IP 到 VLAN 接口
ip addr flush dev "$IFACE" >/dev/null 2>&1
ip addr add "${IPTV_IP}${CIDR}" dev "$IFACE" >/dev/null 2>&1 # 3) 启动 udpxy(注意:你这版 udpxy 的 -m 需要填“IP”,不是接口名)
killall udpxy >/dev/null 2>&1
udpxy -p "$UDPXY_PORT" -a "$LAN_IP" -m "$IPTV_IP" -c "$UDPXY_CLIENTS" >/tmp/udpxy.log 2>&1 & # 4) 记录结果
log "OK: IFACE=$IFACE LAN_IP=$LAN_IP IPTV_IP=$IPTV_IP udpxy=${LAN_IP}:${UDPXY_PORT}"
exit 0
跑完脚本后,我们发现 组播的链接 可以用 HTTP 转换的链接使用了,类似于这样
rtp://239.49.8.19:9614 ==> http://192.168.3.1:4000/udp/239.49.8.19:9614
统一加上路由器 WAN 口 IP 地址和转发端口就行。
关于抓包获得所有的组播的播放链接,参考下面的文章,我自己还未尝试,只是用了网上现成的链接,自己再整理成 m3u.
https://blog.joylau.cn/2025/03/31/OpenWrt-IPTV/
https://post.smzdm.com/p/a785k2z9/
Comments
Post a Comment