init: 自 zomaintain/backend/zonat 平移独立成库; module path 改为 git.zeroonesoft.cn/golib/zonat; 内部 import 同步重写

This commit is contained in:
w11
2026-09-19 18:55:43 +08:00
commit 984041f1a0
20 changed files with 2427 additions and 0 deletions
+75
View File
@@ -0,0 +1,75 @@
// protocol.go 定义 zonat 桥接协议的命令字与消息结构。
// 命令字取值与 zonat 桥接命令字对齐(CmdLogin 同 CmdTunnelLogin、CmdTarget 同 CmdTunnelTarget),
// 帧格式不变,便于将来与 zonat 互通或平滑迁移。
package agent
import (
"fmt"
"time"
"github.com/xtaci/smux"
)
// 帧命令字
const (
// CmdLogin 登录(请求与应答共用同一命令字,同 zonat)
CmdLogin byte = 0
// CmdPing 心跳(请求与应答共用同一命令字,同 zonat CmdTunnelPing)
CmdPing byte = 3
// CmdTarget 数据流首帧:节点告知 agent 本条公网连接的目标(同 zonat CmdTunnelTarget)
CmdTarget byte = 4
// CmdRegisterTunnel agent→节点 注册隧道(应答共用同一命令字,Ret.Port 为分配端口)
CmdRegisterTunnel byte = 10
// CmdUnregisterTunnel agent→节点 注销隧道(应答共用同一命令字)
CmdUnregisterTunnel byte = 11
// CmdTunnelClosed 节点→agent 推送:隧道已被节点删除(TTL 过期、会话顶替等)
CmdTunnelClosed byte = 12
)
// Version 协议/程序版本
const Version = "0.1.0"
// Login 登录请求
type Login struct {
AgentId string `json:"agentId"`
Token string `json:"token"` // JWT,由签发方(如 cloud)生成,节点用密钥校验
Version string `json:"version"`
}
// Ret 通用应答(zonat JsonRet 的裁剪版)
type Ret struct {
Code int `json:"code"`
Msg string `json:"msg"`
Port int `json:"port,omitempty"` // 注册隧道应答:节点分配的监听端口
}
// Tunnel 一条隧道的定义(zonat models.Tunnel 的裁剪版)。
// NodeAddr/Token 是 zonat 的多节点扩展:每条隧道自带目标节点与登录令牌,
// 由独立连接登录注册,因此一个 agent 的多条隧道可分布在多个不同节点。
// 这两个字段只用于 agent→节点的登录,节点侧不使用也不回传(CmdTarget 不携带)。
type Tunnel struct {
Id string `json:"id"`
NodeAddr string `json:"nodeAddr,omitempty"` // 该隧道登录的节点桥接地址
Token string `json:"token,omitempty"` // 登录令牌(JWT),仅登录帧使用
ListenPort int `json:"listenPort"` // 0=节点随机分配
TargetIp string `json:"targetIp"`
TargetPort int `json:"targetPort"`
TTLSec int `json:"ttlSec"` // 空闲自动删除秒数,0=永久
}
// TargetAddr 隧道在内网的目标地址
func (t Tunnel) TargetAddr() string {
return fmt.Sprintf("%s:%d", t.TargetIp, t.TargetPort)
}
// SmuxConfig smux 会话参数,与 zonat 保持一致
func SmuxConfig() *smux.Config {
return &smux.Config{
Version: 2,
KeepAliveInterval: 10 * time.Second,
KeepAliveTimeout: 30 * time.Second,
MaxFrameSize: 32768,
MaxReceiveBuffer: 4194304,
MaxStreamBuffer: 65536,
}
}