描述问题
Hy2 realm 模式在 PPPoE 重拨(WAN 断开重连)后无法恢复服务。
现象:服务端 Hy2 进程一直在运行,心跳正常发送,但牵线服务器(自建)上注册的公网地址未随 CGNAT 映射变化而更新。客户端能通过牵线服务器获取 realm ID,但实际连接时被导向旧的(已失效的)公网端点,连接全部超时。手动重启 Hy2 进程后重新 STUN 发现新地址并注册,服务立即恢复。
如何复现
- 在 CGNAT 环境下部署 Hy2 realm 模式服务端
- 确认客户端能正常通过 realm 连接
- 触发 PPPoE 重拨(如运营商侧主动踢线、路由器手动重拨)
- 等待重拨完成,WAN IP 变化
- 观察客户端无法再通过 realm 连接
- 查看服务端进程仍在运行,但无新的 client connected 日志
预期行为
PPPoE 重拨 / WAN 断开重连后,Hy2 realm 应检测到 CGNAT 映射变化,自动重新运行 STUN 发现新的公网地址,并向牵线服务器更新注册信息,使客户端能继续正常连接。
设备和操作系统
- 路由器:ImmortalWrt 24.10-SNAPSHOT (OpenWrt 分支)
- 架构:arm-v8a
- 宽带:中国电信,CGNAT 环境(PPPoE 拨号,WAN IP 为 100.64.x.x)
- Hy2 启动方式:OpenWrt procd 服务(/etc/init.d/hysteria-realm)
- Hy2 版本:运行在 ImmortalWrt 软件包版本
额外信息
- 确认 realm 心跳(heartbeat)是正常发送的——进程关闭时的日志显示 heartbeat 请求被 shutdown context 中断,证明运行期间 heartbeat 机制在工作
日志
=== PPPoE 断线重拨 ===
Sat Jul 18 13:39:07 daemon pppd: LCP terminated by peer
Sat Jul 18 13:39:07 daemon pppd: Connect time 2132.0 minutes.
Sat Jul 18 13:39:08 daemon pppd: Modem hangup
Sat Jul 18 13:39:11 daemon netifd: Interface 'pppoe_wan' is now down
Sat Jul 18 13:39:11 daemon netifd: Interface 'pppoe_wan' is setting up now
Sat Jul 18 13:39:14 daemon pppd: local IP address 100.64.xx.xx
Sat Jul 18 13:39:14 daemon pppd: remote IP address 100.64.0.1
Sat Jul 18 13:39:14 daemon netifd: Interface 'pppoe_wan' is now up
=== 重拨瞬间 Hy2 旧连接断开 ===
Sat Jul 18 13:39:07 hysteria[6428]: WARN TCP error
{"addr": "220.170.xxx.xxx:54727", "error": "sendto: network is unreachable"}
Sat Jul 18 13:39:07 hysteria[6428]: INFO client disconnected
{"addr": "220.170.xxx.xxx:54727", "error": "sendto: network is unreachable"}
Sat Jul 18 13:39:31 hysteria[6428]: INFO client disconnected {"error": "timeout"}
Sat Jul 18 13:39:36 hysteria[6428]: INFO client disconnected {"error": "timeout"}
=== 13:39:36 ~ 13:53:07(约14分钟)无任何 Hy2 日志输出 ===
=== 心跳仍在发送(证明:shutdown 时 heartbeat 还在跑)===
=== 但没有任何新的 client connected,也没有重新 STUN/注册 ===
=== 手动重启 Hy2 ====
Sat Jul 18 13:53:07 hysteria[6428]: INFO received signal, shutting down gracefully
Sat Jul 18 13:53:07 hysteria[6428]: WARN realm heartbeat failed
{"realm": "d1f227xx...xxxx97ca1e4", "error": "Post ".../heartbeat": context canceled"}
Sat Jul 18 13:53:09 hysteria[6428]: ERROR failed to shut down server cleanly
{"error": "Delete "...": context deadline exceeded"}
Sat Jul 18 13:53:09 hysteria[6428]: INFO server stopped
=== 新进程启动,重新 STUN 发现新地址并注册,客户端立即恢复 ===
Sat Jul 18 13:53:09 hysteria[17661]: INFO server mode
Sat Jul 18 13:53:14 hysteria[17661]: INFO realm registered
{"realm": "d1f227xx...xxxx97ca1e4", "addresses": ["219.144.xxx.xxx:4454"], "ttl": 60}
Sat Jul 18 13:53:14 hysteria[17661]: INFO server up and running
{"listen": "realm://...@realm.xx.xxx:8443/...?lport=58891"}
Sat Jul 18 13:53:16 hysteria[17661]: INFO client connected {"id": "user", "tx": 0}
Sat Jul 18 13:53:19 hysteria[17661]: INFO client connected {"id": "user", "tx": 0}
Sat Jul 18 13:53:26 hysteria[17661]: INFO client connected {"id": "user", "tx": 0}
描述问题
Hy2 realm 模式在 PPPoE 重拨(WAN 断开重连)后无法恢复服务。
现象:服务端 Hy2 进程一直在运行,心跳正常发送,但牵线服务器(自建)上注册的公网地址未随 CGNAT 映射变化而更新。客户端能通过牵线服务器获取 realm ID,但实际连接时被导向旧的(已失效的)公网端点,连接全部超时。手动重启 Hy2 进程后重新 STUN 发现新地址并注册,服务立即恢复。
如何复现
预期行为
PPPoE 重拨 / WAN 断开重连后,Hy2 realm 应检测到 CGNAT 映射变化,自动重新运行 STUN 发现新的公网地址,并向牵线服务器更新注册信息,使客户端能继续正常连接。
设备和操作系统
额外信息
日志
=== PPPoE 断线重拨 ===
Sat Jul 18 13:39:07 daemon pppd: LCP terminated by peer
Sat Jul 18 13:39:07 daemon pppd: Connect time 2132.0 minutes.
Sat Jul 18 13:39:08 daemon pppd: Modem hangup
Sat Jul 18 13:39:11 daemon netifd: Interface 'pppoe_wan' is now down
Sat Jul 18 13:39:11 daemon netifd: Interface 'pppoe_wan' is setting up now
Sat Jul 18 13:39:14 daemon pppd: local IP address 100.64.xx.xx
Sat Jul 18 13:39:14 daemon pppd: remote IP address 100.64.0.1
Sat Jul 18 13:39:14 daemon netifd: Interface 'pppoe_wan' is now up
=== 重拨瞬间 Hy2 旧连接断开 ===
Sat Jul 18 13:39:07 hysteria[6428]: WARN TCP error
{"addr": "220.170.xxx.xxx:54727", "error": "sendto: network is unreachable"}
Sat Jul 18 13:39:07 hysteria[6428]: INFO client disconnected
{"addr": "220.170.xxx.xxx:54727", "error": "sendto: network is unreachable"}
Sat Jul 18 13:39:31 hysteria[6428]: INFO client disconnected {"error": "timeout"}
Sat Jul 18 13:39:36 hysteria[6428]: INFO client disconnected {"error": "timeout"}
=== 13:39:36 ~ 13:53:07(约14分钟)无任何 Hy2 日志输出 ===
=== 心跳仍在发送(证明:shutdown 时 heartbeat 还在跑)===
=== 但没有任何新的 client connected,也没有重新 STUN/注册 ===
=== 手动重启 Hy2 ====
Sat Jul 18 13:53:07 hysteria[6428]: INFO received signal, shutting down gracefully
Sat Jul 18 13:53:07 hysteria[6428]: WARN realm heartbeat failed
{"realm": "d1f227xx...xxxx97ca1e4", "error": "Post ".../heartbeat": context canceled"}
Sat Jul 18 13:53:09 hysteria[6428]: ERROR failed to shut down server cleanly
{"error": "Delete "...": context deadline exceeded"}
Sat Jul 18 13:53:09 hysteria[6428]: INFO server stopped
=== 新进程启动,重新 STUN 发现新地址并注册,客户端立即恢复 ===
Sat Jul 18 13:53:09 hysteria[17661]: INFO server mode
Sat Jul 18 13:53:14 hysteria[17661]: INFO realm registered
{"realm": "d1f227xx...xxxx97ca1e4", "addresses": ["219.144.xxx.xxx:4454"], "ttl": 60}
Sat Jul 18 13:53:14 hysteria[17661]: INFO server up and running
{"listen": "realm://...@realm.xx.xxx:8443/...?lport=58891"}
Sat Jul 18 13:53:16 hysteria[17661]: INFO client connected {"id": "user", "tx": 0}
Sat Jul 18 13:53:19 hysteria[17661]: INFO client connected {"id": "user", "tx": 0}
Sat Jul 18 13:53:26 hysteria[17661]: INFO client connected {"id": "user", "tx": 0}