13 网络、代理与证书工具
网络、代理与证书工具解决的是“开发环境为什么访问不到、为什么证书不被信任、为什么同一服务在浏览器、CLI、IDE、容器和 CI 里表现不一致”。排障必须先证明故障发生在哪一层,再决定改 DNS、代理、信任库、客户端配置还是服务端,而不是轮流关闭证书校验和防火墙碰运气。
架构师看这一类工具,重点不是背命令,而是建立证据链:DNS 是否解析正确,TCP 端口是否可达,TLS/SNI/证书链是否匹配,HTTP 代理是否介入,业务请求是否带了正确身份,抓包证据是否可脱敏共享,临时隧道是否把本地敏感端口暴露到了公网。
本目录同时保留任务入口与产品入口。连通性 CLI 和研发工具代理页以一次可复核任务为边界,允许调用多个工具但不替代它们的产品教程;OpenSSL、mkcert、keytool、Charles、Fiddler、mitmproxy、Wireshark、ngrok、Cloudflare Tunnel 与 frp 则各自承担独立产品入口。
从失败现象选择第一组证据
| 失败现象 | 首个入口 | 必须留下的证据 |
|---|---|---|
| 域名不解析、端口超时或路由异常 | 连通性 CLI | DNS 答案、目标 IP、TCP 结果、路由节点和执行网络 |
| Git、npm、Maven、Docker 或 IDE 只有部分可联网 | 系统与工具代理 | 每层代理来源、NO_PROXY、daemon / build / runtime 差异 |
| 不确定服务端发送了什么链、SAN 是否匹配、证书和私钥是否配对 | OpenSSL | SNI、服务端列表、可信链、主机名、证书对象和密钥摘要 |
| 需要给本地域名签发受开发机信任的证书 | mkcert | CAROOT、信任库范围、SAN、CA 私钥保管与卸载反证 |
| 浏览器正常而目标 Java 运行时报 PKIX 或需要管理服务身份 | keytool | java.home、store type、alias、条目类型、指纹和删除命令 |
| 需要桌面交互、移动端引导、Map 或断点 | Charles | 代理路径、SSL Proxying host、Map/Rewrite 命中和清理反证 |
| 需要跨平台 GUI、Rules、Composer 或 Fiddler 遗留资产 | Fiddler | 产品线、capture source、CA store、会话和共享边界 |
| 需要脚本化 addon、无头采集、重放或 CI 夹具 | mitmproxy | options、flow filter、addon 命中、进程与状态清理 |
| 需要证明 DNS、TCP、TLS 在线路上的实际行为 | Wireshark | 网卡、过滤器、时间窗、五元组和脱敏 pcap |
| 需要用托管 Endpoint 临时接收 Webhook 并执行流量策略 | ngrok | Agent Config v3、Traffic Policy、流量检查和 Endpoint 回收 |
| 需要受管 Tunnel、稳定域名和组织身份策略 | Cloudflare Tunnel | connector、DNS route、ingress、Access 和凭证回收 |
| 已有公网主机并愿意承担自建反向代理运维 | frp | frps/frpc、控制认证、端口容量、访客权限和公网运维 |
开始操作前,应确认目标属于开发、测试、演示或授权排障环境,明确本机处于公司内网、VPN、代理、TUN、容器、WSL 还是 CI runner,并准备不含真实密码、token、Cookie 和业务数据的测试请求。抓包、临时 CA、代理和隧道都要在任务结束时从系统信任链、启动项、IDE 和团队模板中回收。
一次分层网络验证
每一次网络排障都应该留下最小证据包:执行了哪些命令,在哪个网络、哪个终端、哪个容器或哪个 IDE 里执行,目标域名和端口是什么,代理是否启用,证书链来自哪里,失败现象是解析失败、连接超时、连接拒绝、证书错误、代理认证失败、HTTP 错误还是业务错误。
团队治理原则
| 原则 | 判断标准 |
|---|---|
| 分层验证 | 浏览器通不代表 CLI 通,宿主机通不代表容器通,IDE 通不代表 Maven / npm / Docker 通 |
| 显式代理 | 每个工具都要能说清代理来源:系统、环境变量、工具配置、IDE 配置、daemon 配置或容器变量 |
| 证书可回滚 | 每一次导入根证书、抓包 CA 或企业 CA,都必须有 alias、路径、指纹、用途和删除命令 |
| 抓包最小化 | 只抓受控域名、短时间、小样本;导出 HAR、SAZ、flow、pcapng 和 key log 前必须脱敏 |
| 隧道默认危险 | 任何把本地端口映射到公网的工具,都要默认加认证、限定服务、限定生命周期并记录关闭动作 |
| 模板不带秘密 | 文档、脚本、截图、配置示例只写占位符和判断标准,不写真实 token、Cookie、证书私钥和内网域名 |
最容易制造假象和扩大事故的地方
系统代理不是全局真理
Windows 用户代理、WinHTTP、macOS 网络服务代理、Linux 环境变量、Git 配置、npm 配置、Maven settings.xml、Docker daemon、Docker build、容器运行时、IDE 插件和语言服务器都可能各走一套规则。团队文档不能写“配置系统代理即可”,必须逐层验证。
证书信任链有多个世界
浏览器信任不等于 Java 信任,Java 信任不等于 Node 信任,宿主机信任不等于容器信任,Docker 拉镜像信任不等于容器内应用信任。只要企业 HTTPS 拦截、本地自签、mkcert、抓包 CA 或内网 CA 参与,就要把 OS、浏览器、JDK、Node、Docker host、镜像和运行容器分开检查。
抓包文件就是敏感数据文件
HAR、SAZ、mitmproxy flow、pcapng、TLS key log、Charles session、Fiddler export 都可能包含 Authorization、Cookie、请求体、响应体、设备标识、内部域名和用户数据。它们不能当普通日志贴到工单和群聊里。
临时隧道会绕过很多默认防线
ngrok、Cloudflare Tunnel quick tunnel、frp 都能让本地服务被外部访问。它们适合 Webhook、移动端回调和短时演示,但不适合无认证暴露管理台、数据库、Redis、MQ、Jenkins、Kibana、Actuator、Swagger 或本地文件服务。
团队落地文件建议
docs/tools/network/
connectivity-checklist.md
proxy-layer-matrix.md
certificate-trust-boundary.md
capture-and-redaction-policy.md
tunnel-exposure-policy.md
scripts/network/
check-connectivity.sh
check-proxy-env.ps1
check-cert-expiry.sh这些模板只沉淀“怎么验证、怎么回滚、怎么脱敏、谁负责”,不沉淀真实代理账号、企业根证书私钥、抓包 CA 私钥、公网隧道 token 和生产内网地址。
