2. 接入流程拆解:从请求到业务流量的完整路径
零信任接入,说白了就是「不信设备、不信位置、只信身份和策略」。但很多运维兄弟在排查故障时,往往卡在「不知道当前走到哪一步了」。我见过太多人一上来就抓包看隧道,结果发现是策略评估阶段就拒绝了——白白浪费半天时间。
所以这一章,咱们把接入流程拆成四个阶段。你只要记住每个阶段的特征,排查时就能快速定位问题。
2.1 第一阶段:用户发起接入请求
用户双击客户端,或者浏览器访问某个受保护的应用。这时候客户端会做三件事:
- 设备环境检测:检查操作系统版本、补丁状态、是否安装杀毒软件、是否有可疑进程。
- 身份凭证收集:可能是用户名密码、证书、或者 SSO 令牌。
- 构造接入请求:把设备信息和身份凭证打包,发送到控制平面。
排查要点:如果用户连客户端都打不开,或者提示「设备不满足安全基线」,问题大概率出在这个阶段。我曾经遇到一个案例,用户死活连不上,最后发现是杀毒软件版本太旧,被策略直接拦截了。
这个阶段的请求格式通常是 JSON 或 Protobuf,通过 HTTPS 发送。我建议你在控制平面入口抓个包,看看请求是否真的到达了。很多故障其实是网络不通,跟零信任本身没关系。
2.2 第二阶段:控制平面策略评估
控制平面收到请求后,开始「审问」这个用户和设备。评估过程大致如下:
| 评估维度 | 检查内容 | 常见失败原因 |
|---|---|---|
| 身份认证 | 用户名/密码、MFA、证书 | 密码过期、MFA 超时、证书吊销 |
| 设备信任 | 设备指纹、合规状态、补丁等级 | 设备未注册、系统版本过低、越狱/root |
| 权限策略 | 用户角色、访问时间、目标应用 | 无权限、非工作时间、应用已下线 |
| 风险评分 | 异常行为、地理位置、历史记录 | 异地登录、频繁失败、黑名单 IP |
评估通过后,控制平面会生成一个临时令牌,里面包含了用户身份、允许访问的资源列表、以及策略约束(比如只能访问 80 端口)。
注意:令牌是有时效的,通常是 5-15 分钟。如果用户长时间没完成隧道建立,令牌过期了就得重新评估。我排查过一个诡异的问题:用户每次都能认证成功,但就是连不上——最后发现是客户端时钟偏差太大,令牌签发时间和本地时间差了 10 分钟,导致令牌被视为无效。
2.3 第三阶段:数据平面隧道建立
拿到令牌后,客户端开始跟数据平面的网关建立隧道。这一步是技术含量最高的,也是故障高发区。
隧道建立的过程:
- 网关发现:客户端通过 DNS 或内置列表找到最近的网关。
- DTLS 握手:建立加密通道,交换密钥。
- 令牌验证:网关拿着令牌去控制平面验证(或者本地缓存验证)。
- 隧道建立:双方协商好加密参数,隧道正式通车。
避坑指南:我曾经遇到一个客户,隧道总是建到一半就断了。抓包发现 DTLS 握手阶段,客户端发了个「HelloVerifyRequest」之后就没下文了。查了半天,原来是防火墙把 UDP 的 443 端口给拦截了。很多零信任方案默认用 UDP,但有些老旧防火墙只放行了 TCP。
隧道建立成功后,客户端会获得一个虚拟 IP 地址。这个 IP 是网关分配的,用于后续的业务流量转发。
2.4 第四阶段:业务流量转发
隧道建好了,用户终于可以访问业务了。但别高兴太早——流量转发阶段照样会出幺蛾子。
转发流程:
- 客户端把业务数据包封装在隧道里,发送到网关。
- 网关解封装,根据策略做应用层过滤(比如只允许 HTTP GET,不允许 POST)。
- 网关把数据包转发给后端业务服务器。
- 业务服务器的回包原路返回。
关键点:零信任网关在这里扮演的是「代理+防火墙」的角色。它不光转发流量,还会检查每个数据包是否符合策略。比如你只允许访问 8080 端口,用户却试图访问 22 端口——网关会直接丢弃。
这个阶段常见的故障:
- 路由问题:网关不知道业务服务器在哪,或者业务服务器回包路由不对。
- 策略过于严格:比如只允许 GET 请求,但业务系统用了 POST。
- MTU 问题:隧道封装增加了包头,导致数据包超过链路 MTU,被分片或丢弃。
2.5 整体流程可视化
下面这张图把四个阶段串起来了。你可以把它贴在工位上,排查时对着看。
2.6 各阶段日志特征
排查时,日志是最好的朋友。不同阶段的日志有不同特征,我整理了一个速查表:
| 阶段 | 日志关键词 | 常见错误码 |
|---|---|---|
| ① 请求 | CLIENT_HELLO, DEVICE_CHECK |
4001 设备不合规 |
| ② 评估 | POLICY_EVAL, TOKEN_ISSUE |
4010 认证失败, 4030 无权限 |
| ③ 隧道 | DTLS_HANDSHAKE, TUNNEL_UP |
5001 握手超时, 5003 令牌无效 |
| ④ 转发 | PROXY_SESSION, FORWARD |
6001 路由不可达, 6002 策略拒绝 |
我的习惯:每次排查前,先看一眼控制平面的日志,确认用户请求是否到达了阶段②。如果连阶段②的日志都没有,那问题肯定出在阶段①——网络或者客户端。这个简单的二分法,能帮你省掉至少一半的排查时间。