NHP 消息类型

每个数据包在消息头中携带一个 2 字节的消息类型 ID,接收方据此将其 分发到相应的处理逻辑。目前共定义 28 个 ID:其中 17 个属于 NHP (ID 0–16),涵盖敲门/鉴权/访问流程、AC 生命周期、中继、注册、OTP 与 显式退出;另有 11 个属于 DHP(ID 17–27),由数据对象隐身协议使用。

对应 CSA《Stealth Mode SDP》白皮书 §NHP Message Types (Table 4) 与 Appendix 2。ID 与字符串名定义见 nhp/core/packet.go;载荷结构体见 nhp/common/nhpmsg.go

消息封装

每种消息都共用同一个消息头(参见 消息头), 后跟加密后的载荷。载荷格式为 JSON,可选 zlib 压缩(由 NHP_FLAG_COMPRESS 标志控制),再使用解析消息头时派生出的会话密钥做 AEAD 加密 —— 除非 类型说明另作规定(例如 NHP-KPL 没有消息体;NHP-RLY 承载一个原 始内层数据包)。

索引

NHP —— 网络基础设施隐身协议

ID名称方向用途
0NHP-KPLAgent ↔ Server, AC ↔ Server保活包。空消息体。
1NHP-KNKAgent → Server敲门:请求访问被保护资源。
2NHP-ACKServer → Agent敲门回应。成功时携带资源地址与会话参数。
3NHP-AOPServer → AC指示 AC 为某 agent → 资源流打开(或拒绝)访问。
4NHP-ARTAC → ServerAC 对 NHP-AOP 的响应。
5NHP-LSTAgent → Server请求查询当前 agent 有权访问的服务列表。
6NHP-LRTServer → AgentNHP-LST 的响应。
7NHP-COKServer → Agent服务器过载时下发的限流 / 反 DDoS cookie。
8NHP-RKNAgent → Server二次敲门,HMAC 计算中加入 NHP-COK 的 cookie。
9NHP-RLYRelay → ServerNHP-Relay 转发的原始 NHP 包,保留源地址信息。
10NHP-AOLAC → ServerAC 向控制面通告在线状态与所守护的资源。
11NHP-AAKServer → AC服务器确认 AC 注册,并回显 AC 的公网 IP/端口。
12NHP-OTPAgent → Server请求带外下发一次性密码用于注册。
13NHP-REGAgent → ServerAgent 注册其静态公钥,使用 OTP 作为身份凭据。
14NHP-RAKServer → AgentNHP-REG 的成功或错误回执。
15NHP-ACCAgent → ACAgent 向 AC 的临时监听端口出示访问令牌。
16NHP-EXTAgent → Server请求提前关闭一条活跃会话。空消息体。

DHP —— 数据对象隐身协议 (此处列出是为索引表的完整性;详细 DHP 语义将由专门的 DHP 参考页面展开)

DHP 条目暂以 Go 常量名展示(如 NHP_DRG),尚未配有逐类型子章节。 后续将新增专门的 DHP 参考页面,为每行提供与上表相同的载荷字段表。 线上名称差异: nhp/core/packet.go 中 DHP 字符串标签并不统一 —— ID 17–26 输出为 NHP_DRGNHP_DBA (下划线、NHP 前缀,与上方 NHP 组使用连字符的命名不同),而 ID 27 输 出为 "DHP-KNK"(连字符、DHP 前缀,其 Go 常量为 DHP_KNK)。使用 HeaderTypeToString 输出的实现应精确匹配下表中给出的字符串。

ID常量方向用途
17NHP_DRGDB → Server将一个数据对象注册到 NHP-Server。
18NHP_DAKServer → DBNHP_DRG 的确认 / 错误码。
19NHP_DARDHP-Agent → Server申请访问某个已注册数据对象。
20NHP_DAGServer → DHP-AgentNHP_DAR 的授权决定。
21NHP_DSAServer → DHP-Agent要求提交自证明(TEE / evidence)。
22NHP_DAVDHP-Agent → Server向服务器提交远程证明。
23NHP_DWRServer → DB向 DB 索取数据对象私钥的包裹(wrap)。
24NHP_DWADB → ServerDB 返回包裹后的密钥(Key Access Object)。
25NHP_DOLDB → ServerDB 在线 / 状态通告。
26NHP_DBAServer → DBNHP_DOL 的确认。
27DHP_KNKDHP-Agent → ServerDHP 风格的敲门包,携带远程证明证据。

