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
您的 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 目前无法处理。
相比之下,如果您使用的是 OpenVPN,您将看到如下内容:
[知识产权] [OpenVPN ] [TCP] [知识产权] [...]
看起来像这样:
[???] [OpenVPN ] [TCP] [知识产权] [...]
内置的 TLS 层不封装(IP、以太网)数据包,仅用于建立会话和身份验证:
[TLS] [OpenVPN ] [TCP] [知识产权] [...]
在这种情况下,您的流量并没有看起来像一个普通的TLS流量,但显然是OpenVPN的。如果您将此流量解释为 Wireshark 中的OpenVPN,您将识别OpenVPN 消息和其中的 TLS 消息(但不是有效负载)。
您应该知道,如果被动攻击者无法判断您的远程服务器实际上是 OpenVPN 服务器,则主动攻击者将能够发现这一点:只需通过 TLS 连接到您的服务器,他就能够确认它不是HTTP/TLS 服务器。通过尝试说出 OpenVPN 协议,他将能够检测到您的服务器是 OpenVPN/TLS 服务器。
如果您担心这一点,您可以启用 TLS 客户端身份验证:攻击者将无法启动有效的 TLS 会话,也无法猜测哪个有效负载封装在 TLS 上。
*警告:** 我不是在谈论 OpenVPN 中的内置 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
另一种解决方案是使用标准的 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 客户端
ysdx 的回答很好,并且很好地描述了网络上的流量。
然而,没有提到的是,流量分析对识别应用程序大有帮助。
让我们假设您的 OpenVPN 连接看起来就像网络上的 https 连接,因此攻击者无法读取字节流并知道它是哪种连接。
典型的 https 连接不会存活太久。也许您的浏览器保持与邮件服务器的连接打开,我不知道。但总的来说,到许多不同的远程服务器会有很多相对较短的连接。
OTOH,OpenVPN 连接可能会持续数小时或数天,并且会向 openvpn 服务器来回发送大量数据。
您可以通过定期删除和重新启动连接来缓解长期连接。这可能会对您的应用程序流量产生影响,但可能是可行的。然而,你和 openvpn 服务器之间大量流量的模式将更难以伪装。