Делаем OpenVPN работающим,
когда его хотят сделать неработающим

18 октября 2023

Протокол OpenVPN хорошо известен как инструмент обхода блокировок сайтов, но плохо приспособлен к преодолению блокировок, которые нацелены против него самого.

Установка связи между клиентом и сервером (т.н. handshake) в этом протоколе имеет фиксированную сигнатуру, которая не защищена шифрованием, поэтому легко обнаруживается на ТСПУ и блокируется.

Шифрование передаваемых данных через TLS/SSL начинает использоваться позднее, когда сигнатура уже передана.

С учётом планируемого общероссийского запрета всех зарубежных VPN-сервисов имеет смысл заблаговременно оценить, какие инструменты помогут минимизировать нанесённый этим вне всякого сомнения гениальным нововведением урон.

Что нам советует официальная документация?

В документе https://community.openvpn.net/openvpn/wiki/TrafficObfuscation предлагаются два «решения»: встроенные статические ключи и работа поверх прокси-сервера (в качестве которого предложен obfsproxy из состава TorProject).

Совет про статические ключи является бесполезным, потому что (а) они начинают использоваться после handshake, да к тому же (б) конфликтуют с tls-auth, являясь его усечённой и устаревшей альтернативой.

Вариант с прокси превращает конфигурацию из типовой в нестандартную, т.е. (а) требующую специальной настройки на сервере и клиенте и (б) не всегда возможную на клиентских устройствах (особенно если речь идёт о мобильных телефонах и Windows). Но ниже мы рассмотрим и его.

Существует ли рабочее решение, встроенное непосредственно в OpenVPN?

Существует т.н. xor_patch, который не включён в основной проект из-за нежелания разработчиков. Его текущую поддержку взял на себя проект TunnelBlick, разрабатывающий для OpenVPN популярную графическую оболочку под MacOS.

Как история вопроса с цитатами и ссылками, так и параметры добавляемой патчем директивы "scramble" собраны на странице https://tunnelblick.net/cOpenvpn_xorpatch.html

Хотя общая идея xor_patch выглядит примитивно и антиакадемично (из-за чего её и отвергли в upstream), практическая польза от неё несомненна, потому что она позволяет добиться сокрытия протокольных сигнатур от массового автоматизированного анализа, т.е. вынужденно ограниченного в функциональности ради производительности.

Каков нынешний статус xor_patch?

  • для MacOS/X предлагается поддерживаемая и регулярно обновляемая сборка OpenVPN в составе TunnelBlick,
  • для Windows, Android и Docker существуют пользовательские сборки на https://github.com/lawtancool?tab=repositories&q=xor,
  • для устройств Apple с iOS поддержка отсутствует.

Можно ли избежать сигнатурной блокировки, не шифруя весь трафик OpenVPN через xor_patch или дополнительным ПО?

Можно, если перед запуском OpenVPN сгенерировать мусорный трафик, использующий те же IP-адреса и порты. ТСПУ не увидит в нём искомой сигнатуры и запомнит соединение как не подлежащее блокировке. Для генерации трафика годится утилита nping из состава nmap:

sudo nping --count 10 --udp --source-port 1194 --dest-port 1194 --data-length 1200 -v vpn.yandex.ru

После того, как она отработает, сразу запускаем OpenVPN в расчёте на то, что его трафик будет пропущен по проторенному пути без сигнатурной проверки:

sudo openvpn --server vpn.yandex.ru --proto udp --port 1194 ...

Если в исходных настройках клиента OpenVPN присутствует директива "nobind", её следует убрать, чтобы для установки соединения использовался фиксированный порт отправителя:

  • заданный директивой lport,
  • или (при отсутствии lport) директивой port,
  • или (при отсутствии port и lport) 1194, т.е. значение по умолчанию.

При запуске nping мы указываем его через "--source-port ..."

