是的,这里不需要任何魔术,只需对TCP数据包内容进行简单匹配即可。即使SSH和TLS(SSL)加密了它们的有效负载,协议标头本身仍然是可区分的并且彼此之间非常不同。例如,SSHv2连接始终从客户端发送开始SSH-2.0-(client name and version)
。同样,即使您的防火墙无法真正知道TLS连接内部是否带有HTTP,它也可以识别TLS本身。
TCP之上的此类层检查通常属于“深度数据包检查”,这是一个相对常见的功能。
一种明显的绕过此方法的方法是在 TLS 内建立SSH隧道-例如,使用tunnel,haproxy或sniproxy。(除了普通隧道(端口443专用于SSH-over-TLS)之外,它们还可以基于SNI和ALPN在同一端口上复用SSH / HTTP /其他协议。)
尽管这并不总是会打败真正复杂的流量分析,但它仍会绕过大多数过滤器,这些过滤器仅检查“看起来像TLS标头”。
然后是恼人的防火墙- 拦截TLS来解密和重新加密所有流量的防火墙。这些实际上可以在TLS内部看到,并且可以在阻止其他所有内容的同时传递HTTP请求。(请注意,某些防病毒程序也具有相同的作用。)您可以通过查看服务器证书来识别这种情况。所有代理生成的证书看起来都是相同的,并且通常不会通过验证,而真实证书是由各种不同的CA颁发的。