|
|
Gemini说的,你参考下:
路由冲突:IPTV 盒子(192.168.31.137)默认网关指向主路由。主路由的默认路由是 PPPoE(拨号上网)。当盒子尝试访问运营商鉴权服务器(通常是 10.x.x.x 或类似内网段)时,流量走了 PPPoE 口,运营商服务器识别到非法来源,鉴权失败。
缺少 SNAT(源地址转换):即使流量成功从 iptv 接口发出,如果 nftables 没有针对 iptv 接口设置伪装(Masquerade),报文的源 IP 依然是 LAN 端的 192.168.31.137,运营商内网无法回程。
iKuai 为什么可以?:iKuai 的“静态路由”或“策略路由”配置非常直观,通常用户勾选了“分流”到 IPTV 线路,它会自动处理路由和 NAT 映射。在 OpenWrt 中,这需要手动配置策略路由(PBR)。
解决方案:策略路由 + nftables 映射
由于不使用 mwan3,我们需要通过 ip rule 和自定义路由表来实现。
第一步:创建 IPTV 专用路由表
在 OpenWrt 终端执行,或写入 /etc/rc.local 确保重启生效:
Bash
# 创建一个名为 100 的路由表(编号可选)
# 获取 iptv 接口的网关 IP (假设接口名为 eth1 或 br-iptv,此处需替换为实际获取到 10.75.X.X 的接口)
IPTV_GW=$(ip route show dev eth1 | grep default | awk '{print $3}')
# 将 iptv 接口的所有内网路由同步到表 100
ip route add default via $IPTV_GW dev eth1 table 100
第二步:配置策略路由 (Policy Routing)
强制 IPTV 盒子的 IP(192.168.31.137)所有流量(或特定目的地流量)走表 100:
Bash
# 凡是来自盒子 IP 的流量,查询表 100
ip rule add from 192.168.31.137 table 100
第三步:配置 nftables 进行 SNAT
在 OpenWrt 22.03+ 中,编辑 /etc/nftables.d/ 下的自定义脚本,或通过 fw4 的 custom_rules 增加:
代码段
# 在 nat 表的 postrouting 链中增加伪装
chain iptv_nat {
type nat hook postrouting priority srcnat; policy accept;
oifname "eth1" masquerade
}
注:oifname 后面的 eth1 请替换为获取到 10.75.x.x IP 的实际物理接口或逻辑接口名。
针对该用户具体配置的优化建议
根据图中提供的 config interface 'iptv' 截图,用户已经正确配置了 Option 60 (sendopts) 和 MAC 克隆,这是成功拿到 10.75.x.x IP 的前提。
关键补充:
防火墙区域设置: 在 /etc/config/firewall 中,必须将 iptv 接口划入一个防火墙 Zone(通常新建一个名为 iptv 的 zone),并设置:
input: REJECT
output: ACCEPT
forward: REJECT
masq: 1 <-- 这一步非常关键,它会自动生成上述 nftables 的 masquerade 规则
允许 lan 到 iptv 的转发。
DNS 问题: IPTV 鉴权有时依赖运营商下发的 DNS。建议在 DHCP 设置中,为 192.168.31.137 这个 IP 分配特定的 DNS(即运营商在 iptv 接口下发的 DNS 地址),否则盒子解析不到鉴权服务器域名。
总结操作清单
在 网络 -> 防火墙 中为 iptv 接口开启 IP 动态伪装 (Masquerading)。
确保 lan -> iptv 的 转发 (Forward) 是允许的。
使用 ip rule 命令将盒子的流量重定向到 iptv 接口的路由表。
您可以询问该用户: 是否已经在防火墙界面给 iptv 接口勾选了“IP 动态伪装”?这是不使用 mwan3 时最容易忽略的一步。 |
|