Коллективный опыт гласит, что количество передаваемых через "--count ..." пакетов должно подбираться экспериментально, в диапазоне от 1 до 310. Чем меньше — тем быстрее, чем больше — тем надёжнее. Замечено, что чем быстрее сеть, тем меньше пакетов требуется. Установлено, что в большинстве случаев хватает 10.

Инкапсуляция трафика OpenVPN дополнительными приложениями

Вместо установки и настройки obfsproxy мы решили проверить, как OpenVPN будет работать через аналогичный прокси, встроенный в OpenSSH:

  • в одной консоли запустили ssh с ключом "-D 1080"
  • в другой сначала проверили его работоспособность с помощью "curl -x socks5h://127.0.0.1:1080 -v showip.net"
  • и после успешной проверки запустили openvpn с ключом "--socks-proxy 127.0.0.1 1080".

Результат оказался плачевным — openvpn выдал ошибку:

recv_socks_reply: TCP port read failed on recv(): Operation now in progress (errno=115)

Ошибка обсуждается давно, но безрезультатно. Например, одно из обсуждений начато в 2013 году и продолжается до сих пор:

На этом наши изыскания приостановлены за ненадобностью до худших времён. В конце концов, когда мы хотим построить VPN поверх OpenSSH, то зачем нам для этого что-то ещё, кроме самого OpenSSH?

Поверхностный поиск в сети приносит улов из множества решений. Начнём с простых:

  • stunnel — очевидный кандидат №1, но со столь же очевидным недостатком — поддерживает только TCP и не умеет туннелировать UDP,
  • dtlspipe — "Like stunnel, but for UDP",
  • udp2raw — "A Tunnel which Turns UDP Traffic into Encrypted UDP/FakeTCP/ICMP Traffic by using Raw Socket",
  • shadowsocks с плагином v2ray-plugin — как альтернатива obfsproxy и "ssh -D"?

И закончим тяжеловесными:

  • Cloak — мультипротокольный L4 мультиплексор, "A censorship circumvention tool to evade detection by authoritarian state adversaries",
  • Trojan — "Proxy server, client and protocol, designed to bypass the Great Firewall of China by imitating HTTPS. Trojan claims to be unidentifiable",
  • проекты от OperatorFoundation.org — "Useable tools to help people around the world with censorship, security, and privacy".

Увы, но остаётся лишь гадать, как скоро они превратятся из любопытных игрушек в незаменимых помощников.

Что предлагают коммерческие VPN-провайдеры?

Вероятно, сочетание одного или нескольких решений, перечисленных выше. Например, StrongVPN и IPVanish имеют опцию под названием "Scramble", а UTunnel и CactusVPN называют её "Obfuscation", причём CactusVPN прямо поясняет, что речь идёт про obfsproxy.

Безусловный плюс — клиентские дистрибутивы с поддержкой этих опций опубликованы в магазинах мобильных приложений, поэтому от пользователя данных сервисов не требуется настраивать для включения защиты ничего, кроме клика по галке в личном кабинете.

Безусловный минус — вряд ли от указанного плюса есть польза для тех, кто не является их клиентом и\или хочет иметь OpenVPN на собственном сервере, т.к. каждое приложение наверняка умеет подключаться только к серверам того сервиса, которым выпущено.

Что почитать, чтобы быть в курсе?

Поскольку ввод новых ограничений носит поступательный характер, требуется регулярно проверять, что накопленные инструменты и приёмы не утратили актуальность. То, что успешно работало вчера, может оказаться бесполезным сегодня.

Наиболее известным русскоязычным специалистом в почётном деле технического противостояния интернет-цензуре является уважаемый ValdikSS. Готовы рекомендовать всё, что он публикует по данной тематике.

Основным местом для дискуссий является управляемый им форум ntc.party.

В настоящий момент приведённого минимума вполне достаточно для результативного погружения в тему.



← Назад в Блог

Подпишитесь на новые статьи: