OpenVPN через TLS
Ваш VPN использует TCP в качестве транспортного протокола. Экземпляр stunnel используется для инкапсуляции содержимого потока TCP в TLS / TCP. Вы получаете этот стек протоколов:
[IP] <------------------------> [IP]
[OpenVPN] <------------------------> [OpenVPN]
[TLS] <~~~~~> [TLS]
[TCP] <-> [TCP] <-----> [TCP] <-> [TCP]
[IP] <-> [IP] <-----> [IP] <-> [IP]
[] [] [] []
Сервер Stunnel Stunnel Клиент
Между экземплярами Stunnel у вас есть стек протоколов на проводе:
[IP]
[OpenVPN]
[TLS]
[TCP (443)]
[IP]
[...]
Поскольку TLS шифрует свою полезную нагрузку, злоумышленник может видеть только:
[??? ]
[TLS]
[TCP (443)]
[IP]
[...]
Так что да, это обычный трафик TLS (это может быть HTTP / TLS, SMTP / TLS, POP / TLS или что-то еще для того, кто смотрит на трафик, но он очень похож на HTTP / TLS, когда используется TCP-порт 443). Вы можете проверить это с помощью wireshark: запишите трафик между экземплярами Stunnel. В пользовательском интерфейсе wireshark (правая кнопка на пакете потока) вы можете попросить wireshark интерпретировать трафик как TLS: он распознает его как трафик TLS (вы увидите разные сообщения TLS, но не полезную нагрузку сеанса TLS) ,
Возможно, вы захотите использовать SNI в клиенте, чтобы выглядеть так, как поступил бы современный браузер. Возможно, вы захотите использовать ALPN, но в настоящее время stunnel не справляется с этим.
OpenVPN со встроенным TLS
Для сравнения, если вы используете OpenVPN, у вас будет что-то вроде этого:
[IP]
[OpenVPN]
[TCP]
[IP]
[...]
Который выглядит так:
[??? ]
[OpenVPN]
[TCP]
[IP]
[...]
Встроенный уровень TLS не инкапсулирует пакеты (IP, Ethernet), а используется только для настройки сеанса и аутентификации:
[TLS]
[OpenVPN]
[TCP]
[IP]
[...]
В этом случае ваш трафик не выглядит как обычный трафик TLS, но, очевидно, является OpenVPN. Если вы интерпретируете этот трафик как OpenVPN в Wireshark, вы узнаете сообщения OpenVPN и внутри них сообщения TLS (но не полезную нагрузку).
Предупреждение
Вы должны знать, что если пассивный злоумышленник не сможет сказать, что ваш удаленный сервер на самом деле является сервером OpenVPN, активный злоумышленник сможет это выяснить: просто подключившись к вашему серверу по TLS, он сможет чтобы подтвердить, что это не сервер HTTP / TLS. Пытаясь говорить по протоколу OpenVPN, он сможет обнаружить, что ваш сервер является сервером OpenVPN / TLS.
OpenVPN через TLS с аутентификацией клиента
Если вас это беспокоит, вы можете включить проверку подлинности клиента TLS: злоумышленник не сможет инициировать рабочий сеанс TLS и не сможет угадать, какая полезная нагрузка инкапсулирована в TLS.
* Предупреждение: ** Я не говорю о встроенной поддержке TLS в OpenVPN (см. Выше объяснение того, почему это не поможет).
Мультиплексированный OpenVPN / TLS и HTTP / TLS
Другое решение состоит в том, чтобы обслуживать HTTP и OpenVPN через сеанс TLS. sslh может использоваться для автоматического определения полезной нагрузки протокола и отправки на обычный сервер 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
OpenVPN через HTTP CONNECT через TLS
Другое решение состоит в том, чтобы использовать стандартный сервер HTTP / TLS и использовать HTTP CONNECT / TLS для подключения к серверу OpenVPN: он будет выглядеть как стандартный сервер HTTP. Вы даже можете потребовать аутентификацию клиента, чтобы авторизовать HTTP-запрос CONNECT (squid должен это сделать).
OpenVPN имеет возможность использовать HTTP-прокси:
http-proxy proxy.example.com
Вы должны быть в состоянии объединить это с экземпляром Stunnel, подключающимся к удаленному HTTPS PROXY:
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 PROXY stunnel Клиент