支持工单常常在防火墙变更已获批准、隧道却仍拒绝建立时到来。当只有一端具备该功能时,这就是必然结果:RFC 9329 的 TCP 封装必须在两端实现并配置,而且要在任何受保护流量通过之前,在连接内部完成协商。开放端口只是对外宣称可能存在一个监听器,而另一端没有相应配置的监听器会接受连接然后陷入沉默。下面的顺序把成本最低的检查放在最前面。

弄清这个选项究竟增加了什么

原生 IPsec 把加密载荷作为 IP 协议 50 传输,没有需要放行的端口号。NAT 穿透会把这些数据包封装进 UDP 送到 4500 端口,所以许多防火墙规则都会提到这个端口。RFC 9329 增加了流式表示:IKE 和 IPsec 数据包都在同一条 TCP 连接内传输,通常发往 4500 端口。

这条流不是 Web 服务。到 4500 的 TCP 连接与 HTTP、TLS 或代理友好性毫无关系,路径上的 HTTP 代理通常会破坏分帧而不是转发它。

动手改防火墙之前先做预检

标准把 TCP 定位为丢弃 UDP 路径的网络的回退方案,而不是替代方案。向每家厂商确认两件事:功能的确切名称,以及实现 RFC 9329 而非专有变体的版本。IPsec over TCP 这类标签曾被用于无关设计,所以要索取文档引用和开启它的配置键。两个答案都没有时,不要对线路兼容性做任何假设。

在两端都由您掌控的实验室里验证。网关在 TCP 4500 上应答却从不完成 IKE,这正是另一端缺少匹配封装的监听器的特征,在那里发现问题比在变更窗口中发现便宜得多。

在响应端:是否有进程在监听

从套接字开始。ss -ltnp | grep 4500 显示是否存在 TCP 监听器以及哪个进程占用它。没有这一行,排查就止于网关配置,而不是网络。

如果套接字存在,就观察握手,而不是从客户端一侧猜测:tcpdump -ni any 'tcp port 4500'。三次握手完成之后陷入沉默,说明流已被接受而其中的 IKE 交换失败;SYN 得不到回应则指向过滤或错误地址。

在同一抓包窗口内与 UDP 路径对比,以免两者混淆:tcpdump -ni any 'udp port 4500 or proto 50'。在您认为使用 TCP 的时候却出现协议 50 或 UDP 4500 端口的流量,说明两端从未就回退方案达成一致。条件允许时也在网关上抓包,因为客户端一侧的抓包看不到远端发送了什么。

分四个独立阶段验收

把建立过程看成四个结果。每个都可能因不同原因失败,而单一的通过或失败会掩盖是哪一步,所以要在第一个失败的阶段停下,然后从头再来。

StageWhat you checkWhat it proves
1TCP connection established to 4500A listener exists and the path permits it
2IKE_SA authenticated in the gateway logBoth peers agreed on the encapsulation
3CHILD_SA installed, visible with ip xfrm stateKeys exist for the protected traffic
4A new application exchange succeedsThe data path works, not just the control path

第四阶段最容易被跳过。已有会话可能靠缓存状态继续工作,所以在结束变更之前,要从网关后面的主机发起一条新连接。如果第二阶段失败而第一阶段通过,分歧在提议或封装设置上,不在防火墙。

回滚,以及长期开启的代价

变更前先规划撤销:在两端关闭封装选项,确认隧道恢复走 UDP。如果以后还需要回退方案,就把 TCP 规则保留一个评审周期再删除。4500 上闲置的监听器是没有运营价值的攻击面。

一旦它承载真实业务,就留意性能特征。TCP 套 TCP 会增加确认层,单次丢包就会卡住;共享一条连接的流还会互相阻塞,所以要测量将要使用隧道的应用,而不是只做 ping。

验收清单

确认两端的功能名称与版本、响应端的监听器、显示握手完成的抓包,以及带时间戳记录的四个阶段。把回退原因写进变更记录,让下一位工程师知道为什么这里要用 TCP。在真正需要之前先演练回滚。

任何一个阶段失败,就只修那一个阶段。为了追查传输问题去改加密套件或身份设置,通常会在第一个故障之上再加一个无关的第二个故障。

相关文章