华硕梅林路由器设置电信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 。

#!/bin/sh
# 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

Popular posts from this blog

华硕路由器 Koolshare 梅林380固件安装 Tailscale

梅林380固件支持vless,xray,trojan, trojan go

群晖NAS打开plex提示未经授权解决方法