feat: 连接列表显示客户端真实 IP,支持反代和 CDN 场景

新增可配置的 real_ip_headers(默认 CF-Connecting-IP > X-Real-IP >
X-Forwarded-For 降级取值),trusted_proxies 用于 gin 代理信任链。
WebSocket 连接建立时捕获真实 IP 并在 /profile 和 /admin 连接列表展示,
登录会话 IP 同步改用真实 IP。
This commit is contained in:
2026-07-10 16:58:14 +08:00
parent a98cdb0cac
commit 8398067acb
13 changed files with 67 additions and 13 deletions
+4 -1
View File
@@ -35,6 +35,7 @@ type tunnelConn struct {
svc *VpnService
assignedIP net.IP
assignedIP6 net.IP
realIP string
connectedAt time.Time
writeMu sync.Mutex
ready atomic.Bool
@@ -91,6 +92,7 @@ func (c *tunnelConn) info() ClientInfo {
UserID: c.user.ID,
Username: c.user.Username,
IP: c.assignedIP.String(),
RealIP: c.realIP,
ConnectedAt: c.connectedAt.Format("2006-01-02 15:04:05"),
RxBytes: c.rxBytes.Load(),
TxBytes: c.txBytes.Load(),
@@ -101,7 +103,7 @@ func (c *tunnelConn) info() ClientInfo {
return ci
}
func runTunnel(conn *websocket.Conn, user *model.User) {
func runTunnel(conn *websocket.Conn, user *model.User, realIP string) {
defer conn.Close()
if VPN == nil || !VPN.Running() {
@@ -143,6 +145,7 @@ func runTunnel(conn *websocket.Conn, user *model.User) {
svc: VPN,
assignedIP: ip4,
assignedIP6: ip6,
realIP: realIP,
connectedAt: time.Now(),
}