Skip to content

Realm无法在服务端ip变更时重新注册 #1637

Description

@RSSYLY

描述问题

Hy2 realm 模式在 PPPoE 重拨(WAN 断开重连)后无法恢复服务。

现象:服务端 Hy2 进程一直在运行,心跳正常发送,但牵线服务器(自建)上注册的公网地址未随 CGNAT 映射变化而更新。客户端能通过牵线服务器获取 realm ID,但实际连接时被导向旧的(已失效的)公网端点,连接全部超时。手动重启 Hy2 进程后重新 STUN 发现新地址并注册,服务立即恢复。

如何复现

  1. 在 CGNAT 环境下部署 Hy2 realm 模式服务端
  2. 确认客户端能正常通过 realm 连接
  3. 触发 PPPoE 重拨(如运营商侧主动踢线、路由器手动重拨)
  4. 等待重拨完成,WAN IP 变化
  5. 观察客户端无法再通过 realm 连接
  6. 查看服务端进程仍在运行,但无新的 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}

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions