我正在尝试使我的传出和传入流量看起来尽可能接近 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 服务器之间有大量流量的模式将很难伪装。