NHP-KPL — Keepalive

ID: 0 · 方向: 双向(Agent ↔ Server,AC ↔ Server) · 消息体: 空(仅消息头)

用于 Agent/AC 与 Server 之间维持 NAT 绑定 / TCP 连接。接收方除了接收 该包之外不做其他处理。Relay 节点 转发保活包。

NHP-KNK — Knock

ID: 1 · 方向: Agent → Server · 载荷结构体: common.AgentKnockMsg

JSON 键字段说明
headerType消息类型回显线上消息类型。
usrId用户 ID区分发起请求的自然人或服务主体。
devId设备 ID支持多设备 / 终端策略验证。
orgId组织 ID可选,租户范围。
aspIdASP ID指明由哪个授权服务提供方进行鉴权。
resId资源 ID所请求的被保护资源(域名、服务名或自定义字符串)。
results校验结果可选 {checkID: result} 映射,反映客户端的终端环境检测结果。
usrData用户数据可选,透传给 ASP 插件使用的自由字段。

敲门包是 NHP 交互从冷启动开始时的 唯一 触发报文。

NHP-ACK — Acknowledge

ID: 2 · 方向: Server → Agent · 载荷结构体: common.ServerKnockAckMsg

JSON 键字段说明
errCode / errMsg错误码 / 信息"0"(或空)表示成功;其他值为失败原因。
resHost资源主机资源名 → 主机地址映射。
opnTime放行时长本次访问授权的有效秒数。
aspTokenASP 令牌AC 侧后端二次验证使用(可选)。
agentAddrAgent 地址服务器观察到的 Agent 公网元组。
acTokensAC 令牌资源名 → 短期令牌,用于配合 NHP-ACC 使用。
preActions预访问动作可选,每资源一条 PreAccessInfo(AC IP、端口、公钥、令牌、密码套件),供需要 NHP-ACC 阶段的部署使用。
redirectUrl重定向 URL可选;例如重定向到 HTTPS 登录流程而非直接连接。

NHP-AOP — AC Operation

ID: 3 · 方向: Server → AC · 载荷结构体: common.ServerACOpsMsg

JSON 键字段说明
usrId / devId / orgIdAgent 身份归属字段。
aspId / resIdASP + 资源与原始敲门相关联。
srcAddrs源地址列表AC 应放行的 NetAddress 数组。
dstAddrs目的地址列表被保护资源的元组。
opnTime放行时长秒数;0 表示 拒绝 / 关闭。

NAT 提示:在 CGNAT 或共享出口场景下,源 IP 在不同 Agent 之间并不唯一。 部署方应在 AC 与被保护资源之间再叠加一层应用层令牌/cookie(NHP-ACC 路径正是如此),或尽量采用端到端 IPv6。

NHP-ART — AC Result

ID: 4 · 方向: AC → Server · 载荷结构体: common.ACOpsResultMsg

携带 errCode / errMsg、实际放行时长 opnTime(0 表示拒绝)、AC 分发 的 token,以及可选 preActPreAccessInfo)。服务器仅在收到 ART 之 后,才会向 Agent 回复 NHP-ACK。

NHP-LST — List

ID: 5 · 方向: Agent → Server · 载荷结构体: common.AgentListMsg

携带 usrIddevId、可选 orgIdaspId 以及自由的 usrData

NHP-LRT — List Result

ID: 6 · 方向: Server → Agent · 载荷结构体: common.ServerListResultMsg

携带 errCode / errMsg 和一个 list 映射,其具体 schema 由 ASP 插件决定。

ID: 7 · 方向: Server → Agent · 载荷结构体: common.ServerCookieMsg

