通过TLS的OpenVPN
您的VPN使用TCP作为传输协议。stunnel实例用于将TCP流的内容封装在TLS / TCP中。您得到以下协议栈:
[IP] <------------------------> [IP]
[OpenVPN] <------------------------> [OpenVPN]
[TLS] <~~~~~> [TLS]
[TCP] <-> [TCP] <-----> [TCP] <-> [TCP]
[IP] <-> [IP] <-----> [IP] <-> [IP]
[] [] [] []
服务器通道客户端
在通道实例之间,您具有以下协议堆栈:
[IP]
[OpenVPN]
[TLS]
[TCP(443)]
[IP]
[...]
TLS加密其有效负载时,攻击者只能看到:
[??? ]
[TLS]
[TCP(443)]
[IP]
[...]
因此,是的,这是普通的TLS流量(对于查看流量的人来说,可以是HTTP / TLS,SMTP / TLS,POP / TLS或其他任何方式,但由于使用了TCP端口443,它看起来很像HTTP / TLS)。您可以使用Wireshark进行检查:记录Stunnel实例之间的流量。在wireshark UI(流数据包上的右键)上,您可以要求wireshark将流量解释为TLS:它将识别为TLS流量(您将看到不同的TLS消息,但看不到TLS会话的有效负载) 。
您可能想在客户端中使用SNI,以便看起来像现代浏览器将执行的操作。您可能还想使用ALPN,但是stunnel当前无法处理。
具有内置TLS的OpenVPN
相比之下,如果您使用的是OpenVPN,则将具有以下内容:
[IP]
[OpenVPN]
[TCP]
[IP]
[...]
看起来像这样:
[??? ]
[OpenVPN]
[TCP]
[IP]
[...]
内置TLS层不封装(IP,以太网)数据包,而仅用于设置会话和身份验证:
[TLS]
[OpenVPN]
[TCP]
[IP]
[...]
在这种情况下,您的流量并没有看起来像一个普通的TLS流量,但显然是OpenVPN的。如果在wireshark中将此流量解释为OpenVPN,您将识别出OpenVPN消息,并在其中识别TLS消息(但不包括有效载荷)。
警告
您应该注意,如果被动攻击者无法分辨出您的远程服务器实际上是OpenVPN服务器,那么主动攻击者将能够发现这一点:只需通过TLS连接到您的服务器,他就可以确认它不是 HTTP / TLS服务器。通过尝试说出OpenVPN协议,他将能够检测到您的服务器是OpenVPN / TLS服务器。
使用客户端身份验证的TLS上的OpenVPN
您担心这样做会启用TLS客户端身份验证:攻击者将无法启动有效的TLS会话,也无法猜测通过TLS封装了哪些有效负载。
*警告:**我不是在谈论OpenVPN内置的TLS支持(请参阅上面的en解释为什么它无法帮助您)。
多重OpenVPN / TLS和HTTP / TLS
另一个解决方案是通过TLS会话同时提供HTTP和OpenVPN。 sslh可用于自动检测协议的有效负载并将其分派到纯HTTP / TCP服务器或您的OpenVPN / TCP服务器。该服务器将看起来像标准的HTTP / TLS服务器,但是尝试与此服务器通话OpenVPN / TLS的人将能够检测到它实际上也是OpenVPN / TLS服务器。
要么是OpenVPN / TCP
或HTTP / TCP
[1] .---------。.------。HTTP / TCP .-------------。
-> | 漏斗| ----> | sslh | -------> | HTTP服务器|
'---------''------'| '-------------'
| .----------------。
'------> | OpenVPN服务器|
OpenVPN / TCP'----------------'
[1] = OpenVPN / TLS / TCP或HTTP / TLS / TCP
通过TLS的HTTP CONNECT上的OpenVPN
另一个解决方案是使用标准HTTP / TLS服务器并使用HTTP CONNECT / TLS连接到OpenVPN服务器:它看起来像是标准HTTP服务器。您甚至可以要求对客户端进行身份验证才能授权HTTP CONNECT请求(鱿鱼应该可以这样做)。
OpenVPN可以选择使用HTTP代理:
http-proxy proxy.example.com
您应该可以将其与连接到远程HTTPS PROXY的stunnel实例结合使用:
http-proxy 127.0.0.1 8443
remote vpn.example.com
哪个将实现此协议栈:
[IP] <------------------------> [IP]
[OpenVPN] <------------------------> [OpenVPN]
[HTTP] <-------------> [HTTP]
[TLS] <~~~~~> [TLS]
[TCP] <-> [TCP] <-----> [TCP] <-> [TCP]
[IP] <-> [IP] <-----> [IP] <-> [IP]
[] [] [] []
服务器HTTPS PROXY stunnel客户端