背景
家里用的是中国移动宽带,光猫是吉比特GS3101(中国移动定制),下挂一台ImmortalWrt路由器(MT7981芯片)做二级路由。遇到的问题是:IPv6时有时无,有时候能用有时候就断了。
经过一番折腾,搞清楚了原因并找到了解决方案。虽然海外IPv6因为运营商原因连不通,但国内IPv6站点是可以正常访问的。
问题诊断
1. ISP不下发DHCPv6-PD前缀
登录ImmortalWrt路由器查看日志,发现了关键信息:
daemon.warn odhcp6c: Server returned IA_PD status 'No Prefix Available'
daemon.warn odhcp6c: Server returned IA_PD status 'No Binding'
几乎每天都会出现。中国移动的DHCPv6服务器在续约前缀时返回"无前缀可用"或"无绑定"。
这里需要区分两个概念:
| 类型 | 说明 | ISP是否分配 |
|---|---|---|
| IA_NA(地址) | 给路由器WAN口一个IPv6地址 | ✅ 给了 /64 |
| IA_PD(前缀) | 给路由器一段地址池分给LAN设备 | ❌ 不给 |
ISP给了路由器一个地址(IA_NA),但拒绝给前缀(IA_PD)。正常情况下,路由器需要PD前缀才能给局域网设备分配IPv6地址,所以LAN设备就拿不到IPv6了。
2. 光猫固件封堵了超管获取
我尝试通过获取光猫超级管理员密码来改桥接模式(让路由器直接拨号,PD前缀分配会更稳定),但是:
- 光猫型号:GS3101,固件版本:V1B0.C02.01(固件完整dump下载 ,256MB Flash,含全部11个MTD分区)
getGateWay.cgi接口存在但返回 400 Bad Request(已被封堵)- telnet端口23关闭
- 所有默认超管密码(
CMCCAdmin/aDm8H%MdA、telecomadmin/nE7jA%5m等)全部错误 - SN推算密码、MAC推算密码均不对
- 所有已知CGI漏洞页面返回404
结论:这个固件版本是运营商通过TR-069远程升级的新版本,已经封堵了所有已知的软件漏洞获取超管的方法。
想获取超管只能:恢复出厂+秒删TR-069、TTL串口硬件调试、或找装维师傅要密码。
解决方案:NDP Relay + IPv6 Forwarding
既然拿不到超管改不了桥接,那就换个思路——把WAN口的IPv6共享给LAN设备。
原理
ISP虽然不给PD前缀,但WAN口有一个 /64 的公网IPv6地址。通过NDP Relay,可以把WAN侧收到的Router Advertisement(RA)原样转发到LAN。LAN设备收到RA后,会通过SLAAC从同一个 /64 前缀自动生成IPv6地址。
然后通过路由器的IPv6 Forwarding和NDP Proxy,让LAN设备的流量能正确路由到WAN。
本质上就是把WAN的 /64 前缀"共享"给了LAN设备。
具体配置(ImmortalWrt/OpenWrt)
1. 修改DHCP/RA配置
|
|
2. 给LAN接口添加WAN前缀的静态地址
|
|
把
2409:xxxx:xxxx:xxxx替换为你WAN口的实际前缀。可以通过ip -6 addr show dev eth1 scope global查看。
3. 开启IPv6转发和NDP代理
|
|
4. 持久化配置(写入 /etc/rc.local)
|
|
5. 优化wan6 DHCPv6参数
|
|
虽然ISP目前不给PD,但万一以后给了,这个配置能自动用上。
6. 添加IPv6看门狗脚本
ISP的前缀分配不稳定,加个脚本每5分钟检测一次,掉线自动恢复:
|
|
7. 重启服务生效
|
|
验证
配置完成后,直连ImmortalWrt WiFi的设备(如手机)应该能通过SLAAC自动获取公网IPv6地址。
测试方法:
|
|
海外IPv6不通的问题
配置完成后发现一个现象:国内IPv6站点全部正常,但海外IPv6站点TCP连不上(ping能通但HTTP/HTTPS超时)。
通过tcpdump抓包确认:
# 路由器发出的TCP SYN包
IP6 router.44178 > remote.443: Flags [S] # SYN发出
# 没有任何SYN-ACK回来...
原因:中国移动的IPv6国际出口过滤了TCP流量,只放行ICMPv6。这不是路由器防火墙的问题(即使完全放开防火墙也不行),而是运营商层面的策略。
如果你需要访问海外IPv6站点,建议:
- 代理走IPv4出站(大部分代理客户端默认就这样)
- 换电信/联通宽带(IPv6到海外通常好很多)
注意事项
关于NDP Relay的安全性
这种方案本质上是把WAN的 /64 前缀共享给LAN。如果ISP做了严格的ND安全检查(如SAVI/ND Snooping),会检测到同一端口冒出了多个IPv6源地址,从而丢弃非绑定地址的包。
目前中国移动大部分场景不管这个,所以能用。如果某天被限制了,表现为:设备有IPv6地址但上不了网(被静默丢弃)。到时候只能:
- 打电话给运营商要PD前缀
- 光猫改桥接(需要超管密码)
- 用6in4/HE Tunnel Broker走隧道
关于光猫GS3101/GS2101超管获取
如果你也是GS3101或GS2101型号的光猫,固件是V1B0.C02.01或更新版本,传统的getGateWay.cgi等软件漏洞已经被封堵。但还有以下几种方法可以获取超管密码:
方法一:UPnP漏洞(推荐,免费)
GS2101/GS3101光猫在端口5555运行了一个UPnP IGD服务,其中DeviceInfo子服务包含一个厂商自定义的SOAP方法X_GetAccess,不需要任何认证就能返回超管密码。
前提条件:光猫的UPnP必须开启。 UPnP设置需要超管权限才能看到(在"应用" → “UPnP配置"里),所以这是一个鸡生蛋的问题。但如果你能通过其他方式先拿到一次超管密码(比如找师傅),开启UPnP后以后就可以自己随时获取了。
获取密码的PowerShell脚本(Windows下运行):
|
|
如果UPnP未开启,会返回空的SOAP body(端口5555可达但所有action不返回数据)。
附:UPnP开启后telnet自动激活
实测发现,开启UPnP并重启光猫后,telnet端口23会自动开放,使用以下凭据可以登录并获得shell:
用户名: admin
密码: s2@We3%Dc#
登录后可进入BusyBox shell(#提示符),可以执行命令查看配置、修改设置等。这意味着即使TR-069后续重新随机化了超管密码,只要UPnP保持开启,你就可以随时通过telnet获取shell访问权限。
telnet开放的真正原因分析: 实测过程中,在UPnP开启后还额外调用了
X_SetAccess(设置X_AccessWAN=True,开启WAN侧远程管理)和Reboot(远程重启光猫)两个action。因此telnet的开放可能不是UPnP本身导致的,而是这个组合链:
- UPnP开启后,
X_SetAccessaction成功开启了WAN侧管理权限(包括telnet/SSH等)Rebootaction重启光猫,使配置生效- 重启后telnet端口23开放
也就是说,关键的触发条件可能是
X_SetAccess+Reboot,而不仅仅是UPnP处于开启状态。
附:UPnP漏洞的完整利用能力
除了获取超管密码外,端口5555的UPnP服务(无需认证)还可以:
| UPnP Action | 服务 | 效果 |
|---|---|---|
X_GetAccess |
DeviceInfo | 获取超管密码 |
Reboot |
DeviceConfig | 重启光猫 |
FactoryReset |
DeviceConfig | 恢复出厂设置 |
AddPortMapping |
WANIPConnection | 添加端口映射(外网穿透到内网) |
GetPreSharedKey |
WLANConfiguration | 读取WiFi密码 |
SetDNSServer |
LANHostConfigManagement | 修改DHCP下发的DNS(DNS劫持) |
SetManagementServerURL |
ManagementServer | 劫持TR-069管理服务器地址 |
X_SetAccess |
DeviceInfo | 开启WAN侧远程管理 |
虽然没有直接的命令执行action,但组合利用效果很强:先用X_GetAccess拿密码 → 开启UPnP → 用Reboot重启激活telnet → 用admin/s2@We3%Dc#登录telnet获得shell。
方法二:闲鱼购买(5元)
闲鱼搜索"光猫超级密码"或"光猫超管”,提供光猫SN码,卖家通过运营商网管系统查询,一般5元就能拿到。本质上就是装维师傅用的同一套OLT网管平台,用SN码查到设备绑定的动态密码。
方法三:找装维师傅
直接联系宽带安装师傅,他们手上有工单系统/网管平台,用SN码就能查到动态密码。有些师傅愿意给,有些不愿意。
方法四:恢复出厂+秒删TR-069
- 记下LOID和宽带账号密码
- 拔光纤
- 捅Reset孔10秒恢复出厂
- 密码回到默认值
CMCCAdmin/aDm8H%MdA - 立刻登录,删掉TR-069连接(防止密码被重新随机)
- 插回光纤,用LOID重新注册
方法五:TTL串口(硬件方法,100%成功)
买个CH340/CP2102 USB转TTL模块(淘宝几块钱),拆光猫接TX/RX/GND三条线,波特率115200,开机进root shell,直接读配置文件里的超管密码:
|
|
进阶:从光猫获取正规的/60 PD前缀委派
如果你已经通过上面的方法拿到了光猫超管密码并开启了telnet,还有一个更好的方案——直接从光猫获取正规的PD前缀委派,不再需要NDP Relay hack。
发现问题
通过telnet查看光猫的配置,发现ISP实际上已经给了光猫一个/60前缀:
|
|
ISP通过PPPoE给光猫委派了 /60 前缀,但光猫的DHCPv6 Server(dhcp6s)只把这个前缀委派给了一个硬编码的DUID,下挂的OpenWrt/ImmortalWrt路由器根本拿不到。
原因分析
光猫的 /etc/dhcp6s.conf(DHCPv6服务器配置)长这样:
option domain-name-servers fe80::1;
interface br0 {
address-pool pool1 172800 259200;
};
pool pool1 {
range 2409:8a28:6e2:1c20::1 to 2409:8a28:6e2:1c20::1000;
};
host cmcc {
duid 11:11:11:11:11:11:11:11:11:11:11:11:11:11;
prefix 2409:8a28:6e2:1c20::/60 172800 259200;
};
host cmcc 里硬编码了一个假DUID(11:11:11:11...),只有匹配这个DUID的设备才能拿到PD前缀。下挂的OpenWrt路由器DUID不匹配,自然拿不到前缀。
解决方法:修改dhcp6s.conf
第一步:找到OpenWrt路由器的DUID
在OpenWrt路由器上执行:
|
|
DUID就是第二列的值,如 00030001702ad7607720。格式化为冒号分隔:00:03:00:01:70:2a:d7:60:77:20。
这个DUID是DUID-LL格式:
0003=DUID-LL类型,0001=以太网, 后面是WAN口的MAC地址。
第二步:通过telnet修改光猫的dhcp6s.conf
|
|
把
00:03:00:01:70:2a:d7:60:77:20替换为你自己路由器的DUID。
第三步:重启dhcp6s
|
|
第四步:在OpenWrt上重新请求前缀
|
|
成功的话会看到:
|
|
完整的PD链路
修改后的IPv6前缀委派链路:
ISP ──/60──→ 光猫(ppp1) ──/60──→ OpenWrt(eth1) ──/64──→ LAN设备(br-lan)
这是正规的DHCPv6-PD链路,比NDP Relay方案更稳定、更标准。
持久化注意事项
光猫的 /etc/ 分区是只读的squashfs,重启后 dhcp6s.conf 会恢复原样。需要持久化的话,可以把自定义配置保存到 /userfs/(可写的jffs2分区),并在 /etc/init.d/rcS 末尾添加监控脚本,在每次dhcp6s启动后自动替换配置:
|
|
注意:
/etc/init.d/rcS的可写性取决于具体固件版本,部分版本rcS在tmpfs上,重启后可能丢失。如遇此情况,建议联系装维师傅将光猫改为桥接模式,让OpenWrt直接拨号获取PD前缀,这是最彻底的解决方案。
总结
| 问题 | 原因 | 解决方案 |
|---|---|---|
| LAN设备没有IPv6 | ISP不下发PD前缀 | NDP Relay + IPv6 Forwarding |
| 光猫有/60但不给下挂路由器 | dhcp6s.conf硬编码DUID | 修改dhcp6s.conf加入路由器DUID |
| IPv6时断时续 | ISP前缀续约失败 | watchdog脚本自动恢复 |
| 海外IPv6 TCP不通 | 中国移动IPv6国际出口过滤 | 走IPv4代理 |
| 光猫无法改桥接 | 新固件封堵了超管获取 | UPnP漏洞/闲鱼5元/找装维师傅 |
虽然方案不完美(海外IPv6不通、依赖ISP不做ND检查),但对于日常使用国内IPv6站点来说完全够用。

说些什么吧!