X02 公众号出口IP固定化与白名单治理技术标准
C:/Users/xub/.workbuddy/spec/3.行政法规/范式/X02_公众号出口IP固定化与白名单治理技术标准_V1.0.0_2026-09-14_1120.md历史条款出处:本文上位依据原属已废止的宪法体系(正文条款出处锚点原样保留、未改写);二次引用前须核对
产出\旧新条款映射表.json。
标准编号:LHB/TS-2026-009 | 版本:V1.0.0 | 发布日期:2026-09-14 | 实施日期:2026-09-14 | 归口:利衡辨 · 全域治理
标准性质:规则性标准(首版,A 类新建)· 执行层落地件 | 上位依据:《全域任务脑手架构宪法》V1.2.0 第 24 条「外部出口 IP 固定化与白名单治理铁律」
权威关系:本文件为「调用外部平台接口需登记来源 IP」这一类通行场景的执行层标准,首个落地域为微信公众号。效力层级为:宪法 > MEMORY > 台账 > 国家标准 > 本文件 > 其他规范。与宪法冲突时以宪法为准;与《全域文件工作流规则技术标准》就区域路由与双盘同步冲突时,以该标准为准(本文件复用,不替代);与《本文档治理架构》及 wx_health.py 内嵌旧口径冲突时,以本文件为准(本文件把「出口 IP」从只读报错字段收敛为可预测、可留痕的判定项)。
第一篇 目的与底层逻辑
前言
本标准由一次明确的生产故障触发。2026-09-14 用户提出:公众号后台 设置与开发 → 基本配置 → IP 白名单 处的来源 IP 频繁变化,导致接口调用反复被拒,问原因与固定方案。当日排查确认,此前对「出口 IP 从哪里来」的认识存在两处口径真空:
第一,把责任对象认反了。白名单登记的是调用方自己的公网出口 IPv4,不是微信任何地址。既有报错处置只写「把报错里的 IP 加进白名单」,属于事后补救:IP 变了要等到接口调用失败才暴露,而该失败会中断整条发布链路。
第二,没有区分「谁决定了这个 IP」。同一台机器在不同通道下出口 IP 的可控程度完全不同:直连家宽是运营商动态池,经本地代理是代理上游决定,经固定 IP 中转则完全独立于本机。既有口径把它们一律当作「本机 IP」,因此既无法预测漂移,也无法判定该改哪里。
本标准把「出口 IP」从只有报错时才知道的只读字段,收敛为四要素可实测判定 + 台账自动学习 + 双模式分流 + 漂移前置告警四重确定项,并配两个一键执行件:探针侧 _tools/wx_health.py(新增出口 IP 自检与台账)、中转侧 _tools/wechat_proxy/(Nginx 反向代理 + 双路验收器)。
本标准的设计受三条既有裁定约束:其一,宪法 M0.7 第 4 条「1进1出管道」——本环节为单一输入(一次探针调用)、单一输出(一份判定结论 + 一次台账追加),不得引入回环;其二,宪法 M0.7 第 10 / 13 条「技术经济性 / 载体收敛」——自检不得成为新增冗余载体的理由,故探测与比对全部下沉为纯脚本,净增常驻载荷 0(仅新增一个按 appid 分账的台账文件);其三,宪法第 16 / 17 条「外部依赖前置闸与凭证实体唯一化」——自检必须在成文之前完成,且不得新建第二处凭证读取逻辑。
规范性要求等级(RFC 2119)
:表题: 表 0-1 规范性要求等级(RFC 2119)
| 等级 | 含义 | 本文用法 |
|---|---|---|
| 必须(MUST) | 绝对要求,违反即判不合格、禁止发布 | 用于红线与闸门条款 |
| 不得(MUST NOT) | 绝对禁止 | 用于禁止性条款 |
| 应(SHOULD) | 推荐执行;不执行须书面说明理由并登记 | 用于强推荐项 |
| 不应(SHOULD NOT) | 不推荐;执行须说明理由 | 用于弱禁止项 |
| 可(MAY) | 可选 | 用于允许性条款 |
| 宜(RECOMMENDED) | 较「应」更弱的推荐 | 用于经验性建议 |
引言
三项核心原则(强制贯穿)
:表题: 表 0-2 三项核心原则与本文落地方式
| 原则 | 内涵 | 本文落地方式 |
|---|---|---|
| 场景定义需求 | 先定场景,再由场景推导需求 | 场景=调用方出口 IP 不可控且平台强制校验来源;由此推导需求「出口可预测、可留痕、失败可归因」;不先定组网方案 |
| 技术经济性 | 以最小代价取得确定收益 | 探测与台账比对为纯本地脚本、0 LLM 调用;漂移判定在成文之前完成,避免白烧一次成文与配图成本 |
| 1进1出 | 单一事实源,单一当前态 | 输入恒为一次探针调用;输出恒为一份判定结论 + 一次台账追加;同一账号同一时点只保留一份「已放行 IP 台账」 |
认知入口(逻辑思维简图)
:逻辑思维简图: 出口 IP 治理认知框架
L0 目标 = 出口可预测 | 漂移可前置告警 | 失败可归因到具体链路层
L1 四要素 = 模式判定(direct/relay) | 多源交叉探测 | 分账台账 | 强约束期望值
L2 硬约束 = 禁单源自证 | 禁跨账号混记 | 禁把探针当自愈 | 禁静默通过 | 禁明文泄漏凭证
L3 校验项 = 探测源一致率 ≥ 1 有效源 | 台账命中判定 100% | 探针退出码语义正确 | 报告留痕 100% | 自检阶段 LLM 调用数 = 0
L4 例外 = 首次运行无台账时仅记录不阻断 | 探测多源全失败时降级为「不影响凭证判定」 | 中转模式下调漂移为仅记录
全生命周期模型(生命周期结构图)
:生命周期结构图: 出口 IP 固定化全生命周期
载入 = 成文之前 | 编排层 | 读 env 与工作区 config | 解析 API 基址与期望值
探测 = 载入完成 | 纯脚本 | 多源交叉取出口 IPv4 | 逐源失败不误判
分账 = 探测完成 | 纯脚本 | 按 appid 取台账 | 取「已放行」集合
判定 = 分账完成 | 纯脚本 | 命中→正常 | 未命中→漂移告警 | 期望值不符→强阻断
实调 = 判定完成 | 网络 | 调 token(直连或经中转) | 成功即回写台账
留痕 = 实调完成 | 纯脚本 | 落 JSON 报告 | 脱敏后入库
范围
本标准规定「调用外部平台接口、且平台强制校验调用方来源 IP」这一场景下,出口 IP 的观测口径、成因分层、固定化方案、判定规程与校验闸门。
本标准适用于本域全部需要登记来源 IP 的外部接口调用,首个落地域为微信公众号(api.weixin.qq.com)。
本标准不规定:平台侧白名单的审批流程(属对方平台内政);不替代《全域文件工作流规则技术标准》的区域路由与双盘同步条款;不构成对任何第三方中转服务的推荐。
规范性引用文件
:表题: 表 2-1 规范性引用文件
| 编号 | 文件 | 引用内容 |
|---|---|---|
| 1 | 《全域任务脑手架构宪法》V1.2.0 | 第 10、13、16、17、24 条 |
| 2 | 《全域文件工作流规则技术标准》 | 区域路由、双盘同步、任务夹规范 |
| 3 | 《全域文件命名规则技术标准》V1.2.0 | 版本化命名与时间戳后缀 |
| 4 | 《技术标准成文规范》V1.1.0 | STD-A/B/C/D/E/F/G/H/Z 组条款 |
| 5 | LHB/TS-2026-008 | 「前置闸」与「纯脚本判定、超标才调 LLM」的同源口径 |
| 6 | _tools/wx_health.py |
探针载体(本文第 6 章执行接口) |
| 7 | _tools/wechat_proxy/ |
中转载体(wx-proxy.conf / verify_proxy.py) |
术语和定义
出口 IP egress IP
调用方发起外部请求时,平台侧观测到的公网来源 IPv4。不得与内网地址、回环地址或平台自身地址混同。
链路层 egress layer
决定出口 IP 的四个可分离环节:接入层、云与网关层、通道层、协议层。
分账台账 egress ledger
按账号(appid)分别记录「哪些出口 IP 曾被平台接纳」的本地留痕文件。不得跨账号混记——测试号与正式号的白名单互相独立。
漂移 drift
本次探测到的出口 IP 未出现在该账号台账的「已放行」集合中。漂移是预测,不等价于失败。
直连模式 direct / 中转模式 relay
未配置中转基址时,请求由本机出网(direct);配置后请求经固定公网 IP 的中转机出网(relay),平台只认中转机 IP。
平台写接口缺口 platform write gap
平台未提供白名单的读取/写入接口,因此本地工具只能告警、不能自愈。本缺口不得以任何形式的「自动改白名单」承诺掩盖。
第二篇 技术要求
成因分层
:表题: 表 5-1 出口 IP 漂移的四层成因
| 层 | 触发点 | 典型场景 | 可控性 |
|---|---|---|---|
| 接入层 | 拨号会话重连、双网切换、运营商地址池重分配 | 家宽重拨 | 低(须运营商固定 IP) |
| 接入层 | 运营商级 NAT(CGNAT)共享池、基站切换 | 4G/5G 上网卡、个人热点 | 极低(共享池,不可固定) |
| 云与网关层 | 弹性公网 IP 未绑定、按量实例释放、NAT 网关多出口轮询 | 云主机未绑 EIP、多台出口 | 高(绑 EIP 即固定) |
| 通道层 | 代理/VPN 节点自动选优轮换 | 本机设 HTTP(S)_PROXY |
中(出口由代理上游决定,非本机) |
| 协议层 | 双栈网络优选 IPv6 出站,平台只校验 IPv4 | 双栈云主机、双栈终端 | 高(强制 IPv4) |
必须在判定前确认本次出网是否经代理:若设了 HTTP(S)_PROXY,则「本机 IP」与「平台看到的 IP」不是同一个对象,判定对象必须以后者为准。
固定化方案
:表题: 表 6-1 固定化路径与适用性
| 方案 | 做法 | 结论 |
|---|---|---|
| ① 云主机绑定固定 EIP | 弹性公网 IP 与实例绑定,计费方式选固定带宽 | 已有云资源时首选;不得选「关机释放公网 IP」的计费形态 |
| ② 固定 IP 中转(推荐) | 中转机以 Nginx 反代平台接口,业务侧仅改基址 | 调用方 IP 怎么变都不影响;白名单加一次长期不动 |
| ③ 云函数 / Serverless | 使用平台固定出口 | 出口为固定 IP 段而非单 IP,占用白名单配额 |
| ④ 平台自托管 | 业务部署在平台托管环境 | 同环境自动通过校验,受平台约束 |
| ⑤ 运营商固定 IP / 专线 | 向运营商申请 | 从根解决,成本最高 |
| ⑥ 动态域名 + 自检告警 | 探测 + 比对 + 告警 | 只能治标:受「平台写接口缺口」约束,无法自动同步 |
中转方案必须同时满足以下四项,缺一不得上线:
- 鉴权:中转端必须校验调用方共享密钥;未鉴权的中转等同于对外代持调用能力。
- 最小权限:中转端应以路径白名单收敛可代理的接口集合。
- 流式转发:涉及素材上传时,必须关闭请求体缓冲(
proxy_request_buffering off),否则大文件上传失败。 - 上游域名重解析:平台域名解析到多个地址且会变,必须使用运行时 resolver + 变量式转发,不得用启动期静态解析。
判定规程
判定必须按下列顺序执行,任一步失败即按其语义退出,不得跳步:
- 解析基址:优先级 env > 工作区 config > 官方域名;非官方域名即判为 relay 模式。
- 探测出口:应取两个以上独立回显源交叉验证;不得以单一源的结果自证。多源不一致时必须在报告中标记。
- 取分账台账:按 appid 读取「已放行」集合;台账为空即视为首次运行,本次结果将作为首个样本。
- 判定:
- 命中台账 → 正常;
- 未命中且有台账 → 判漂移,置告警并在报告中写明「若随后调用返回来源不合规错误,即为白名单未收录该 IP」;
- 配置了期望值集合且不匹配 → 判强约束不符(常用于固定 IP 中转失效的自检)。 - 实调回写:以当前基址实调一次凭证接口;成功即把本次出口 IP 追加进「已放行」集合;失败为来源不合规错误时追加一条「被拒」记录。
必须遵守的五条禁止性条款:
- 不得把探针报告表述为「已自动修复」——受平台写接口缺口约束,探针只能告警。
- 不得跨账号写入同一台账条目。
- 不得在网络异常文本中保留凭证明文;脱敏必须覆盖
appid/secret/access_token三类字段。 - 不得因探测失败而阻断凭证判定;探测失败必须降级为「不影响后续判定」。
- 不得在 relay 模式下因本机 IP 漂移而告警;该模式下漂移降级为仅记录。
第三篇 执行与校验
执行接口
:表题: 表 8-1 执行接口一览
| 接口 | 载体 | 语义 |
|---|---|---|
| 出口自检 | wx_health.py --egress-only |
只探测与判定,不调用凭证接口;退出码 0 正常 / 2 漂移 / 3 探测失败 |
| 完整探针 | wx_health.py |
自检 + 凭证实调 + 台账回写;退出码 0/2/3/4(沿用既有语义) |
| 跳过自检 | wx_health.py --no-egress |
省一次探测开销,用于已知网络稳定的场合 |
| 临时基址 | wx_health.py --base <URL> |
验证中转用,不落盘、不改配置 |
| 台账重建 | wx_health.py --reset-egress |
换网络环境后重建,防历史 IP 造成误判 |
| 中转验收 | wechat_proxy/verify_proxy.py --base <URL> --key <KEY> |
双路对比(直连 vs 经中转)并给出判定矩阵 |
| 中转端 | wechat_proxy/wx-proxy.conf |
Nginx 反代配置成品 |
配置键(均为可选、非敏感项,缺失即维持旧行为):WECHAT_API_BASE(中转基址)、WECHAT_PROXY_KEY(中转鉴权)、WECHAT_EGRESS_IP_EXPECT(期望出口 IP,强约束)。
硬闸与校验
:表题: 表 9-1 硬闸与校验项
| 编号 | 校验项 | 判据 | 级别 |
|---|---|---|---|
| G-01 | 自检早于成文 | 探针在成文链路启动前执行 | P1 |
| G-02 | 多源交叉 | 探测源 ≥ 2 且失败不误判 | P1 |
| G-03 | 凭证脱敏 | 报告中不含 secret= 明文 |
P1 |
| G-04 | 分账正确 | 台账按 appid 分账,无跨账号混记 | P1 |
| G-05 | 模式一致 | relay 模式下不以本机 IP 漂移告警 | P1 |
| G-06 | 退出码语义 | 与第 8 章表 8-1 一致 | P1 |
| G-07 | 留痕完整 | 报告可被第三方仅凭留档复算 | P2 |
| G-08 | 中转四项齐备 | 鉴权 / 最小权限 / 流式转发 / 重解析 | P1(启用中转时) |
自检阶段 LLM 调用数必须为 0;台账文件必须可人工直读(纯文本 JSON)。
技术经济性核算
:表题: 表 10-1 技术经济性核算
| 项 | 计入 | 说明 |
|---|---|---|
| 新增常驻载荷 | 1 个台账文件 + 7 个报告字段 | 无新增进程、无新增依赖 |
| 单次自检开销 | 1~2 次轻量回显请求 | 远小于一次成文(百秒级)与配图成本 |
| 避免的损失 | 成文前的链路级阻断 | 原为「发完才发现」,损失一整个成文周期 |
| LLM 调用 | 0 | 判定全程纯脚本 |
| 结论 | 净收益为正 | 以可忽略常驻代价,换取失败可前置归因 |
第四篇 治理与实施
职责与监督
探针维护者负责保持退出码语义与配置键向后兼容;中转启用者负责保活、密钥轮换与出口自检;台账由探针自动维护,人工不得手工编辑(除 --reset-egress 重建)。
文档管理
本文件与其 docx 发布态同置于权威库 spec/3.行政法规/范式/,同主题只留最新版;历史版本经双盘同步机制留档。修订须递增版本号并同步登记表。
审批记录
:表题: 表 13-1 审批记录
| 日期 | 事由 | 结论 |
|---|---|---|
| 2026-09-14 | 首版立项(生产故障触发) | 通过(用户授权) |
修订记录
:表题: 表 14-1 修订记录
| 版本 | 日期 | 修订内容 | 依据 |
|---|---|---|---|
| V1.0.0 | 2026-09-14 | 首版发布:口径澄清、四层成因、六方案与中转四项、五步判定与五条禁止、执行接口、八项硬闸、经济性核算 | 宪法 V2.28.0 M0.7 第 24 条 |
附录 A 速查卡(规范性)
A.1 一页判定链
解析基址 → 多源探测出口 IPv4 → 取分账台账 → 命中/漂移/强约束不符 → 实调回写。
A.2 三句话归因
平台看到的 IP 变了 → 先问「是否经代理」;经代理 → 出口由代理上游决定;不经代理 → 按表 5-1 逐层定位。
A.3 四条最容易犯的错
把报错 IP 当成「本机 IP」;跨账号共用一份台账;把探针告警当成自动修复;探测单源失败即判定漂移。
附录 B 失效模式速查(规范性)
:表题: 表 B-1 失效模式与处置
| 现象 | 最可能成因 | 处置 |
|---|---|---|
| 来源不合规错误且本机刚重拨 | 接入层漂移 | 重新登记当前出口 IP,或改走固定 IP 中转 |
| 本机 IP 未变但仍报错 | 通道层(代理上游换节点) | 查代理上游出口,或改走固定 IP 中转 |
| 报错 IP 为内网/回环地址 | 配置填错对象 | 改为公网出口 IPv4 |
| 经中转仍报错 | 中转机 EIP 未绑 / 未登记 | 核对 EIP 绑定与白名单登记 |
| 上传大素材失败 | 中转未关请求体缓冲 | 按第 6 章第 3 项修正 |
附录 C 工具链清单
| 载体 | 用途 |
|---|---|
_tools/wx_health.py |
凭证闸 + 出口 IP 自检 + 分账台账 |
_tools/wechat_proxy/wx-proxy.conf |
中转端 Nginx 反代配置 |
_tools/wechat_proxy/verify_proxy.py |
中转双路验收器 |
_tools/wechat_proxy/README.md |
部署 / 验证 / 运维 / 回滚 SOP |
附录 D 明细字段清单
D.1 报告字段
egress_ip(出口 IPv4)、egress_agree(多源是否一致)、egress_mode(direct/relay)、proxy_in_use / proxy_env(代理旁证,值已脱敏)、egress_known_ok(台账已放行集合)、egress_drift(漂移判定)、egress_match_expected(强约束判定)。
D.2 CLI 参数
--egress-only / --no-egress / --base / --reset-egress / --json / --quiet。
附录 E 与上位条款及其他标准的映射
:表题: 表 E-1 条款映射
| 本文条款 | 上位/相关依据 |
|---|---|
| 第 3 章 范围、第 9 章 硬闸 | 宪法 M0.7 第 24 条 |
| 第 4 章 术语、第 7 章 判定规程 | 宪法 M0.7 第 16、17 条(前置闸与凭证实体唯一化) |
| 第 6 章 固定化方案 | 宪法 M0.7 第 10、13 条(技术经济性 / 载体收敛) |
| 第 8 章 执行接口 | LHB/TS-2026-008(纯脚本判定 + 前置闸同源口径) |
定稿校核结论
本文件按《技术标准成文规范》V1.1.0 成文,经 doc_style_check.py 判定 P1 项清零后发布;国标对齐度检测表随件留档。
宪法 > 基本法 > 行政法规 > 地方法规 > 地方规章