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

Jas*_*son 16 linux vpn openvpn stunnel

我试图使我的传出和传入流量看起来尽可能接近 SSL 流量的合法性。有没有办法对我自己的流量进行 DPI 以确保它看起来像 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
Run Code Online (Sandbox Code Playgroud)

笔记本电脑上的 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
Run Code Online (Sandbox Code Playgroud)

服务器上的 STUNNEL 配置:

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
Run Code Online (Sandbox Code Playgroud)

服务器上的 OPENVPN 配置:

local REMOTE_SERVER_IP
port 11440
proto tcp
Run Code Online (Sandbox Code Playgroud)

ysd*_*sdx 24

基于 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 或其他任何东西,但它看起来很像 HTTP/TLS,因为使用了 TCP 端口 443)。你可以使用wireshark来检查:记录stunnel实例之间的流量。在wireshark UI(流的数据包上的右键)中,您可以要求wireshark将流量解释为TLS:它会将其识别为TLS流量(您将看到不同的TLS消息,但不会看到TLS会话的有效负载) .

您可能希望在客户端中使用SNI,以便看起来像现代浏览器会做的那样。您可能还想使用ALPN,但 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 提供服务。 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

OpenVPN over HTTP CONNECT over TLS

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

OpenVPN 可以选择使用 HTTP 代理:

http-proxy proxy.example.com
Run Code Online (Sandbox Code Playgroud)

您应该能够将其与连接到远程 HTTPS 代理的 stunnel 实例结合使用:

http-proxy 127.0.0.1 8443
remote vpn.example.com
Run Code Online (Sandbox Code Playgroud)

这将实现这个协议栈:

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


Dan*_*tts 7

ysdx 的回答很好,并且很好地描述了网络上的流量。

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

让我们假设您的 OpenVPN 连接看起来就像网络上的 https 连接,因此攻击者无法读取字节流并知道它是哪种连接。

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

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

您可以通过定期删除和重新启动连接来缓解长期连接。这可能会对您的应用程序流量产生影响,但可能是可行的。然而,你和 openvpn 服务器之间大量流量的模式将更难以伪装。

  • 是的。更重要的是,我想可能可以查看流量​​的形状(例如其“突发性”)并将其与标准 HTTP/TLS、IMAP/TLS、POP/TLS、OpenVPN/TLS 进行比较。您可能会尝试使用这些流量配置文件对给定的 TLS 流量进行分类,并了解封装在 TLS 连接中的流量类型。 (4认同)