stunnel vpn 流量并确保它看起来像端口 443 上的 SSL 流量

stunnel vpn 流量并确保它看起来像端口 443 上的 SSL 流量

我正在尝试使我的传出和传入流量看起来尽可能接近 SSL 流量的合法性。有没有办法对我自己的流量进行深度数据包检测,以确保它看起来像 SSL 流量而不是 OpenVPN 流量?根据我的配置设置,所有流量是否都使用端口 443(即 SSL 端口)?

我的配置如下:

笔记本电脑上的STUNNEL:

[openvpn]
# Set sTunnel to be in client mode (defaults to server)
client = yes  
# Port to locally connect to
accept = 127.0.0.1:1194  
# Remote server for sTunnel to connect to
connect = REMOTE_SERVER_IP:443

笔记本电脑上的 OPENVPN 配置:

client
dev tun
proto tcp
remote 127.0.0.1 1194
resolv-retry infinite
nobind
tun-mtu 1500
tun-mtu-extra 32
mssfix 1450
persist-key
persist-tun

服务器上的隧道配置:

sslVersion = all
options = NO_SSLv2
;chroot = /var/lib/stunnel4/
; PID is created inside the chroot jail
pid = /stunnel4.pid
; Debugging stuff (may useful for troubleshooting)
 debug = 7
 output = /var/log/stunnel4/stunnel4.log
setuid = root
setgid = root
socket = l:TCP_NODELAY=1
socket = r:TCP_NODELAY=1
compression = zlib
[openvpn]
accept = REMOTE_SERVER_IP:443
connect = REMOTE_SERVER_IP:11440
cert=/etc/stunnel/server.pem
key=/etc/stunnel/server.key

服务器上的 OPENVPN CONFIG:

local REMOTE_SERVER_IP
port 11440
proto tcp

答案1

通过 TLS 实现的 OpenVPN

您的 VPN 使用 TCP 作为传输协议。stunnel 实例用于将 TCP 流的内容封装在 TLS/TCP 中。您将获得以下协议栈:

[IP]<------------------------>[IP]
[OpenVPN]<------------------------>[OpenVPN]
            [TLS]<~~~~~>[TLS]
[TCP]<->[TCP]<----->[TCP]<->[TCP]
[IP ]<->[IP ]<----->[IP ]<->[IP ]
[ ] [ ] [ ] [ ]
 服务器 stunnel stunnel 客户端

在 Stunnel 实例之间,线路上有以下协议栈:

[知识产权]
[OpenVPN]
[TLS]
[TCP(443)]
[知识产权]
[...]

由于 TLS 加密了其有效负载,攻击者只能看到:

【???】 ]
[TLS]
[TCP(443)]
[知识产权]
[...]

所以是的,它是纯 TLS 流量(对于查看流量的人来说,它可能是 HTTP/TLS、SMTP/TLS、POP/TLS 或其他任何流量,但由于使用了 TCP 端口 443,它看起来很像 HTTP/TLS)。您可以使用 wireshark 检查这一点:记录 stunnel 实例之间的流量。在 wireshark UI(流数据包上的右键按钮)中,您可以要求 wireshark 将流量解释为 TLS:它会将其识别为 TLS 流量(您将看到不同的 TLS 消息,但不会看到 TLS 会话的有效负载)。

你可能想要使用信噪比在客户端中,以便看起来像现代浏览器会做的事情。你可能想使用阿尔及利亚国家铁路网络但是 stunnel 目前还不能处理这个问题。

内置 TLS 的 OpenVPN

相比之下,如果你使用 OpenVPN,你会看到如下内容:

[知识产权]
[OpenVPN]
[TCP]
[知识产权]
[...]

看起来像这样:

【???】 ]
[OpenVPN]
[TCP]
[知识产权]
[...]

内置的 TLS 层不封装(IP、以太网)数据包,而仅用于建立会话和进行身份验证:

[TLS]
[OpenVPN]
[TCP]
[知识产权]
[...]

在这种情况下,你的流量不是看起来像普通的 TLS 流量,但显然是 OpenVPN。如果你在 wireshark 中将此流量解释为 OpenVPN,你将识别出OpenVPN 消息及其内部的 TLS 消息(但不是有效载荷)。

警告

你应该意识到,如果被动攻击者无法分辨你的远程服务器实际上是一个 OpenVPN 服务器,那么主动攻击者将能够发现这一点:只需通过 TLS 连接到你的服务器,他就能确认它是不是HTTP/TLS 服务器。通过尝试使用 OpenVPN 协议,他将能够检测到您的服务器是 OpenVPN/TLS 服务器。

使用客户端身份验证通过 TLS 实现 OpenVPN

如果您担心这个问题,您可以启用 TLS 客户端身份验证:攻击者将无法启动有效的 TLS 会话,也无法猜测哪个有效负载是通过 TLS 封装的。

警告:* 我不是谈论 OpenVPN 中内置的 TLS 支持(请参阅上文了解为什么它对您没有帮助)。

多路复用 OpenVPN/TLS 和 HTTP/TLS

另一个解决方案是通过 TLS 会话同时提供 HTTP 和 OpenVPN。 安全组可用于自动检测协议的有效负载并发送到普通的 HTTP/TCP 服务器或 OpenVPN/TCP 服务器。该服务器看起来像标准的 HTTP/TLS 服务器,但尝试与该服务器进行 OpenVPN/TLS 通信的人将能够检测到它实际上也是一个 OpenVPN/TLS 服务器。

        OpenVPN/TCP
          或 HTTP/TCP       
[1].---------.------.HTTP/TCP.----------.
-->| stunnel |---->| sslh |------->| HTTP 服务器 |
   '---------' '------'| '-------------'
                           | .----------------.
                           '------>| OpenVPN 服务器 |
                        OpenVPN/TCP'----------------'

[1]= OpenVPN/TLS/TCP 或 HTTP/TLS/TCP

通过 HTTP 连接 OpenVPN 通过 TLS

另一个解决方案是使用标准 HTTP/TLS 服务器并使用 HTTP CONNECT/TLS 连接到 OpenVPN 服务器:它看起来像一个标准 HTTP 服务器。您甚至可以要求客户端进行身份验证以授权 HTTP CONNECT 请求(squid 应该能够做到这一点)。

OpenVPN 有一个使用 HTTP 代理的选项:

http-proxy proxy.example.com

您应该能够将其与连接到远程 HTTPS 代理的 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 代理隧道 客户端

答案2

ysdx 的回答很棒,很好地描述了流量在线路上的表现。

然而,没有提到的是,流量分析对于识别应用程序有很大帮助。

我们假设您的 OpenVPN 连接看起来就像线路上的 https 连接,因此攻击者无法读取字节流并知道它是什么类型的连接。

典型的 https 连接不会持续太久。也许您的浏览器会保持与您的邮件服务器的连接,我不知道。但一般来说,会有很多与许多不同的远程服务器的相对较短的连接。

另一方面,OpenVPN 连接可能会持续数小时或数天,并且会向 openvpn 服务器来回发送大量数据。

您可以通过定期断开和重新启动连接来缓解长连接问题。这可能对您的应用程序流量有影响,但可能是可行的。然而,您和 openvpn 服务器之间有大量流量的模式将很难伪装。

相关内容