OpenVPN sur TLS
Votre VPN utilise TCP comme protocole de transport. L'instance stunnel est utilisée pour encapsuler le contenu du flux TCP dans TLS / TCP. Vous obtenez cette pile de protocoles:
[IP] <------------------------> [IP]
[OpenVPN] <------------------------> [OpenVPN]
[TLS] <~~~~~> [TLS]
[TCP] <-> [TCP] <-----> [TCP] <-> [TCP]
[IP] <-> [IP] <-----> [IP] <-> [IP]
[] [] [] []
Serveur stunnel stunnel Client
Entre les instances stunnel, vous avez cette pile de protocoles sur le fil:
[IP]
[OpenVPN]
[TLS]
[TCP (443)]
[IP]
[...]
Comme le TLS crypte sa charge utile, un attaquant ne peut voir que:
[??? ]
[TLS]
[TCP (443)]
[IP]
[...]
Alors oui, c'est du trafic TLS (il peut s'agir de HTTP / TLS, SMTP / TLS, POP / TLS ou de toute autre chose pour quelqu'un qui regarde le trafic, mais cela ressemble beaucoup à HTTP / TLS car le port TCP 443 est utilisé). Vous pouvez le vérifier en utilisant WireShark: enregistrez le trafic entre les instances Stunnel. Dans l'interface de Wireshark (bouton droit sur un paquet du flux), vous pouvez demander à Wireshark d'interpréter le trafic comme TLS: il le reconnaîtra comme du trafic TLS (vous verrez les différents messages TLS mais pas la charge utile de la session TLS) .
Vous voudrez peut-être utiliser SNI dans le client afin de ressembler à ce que ferait un navigateur moderne. Vous pouvez utiliser ALPN aussi bien , mais stunnel actuellement ne gère pas.
OpenVPN avec TLS intégré
En comparaison, si vous utilisez OpenVPN, vous aurez quelque chose comme ceci:
[IP]
[OpenVPN]
[TCP]
[IP]
[...]
Qui ressemble à ceci:
[??? ]
[OpenVPN]
[TCP]
[IP]
[...]
La couche TLS intégrée n'encapsule pas les paquets (IP, Ethernet) mais est uniquement utilisée pour configurer la session et authentifier:
[TLS]
[OpenVPN]
[TCP]
[IP]
[...]
Dans ce cas, votre trafic ne ressemble pas à un trafic TLS ordinaire mais est évidemment OpenVPN. Si vous interprétez ce trafic comme OpenVPN dans Wireshark, vous reconnaîtrez les messages OpenVPN et à l'intérieur d'eux les messages TLS (mais pas la charge utile).
avertissement
Vous devez savoir que si un attaquant passif ne peut pas dire que votre serveur distant est en fait un serveur OpenVPN, un attaquant actif pourra le savoir: simplement en se connectant à votre serveur via TLS, il pourra pour confirmer qu'il ne s'agit pas d' un serveur HTTP / TLS. En essayant de parler le protocole OpenVPN, il pourra détecter que votre serveur est un serveur OpenVPN / TLS.
OpenVPN sur TLS avec authentification client
Si cela vous inquiète, vous pouvez activer l'authentification du client TLS: un attaquant ne pourra pas lancer une session TLS fonctionnelle et ne pourra pas deviner quelle charge utile est encapsulée sur TLS.
* Avertissement: ** Je ne parle pas de la prise en charge TLS intégrée dans OpenVPN (voir ci-dessus pour une explication des raisons pour lesquelles cela ne vous aidera pas).
OpenVPN / TLS multiplexé et HTTP / TLS
Une autre solution consiste à servir à la fois HTTP et OpenVPN sur la session TLS. sslh peut être utilisé pour détecter automatiquement la charge utile du protocole et l'envoyer à un serveur HTTP / TCP standard ou à votre serveur OpenVPN / TCP. Le serveur ressemblera à un serveur HTTP / TLS standard mais une personne essayant de parler OpenVPN / TLS avec ce serveur pourra également détecter qu'il s'agit en fait d'un serveur OpenVPN / TLS.
soit OpenVPN / TCP
ou HTTP / TCP
[1].---------. .------. HTTP / TCP .-------------.
-> | stunnel | ----> | sslh | -------> | Serveur HTTP |
'---------' '------' | «-------------»
| .----------------.
«------> | Serveur OpenVPN |
OpenVPN / TCP '----------------'
[1] = Soit OpenVPN / TLS / TCP ou HTTP / TLS / TCP
OpenVPN sur HTTP CONNECT sur TLS
Une autre solution consiste à utiliser un serveur HTTP / TLS standard et à utiliser HTTP CONNECT / TLS pour se connecter au serveur OpenVPN: il ressemblera à un serveur HTTP standard. Vous pouvez même exiger une authentification du client afin d'autoriser la requête HTTP CONNECT (squid devrait pouvoir le faire).
OpenVPN a une option pour utiliser un proxy HTTP:
http-proxy proxy.example.com
Vous devriez pouvoir combiner ceci avec une instance stunnel se connectant à un proxy HTTPS distant:
http-proxy 127.0.0.1 8443
remote vpn.example.com
Qui implémenterait cette pile de protocoles:
[IP] <------------------------> [IP]
[OpenVPN] <------------------------> [OpenVPN]
[HTTP] <-------------> [HTTP]
[TLS] <~~~~~> [TLS]
[TCP] <-> [TCP] <-----> [TCP] <-> [TCP]
[IP] <-> [IP] <-----> [IP] <-> [IP]
[] [] [] []
Serveur HTTPS PROXY stunnel Client