两种设计都能在 443 端口上运行 TLS,含义却可以完全不同。包装层保护一条配置好的连接,它位于本地端口与远端后端之间。网络接入型设计承载选定的流量,并改变客户端能够到达的范围。按顺序做完下面四项检查,你就能确定自己面对的是哪一种,这通常足以判断哪一层失效了。

从你真正配置的那条连接开始

在比较产品之前,先写下前端和后端。包装层在本地地址上监听,并把流量转发到远端,或者在远端启动一个程序,这一对就是它的全部合约。客户端的其他应用对此一无所知,除非你把它们指向那里。这不是工具的缺陷,工具本来就是干这个的。

网络型设计的合约不一样,它体现在路由和策略上,而不是一对端口上。

注意这两种描述哪一种符合你的图。如果答案是一个中间带证书的端口映射,那它就是包装层,哪怕产品名写着 VPN。如果答案是隧道接口和路由变更,那它就是网络型设计,哪怕它跑在 443 上。

检查包装层连接到哪里

读取监听与连接设置,并一路追到真正的后端。转发到数据库端口的包装层并没有打开 Web 应用,而执行程序的包装层启动的是那个程序,而不是把主机上其他所有东西都发布出去。后端是包装层唯一知道的东西。

接着判断 TLS 结束之后被转发的流是不是明文。被包装的连接保护的是两个包装层之间的那一段,远端包装层之后发生什么则是另一个问题。所以,包装一个本身已有保护的东西,有时是明智的,有时只是多了一堆活动部件。去检查下一跳,而不是假定任何一种答案。

openssl s_client -connect wrapper.lab.example:443 -servername wrapper.lab.example -verify_return_error
sudo ss -ltnp | grep 443

第一条命令显示客户端实际被提供的证书,第二条显示主机上有什么在监听。在读其他任何东西之前,先把那个证书名与你预期的名字对比一下。

检查设计承载什么流量

网络接入型设计承载选定的流量,并与客户端的路由和访问策略集成。准入不等于授权,因此已认证的连接仍然需要决定它能到达哪些资源。无客户端门户是第三种模型,它代理受支持的操作,却从不以 tun 接口的形式出现。

产品标签不会告诉你买的是哪一种模型,端口号告诉你的就更少。

叠加是可能的,也不该把比较搞混。隧道协议本身可以在受支持的 TCP 安排下被 TLS 包起来,这会在隧道外面加一层,却不会让包装层变成隧道。这是一个带有自身性能与故障行为的设计选择,值得在图上占一行。记下它,然后比较底层模型,而不是外面那层包装。

检查失效的边界,而不是标签

把一次失败尝试的事实写下来:前端地址、监听者、客户端验证的身份、后端目标以及请求的操作。一次成功的握手只能证明外层 TLS 完成了,对后端什么也说明不了。后端拒绝与前端的身份失败是两件不同的事,把 -verify_return_error 从客户端去掉,两者都不会变好。要拿同类情况互相比,因为通过另一个主机名或端口取得的成功,并不能说明条件相同。

443 端口只是一种惯例,让 TLS 能穿过中间设备。它并不会让任意流量看起来像发给策略设备的 Web 请求。

最后用一句话点明端点对、承载了什么、哪些应用在用它,以及目的地强制执行什么权限。填不满这四个空的设计就没有完成,无论它的标签怎么声称。这句话也是向防火墙的负责人解释这个设计的最快方式。

相关文章