携带服务端回显的 trxId 与服务端生成的 cookie。在服务器过载时下发。 Agent 必须随后发送 NHP-RKN,并在 HMAC 计算中加入此 cookie,以证明一 次完整的往返并避免被提前丢弃。

NHP-RKN — Re-Knock

ID: 8 · 方向: Agent → Server · 载荷: 与 NHP-KNK 相同。

与 NHP-KNK 的区别:除普通链式密钥外,HMAC 还会拌入 NHP-COK 的 cookie(参见 nhp/core/initiator.go 中的 addHMAC(sumCookie: true))。

NHP-RLY — Relay

ID: 9 · 方向: Relay → Server · 载荷: 来自源端的原始内层 NHP 数据包。

保留穿越 Relay 的源地址;其它消息类型不需要这一点(会被透明转发)。

NHP-AOL — AC Online

ID: 10 · 方向: AC → Server · 载荷结构体: common.ACOnlineMsg

携带 aspId、所守护的 resIds 列表,以及可选 acId。用于向控制面通告 AC 上线。

NHP-AAK — AC Acknowledge

ID: 11 · 方向: Server → AC · 载荷结构体: common.ServerACAckMsg

携带 errCode / errMsg 以及 acAddr。确认 AC 注册,并回显 AC 的公网地址(对处于 NAT 后端、需要从服务器获知自身外部元组的 AC 尤其有用)。

NHP-OTP — One-Time Password

ID: 12 · 方向: Agent → Server · 载荷结构体: common.AgentOTPMsg

携带 usrIddevId,可选 orgIdaspId、预共享 pass,以及自由的 usrData。触发 ASP 插件通过自身带外通道下发 OTP(短信、邮件、二维 码)。服务器不会单独回复一个专用类型;ASP 直接从侧通道投递 OTP 即 视为成功。

NHP-REG — Register

ID: 13 · 方向: Agent → Server · 载荷结构体: common.AgentRegisterMsg

携带 usrIddevId、可选 orgIdaspId、经带外取得的 otp,以及自由的 usrData。将 Agent 的静态公钥(存放在加密消息头中)与其身份绑定注册。

NHP-RAK — Register Acknowledge

ID: 14 · 方向: Server → Agent · 载荷结构体: common.ServerRegisterAckMsg

携带 errCode"0" 表示成功)、errMsgaspId。注册过程中的失败会在此以非零 errCode 显式上报,详见 HandleRegisterRequest

NHP-ACC — Access

ID: 15 · 方向: Agent → AC · 载荷结构体: common.AgentAccessMsg

携带 usrIddevId、可选 orgId、来自 NHP-ACK 的 acToken(取自 acTokens)以及 usrData。当部署使用每会话临时端点(PreAccessInfo) 而非长期放行清单时,Agent 会直接向 AC 的短期监听器出示本消息。AC 校 验令牌后,为所观察到的源地址安装防火墙放行规则,随即关闭临时端口 —— 参见 tcpTempAccessHandler / udpTempAccessHandler。 此路径 产生任何 NHP 层响应;成功隐式地表现为随后的数据面连接 能够成功到达被保护资源。common.ACAccessAckMsg 结构体已定义但当前未 在发送路径上使用,视为预留字段。

NHP-EXT — Exit

ID: 16 · 方向: Agent → Server · 消息体: 空。

Agent 主动请求提前关闭一条活跃会话。服务器随即对 AC 发送 opnTime = 0 的 NHP-AOP,关闭相应放行规则。


DHP 消息类型

DHP 复用了 NHP 的线上格式来承载一组独立流程:数据对象注册、访问、 远程证明、密钥包裹等。这里仅列出它们是为了让 ID 表完整;各类型的 载荷字段(DRGMsgDAKMsgDARMsgDAGMsgDSAMsgDAVMsgDWRMsgDWAMsgDBOnlineMsgServerDBAckMsgDHPKnockMsg)定义在 nhp/common/nhpmsg.go。 专门的 DHP 参考页面将把这些展开;暂请参见 DHP 快速开始


另见