Руководство будет включать:

  1. Предисловие

  2. Описание работы Cloak

  3. Настройку сервера Cloak

  4. Настройку клиента Cloak на OpenWRT

  5. Настройку клиента OpenVPN

1. Предисловие

В данной статье рассматривается способ установки и настройки прокси Cloak из репозитория автора проекта на Github. Уже несколько лет существует коробочное решение от Amnezia VPN c клиентами для Windows, Mac, Linux, Android и iOS (iOS поддерживает Cloak начиная с версии 3.08). Здесь мы рассмотрим установку чистого Cloak для существующего сервера OpenVPN (если такого сервера у вас нет, можно воспользоваться множеством решений в интернете, например этим) Способ описанный в статье является не самым лучшим и актуальным средством обхода блокировок, стоит обратить внимание на более свежие решения (Пользователь @MiraclePtrисчерпывающе описал существующие на данный момент способы).

Эта статья результат моего ознакомления с инструментом Cloak и рабочий гайд по настройке работы OpenVPN на OpenWRT через него.

2. Описание работы Cloak

Cloak — это подключаемый транспорт, который расширяет возможности традиционных прокси‑инструментов, таких как OpenVPN, для обхода сложной цензуры и дискриминации данных.

Cloak не является отдельной прокси‑программой. Скорее, он работает, маскируя прокси‑трафик под обычную деятельность по просмотру веб‑страниц. В отличие от традиционных инструментов, которые имеют очень заметные следы трафика и могут быть заблокированы простыми правилами фильтрации, очень сложно точно нацелиться на Cloak с небольшим количеством ложных срабатываний.

Cloak можно использовать в сочетании с любой прокси‑программой, которая туннелирует трафик через TCP или UDP, например Shadowsocks, OpenVPN и Tor. На одном хосте сервера может работать несколько прокси‑серверов, а сервер Cloak будет действовать как обратный прокси‑сервер, соединяя клиентов с желаемым прокси‑концом.

Cloak мультиплексирует трафик через несколько базовых TCP‑соединений, что уменьшает блокировку начала линии и устраняет накладные расходы на TCP‑квитирование. Это также делает структуру трафика более похожей на реальные веб‑сайты.

Cloak обеспечивает многопользовательскую поддержку, позволяя нескольким клиентам подключаться к прокси‑серверу через один и тот же порт (по умолчанию 443). Он также предоставляет функции управления трафиком, такие как кредит на использование и контроль пропускной способности. Это позволяет прокси‑серверу обслуживать нескольких пользователей, даже если базовое программное обеспечение прокси не было разработано для нескольких пользователей.

Cloak также поддерживает туннелирование через промежуточный сервер CDN, такой как Amazon Cloudfront.

Принцип работы Cloak заключается в том, что весь передаваемый через него трафик преобразуется в HTTPS‑трафик. Это была бы тривиальная задача, если бы Cloak просто туннелировал трафик через TCP‑порт 443 и добавлял заголовки TLS. Он способен обмануть простые классификаторы, подобные тому, который использует Wireshark, который ищет только фиксированные шаблоны байтов и магические числа; возможно, именно это и делают большинство коммерческих межсетевых экранов и интернет‑провайдеров в неавторитарных странах. Однако, поскольку известно, что для фильтрации используют сложные методы глубокой проверки пакетов в поисках «отпечатков пальцев» на протяжении всего сетевого сеанса, обойти эти меры — нетривиальная задача.

Ключевой особенностью Cloak является возможность серверу аутентифицировать входящее соединение в нулевом цикле, то есть сразу после получения первого пакета данных. В случае сбоя аутентификации сервер Cloak станет прозрачным мостом между входящим соединением и другим нецензурированным веб‑сайтом, так что любой неаутентифицированный человек не сможет идентифицировать сервер Cloak, просто наблюдая за его поведением.

Для этого сервер Cloak сначала генерирует статическую пару ключей Диффи‑Хеллмана с эллиптической кривой и распространяет открытый ключ потенциальным клиентам. Когда пользователь Cloak хочет подключиться, клиент Cloak должен сгенерировать еще одну эфемерную пару ключей ECDH. Предварительно распределенный статический открытый ключ и частная часть эфемерного ключа используются для создания общего секрета, с помощью которого секретный идентификатор клиента (UID), а также некоторая различная информация (например, временная метка предотвращения ответа) симметрично шифруются. Открытая часть эфемерного ключа и зашифрованный UID вместе отправляются на сервер в первом пакете (TLS ClientHello).

После получения первого пакета сервер Cloak сначала выполняет простую проверку его формата. Затем он вычисляет общий секрет на основе частной части предварительно сгенерированного ключа и открытой части эфемерного ключа, сгенерированной клиентом. С помощью этого общего секрета расшифровывается UID. Затем UID запрашивается в базе данных, чтобы проверить, авторизован ли он. Таким образом, личность инициатора соединения установлена.

Затем сервер генерирует сеансовый ключ и шифрует его с помощью схемы шифрования с аутентификацией, используя общий секрет, рассчитанный выше в качестве ключа. Этот зашифрованный сеансовый ключ затем отправляется клиенту. Поскольку шифрование аутентифицировано, клиент знает, что успешная расшифровка должна означать, что сервер владеет общим секретом. Поскольку общий секрет можно вычислить только с помощью статического закрытого ключа, сервер должен обладать статическим закрытым ключом. Это подтверждает идентичность сервера для клиента.

Теперь перейдём к настройке сервера.

3. Настройка сервера Cloak

Настройка сервера будет производится на примере Debian 11 (amd64)

Для начала нам нужно скачать исполняемый файл с сайта проекта на Github

wget https://github.com/cbeuw/Cloak/releases/download/v2.7.0/ck-server-linux-amd64-v2.7.0 -O ck-server

Делаем файл исполняемым:

chmod +x ck-server

Переносим файл в /usr/bin (требует прав root)

sudo mv ck-server /usr/bin/ck-server

Далее нам необходимо сгенерировать публичный и приватный ключи доступа Cloak

/usr/bin/ck-server -key

Получаем:

Your PUBLIC key is:                      dnc7/Tbif51pXZ6EcWwc2367rHAbzVOzlzJ4qyS1uC4=
Your PRIVATE key is (keep it secret):    ULn0VAREq6zgk3kVOUYTbauwhKOGK48nRDibL5wLans=

Сохраняем эти данные, они понадобятся чуть позже.

Далее нам необходимо сгенерировать UID Пользователя и Администратора

/usr/bin/ck-server -uid
/usr/bin/ck-server -uid

На выходе получаем два UID: Пользователя и Администратора

Your UID is: w2S8IMf/T4/TAC7MJZQlWw== #Пользователь USER_UID1
Your UID is: 9bNJTRNEaN3iwljIAT2U+Q== #Администратор ADMIN_UID

Сохраняем эти данные.

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

Так же необходимо уточнить параметры вашего сервера OpenVPN, например, так

sudo cat /etc/openvpn/server.conf

в примере это OpenVPN UDP и порт 51000.

Далее подготавливаем конфигурацию сервера /etc/cloak/ckserver.json

Создадим папку и файл следующего содержания

sudo mkdir /etc/cloak
sudo nano /etc/cloak/ckserver.json

/etc/cloak/ckserver.json:

{
  "ProxyBook": {
    "openvpn": [
      "udp",
      "127.0.0.1:51000"
    ]
  },
  "BindAddr": [
    ":443",
    ":80"
  ],
  "BypassUID": [
    "w2S8IMf/T4/TAC7MJZQlWw=="
  ],
  "RedirAddr": "dzen.ru",
  "PrivateKey": "ULn0VAREq6zgk3kVOUYTbauwhKOGK48nRDibL5wLans=",
  "AdminUID": "9bNJTRNEaN3iwljIAT2U+Q==",
  "DatabasePath": "userinfo.db"
}

Сюда вводим ваши полученные ранее значения.

В примере это:

"ProxyBook": "openvpn" - вводим "udp" и порт 51000

В "PrivateKey" ULn0VAREq6zgk3kVOUYTbauwhKOGK48nRDibL5wLans=

В "AdminUID" 9bNJTRNEaN3iwljIAT2U+Q==

В "BypassUID" w2S8IMf/T4/TAC7MJZQlWw== (при наличии нескольких пользователей каждый UID вводится в кавычках на отдельной строке, как в примере)

Сохраняем изменения.

Далее создаём службу systemd для автозапуска:

sudo nano /etc/systemd/system/cloak-server.service

/etc/systemd/system/cloak-server.service:

[Unit]
Description=cloak-server
After=network.target
StartLimitIntervalSec=0
[Service]
Type=simple
#Service variables
Environment=CONFIG="/etc/cloak/ckserver.json"
ExecStart=/usr/bin/ck-server -c "$CONFIG"
optional items below
Restart=always
[Install]
WantedBy=multi-user.target

Сохраняем изменения.

Перезагружаем список служб, активируем автозапуск и запускаем службу:

sudo systemctl daemon-reload
sudo systemctl enable cloak-server.service
sudo systemctl start cloak-server.service

Так же необходимо будет убедится что у вас открыты порты 80 и 443, в настройках UFW или вашего внешнего файрволла.

Так же необходимо внести изменения в конфигурацию вашего сервера OpenVPN

Убедитесь что в конфигурации /etc/openvpn/server.conf присутствуют следующие строки:

# So that OpenVPN is listening to ck-server
local 127.0.0.1
dev tun

local 127.0.0.1 означает что OpenVPN сервер теперь будет слушать только на локальном интерфейсе и все клиенты должны будут подключаться через Cloak.

dev tap не поддерживается Cloak.

Cloak поддерживает TCP (стабильно) и UDP (в статусе экспериментальной поддержки).

Перезагружаем сервер OpenVPN:

sudo /etc/init.d/openvpn restart

Переходим к настройке клиента.

4.Настройка клиента Cloak на OpenWRT

Рекомендуется роутер минимум с 128 МБ RAM и памятью более 16 Мб.

На примере OpenWRT 22.03.5

Необходимо скачать с Github файл клиента для архитектуры вашего роутера.

Определяем архитектуру:

cat /sys/devices/system/cpu/modalias | grep -r -E -o ".{0,4}type.{0,6}"

На выходе получаем ответ похожего вида (В моём случае TP-Link Archer C6U):

cpu:type:mips:

Далее ищем пакет для архитектуры MIPS - Release v2.7.0 · cbeuw/Cloak (github.com).

Так как в репозитории Github есть версии для Mips и mipsle рекомендую сверится с OpenWRT Table of Hardware Wiki для вашего устройства.

Для TP-Link Archer C6U - архитектура mipsle (он же mipsel)

Скачиваем по ссылке на роутер при помощи wget:

cd /tmp
wget https://github.com/cbeuw/Cloak/releases/download/v2.7.0/ck-client-linux-mipsle_softfloat-v2.7.0 -O ck-client

В моём случае подошла версия mipsle-softfloat, если на более позднем этапе установки выдаст ошибку "line 1: syntax error: unexpected "(" , то сверьтесь ещё раз с OpenWRT wiki и попробуйте версию mipsle.

Разрешаем запуск исполняемого файла:

chmod +x /tmp/ck-client

Проверяем работу программы:

./tmp/ckclient --help

Если выдаёт справку по командам то движемся дальше, если выдаёт ошибку "line 1: syntax error: unexpected "(" то возвращаемся к началу п.4.

Далее перенесём файл ck-client в /usr/bin (ПЗУ) (Файл займет около 9Мб)

mv /tmp/ck-client /usr/bin/ck-client

Далее подготавливаем конфигурацию клиента.

Создадим папку конфигурации

mkdir /etc/config/cloak

И сам файл

/etc/config/cloak/ckclient.json:

{
"Transport": "direct",
"ProxyMethod": "openvpn",
"EncryptionMethod": "aes-gcm",
"UID": "w2S8IMf/T4/TAC7MJZQlWw==",
"PublicKey": "dnc7/Tbif51pXZ6EcWwc2367rHAbzVOzlzJ4qyS1uC4=",
"ServerName": "dzen.ru",
"NumConn": 4,
"BrowserSig": "chrome",
"StreamTimeout": 300
}

в примере:

"UID" из "BypassUID" сервера - w2S8IMf/T4/TAC7MJZQlWw==

"PublicKey" - dnc7/Tbif51pXZ6EcWwc2367rHAbzVOzlzJ4qyS1uC4=

Сохраняем.

Далее создаём службу автозапуска Cloak:

/etc/init.d/cloak:

#!/bin/sh /etc/rc.common
USE_PROCD=1
starts after network starts
START=89 #Number in rc.d queue, before S90OpenVPN
stops before networking stops
STOP=90
PROG=/usr/bin/ck-client
HOST="0.0.0.0"
PORT="1984"
CONFIG="/etc/config/cloak/ckclient.json"
start_service() {
procd_open_instance
procd_set_param user root
#For OpenVPN UDP
procd_set_param command "HOST" -u -l "CONFIG"
#For OpenVPN TCP
#procd_set_param command "HOST" -l "CONFIG"
procd_set_param stdout 1
procd_set_param stderr 1
procd_set_param respawn ${respawn_threshold:-3600} ${respawn_timeout:-5} ${res
procd_close_instance
echo "Cloak is working!"
}
stop_service() {
service_stop $PROG
echo "Cloak has stopped!"
}
reload_service() {
stop
sleep 5s
echo "Cloak restarted!"
start
}

Вносим в HOST IP адрес вашего OpenVPN сервера.

PORT меняем по желанию, по умолчанию 1984 (это локальный порт роутера 127.0.0.1 к которому будет подключаться клиент OpenVPN).

В зависимости от настроек вашего сервера рас/закомментируем строки OpenVPN UDP и TCP.

Делаем файл исполняемым:

chmod +x /etc/init.d/cloak

Делаем автозапуск:

ln -s /etc/init.d/cloak /etc/rc.d/S89Cloak

Запускаем:

/etc/init.d/cloak start

Далее переходим к настройке клиента OpenVPN.

5. Настройка клиента OpenVPN

Вносим изменения в конфигурацию клиента OpenVPN, на примере LuCI.

Переходим в раздел VPN - OpenVPN:

Редактируем текущую конфигурацию:

Заменяем в строке remote адрес вашего OpenVPN сервера и порт на 127.0.0.1 1984 или иной порт, если вы изменили 1984 на своё значение.

Сохраняем изменения.

Далее переходим в раздел Сеть - Маршрутизация:

И добавляем новый маршрут через шлюз по умолчанию до своего VPN сервера.

В Target вводим IP адрес вашего VPN сервера (/32 подсеть из одного IP адреса).

В gateway ваш шлюз по умолчанию (можно посмотреть в настройках подключения к интернету).

Ваш Interface выбираете из выпадающего списка.

Сохраняем маршрут.

Далее возвращаемся в VPN - OpenVPN.

И перезагружаем подключение к серверу OpenVPN:

После чего проверяем работу OpenVPN.

Для Cloak существуют клиенты для Windows, Mac, Linux и Android. К сожалению настроить OpenVPN через Cloak на iOS на данный момент невозможно, но ShadowRocket поддерживает Shadowsocks over Cloak.

Комментарии (32)


  1. MAXH0
    04.09.2023 10:43
    +4

    Огромное Вам спасибо за ваш невероятно АКТУАЛЬНЫЙ труд...


    1. Andrevich Автор
      04.09.2023 10:43
      +1

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



  1. V1tol
    04.09.2023 10:43
    +1

    Файл займет около 9Мб

    Если прогнать через strip, то можно значительно уменьшить размер. По крайней мере версия для х86_64 худеет почти на 3 мегабайта.


    1. Andrevich Автор
      04.09.2023 10:43

      Спасибо за комментарий, интересный инструмент, как-то раньше не встречался


  1. uneasy
    04.09.2023 10:43
    +7

    Порт 1984, остроумно :)


    1. Andrevich Автор
      04.09.2023 10:43
      +4

      Да, так разработчик придумал :)


  1. XOR2048
    04.09.2023 10:43
    +2

    Уже несколько лет существует коробочное решение от Amnezia VPN c клиентами для Windows, Mac, Linux, Android и iOS (iOS не поддерживает Cloak).

    Немного не актуальная информация, так как поддержку Cloak (а именно OpenVPN over Cloak, который в том числе позволяет настроить связку SS + Cloak в родном клиенте SS и не только) давно ввели для iOS (с версии 3.0.7, если не ошибаюсь).


    1. Andrevich Автор
      04.09.2023 10:43
      +1

      Спасибо что обратили внимание, исправил


  1. MiraclePtr
    04.09.2023 10:43
    +3

    У меня есть стойкое подозрение, что автор XRay при разработке XTLS-Reality вдохновлялся именно Cloak, потому что принцип действия у них очень схожий - определение "свой-чужой" по самому первому пакету и в результате полная маскировка под чужой веб-сайт, вплоть до fingerprint'а сервера и реального TLS-сертификата.

    На сегодняшний день для тех, у кого есть уже настроенный OpenVPN-сервер и кто хочет его обезопасить от блокировок - это самое простое и надежное решение (ну либо shadowsocks-2022, ага).


    1. uneasy
      04.09.2023 10:43

      Подскажите, в shadowsocks-2022, как я понял, они исправили только производительность и безопасность, маскировка там та же, что и в оригинальном SS? То есть Cloak более перспективное решение, как и XTLS-Reality, но в отличие от последнего, попроще в настройке.


      1. MiraclePtr
        04.09.2023 10:43
        +2

        в shadowsocks-2022, как я понял, они исправили только производительность и безопасность, маскировка там та же, что и в оригинальном SS

        Наоборот, там именно улучшения по части шифрования и установления соединения, для защиты от выявления прокси с использованием различных багов первых версий.


        1. uneasy
          04.09.2023 10:43

          Супер, спасибо!


  1. zabanen2
    04.09.2023 10:43
    +4

    "save page as"


    1. ritorichesky_echpochmak
      04.09.2023 10:43
      +3

      FF -> Toggle Reader View -> "Print" as PDF


  1. wifage
    04.09.2023 10:43
    +3

    А хабр еще не завел себе зеркало в onion сети? Кажется самое время.


    1. raspberry-porridge
      04.09.2023 10:43

      Tor в России давно работает через пень-колоду.


      1. MiraclePtr
        04.09.2023 10:43
        +2

        с бриджами пока норм.


  1. Question_man
    04.09.2023 10:43
    +2

    Друзья, подскажите, cloak работает только с ovpn и другими протоколами из доки или можно произвольный протокол в него завернуть? Очень пригодилось бы заворачивание в него корпоративный впн.


    1. XOR2048
      04.09.2023 10:43

      Насколько я знаю можно завернуть OpenVPN, Shadowsocks, а также видел, что кто-то пытался и WireGuard в него заворачивать, но не знаю, успешно ли...


    1. MiraclePtr
      04.09.2023 10:43
      +3

      Можно завернуть все что угодно, что работает по TCP


      1. uneasy
        04.09.2023 10:43
        +1

        Вроде как UDP тоже добавили. "UDP support is experimental at the moment"

        Правда, так и не нашел успешных примеров заворачивания WG


  1. aborouhin
    04.09.2023 10:43

    Всем рассказам про неподвластные РКН протоколы недостаёт главного - тестов скорости.

    Вот в моём случае дано - OpenVPN от клиентов до российского сервера, Wireguard от российского до нероссийского. С последним вообще вопросов нет, заменю на что угодно по мере возникновения проблем, вопрос с первым. Обход блокировок там тоже есть, но как сугубо факультативная фича, основной смысл в доступе к внутренним ресурсам. А там, в т.ч., частное облако, куда иногда один сотрудник зальёт десяток-другой Гб, а у 5-10 других сотрудников они тут же начинают скачиваться... и неплохо бы, чтобы в синхронизированное состояние все они приходили через разумное время. В общем, вопрос скорости очень актуален.

    Пока что, три раза "тьфу", всё это никакими тренировками РКН не затронуто и работает. Но есть планы (по другим причинам) VPN немного переделать, и учитывая все риски, неплохо бы заодно подложить соломки, чтобы на случай ковровых блокировок VPN и за границу, и внутри России, сотрудники не пострадали.

    Так вот вопрос. Насколько тот же Cloak влияет на пропускную способность соединения? Зависит ли это от latency между клиентом и сервером? Можно, конечно, самому поднять тестовый сервер и проверить, но вдруг кто уже делал бенчмарки.


    1. MiraclePtr
      04.09.2023 10:43
      +2

      Всем рассказам про неподвластные РКН протоколы недостаёт главного - тестов скорости

      Да потому что там рассказывать нечего. У меня и OpenConnect и XRay выдавали честные 150 мегабит между хостами в Москве и Чехии (пинг около ~50мс). Я серьезно не понимаю, почему люди молятся на Wireguard, мол он очень быстрый, когда с другими протоколами все точно так же летает (если только у вас не какое-то адски медленное железо или совсем убитый канал). Главное BBR не забыть на сервере настроить, для Cloak и OpenVPN/TCP это тоже может хорошо помочь.


      1. vvdev
        04.09.2023 10:43
        +1

        Вообще, 150 Мбит это очень скромно, если не сказать прямо: неприемлимо мало.
        Сам пытался найти бенчмарки чтобы подобрать железо — нереально.


        1. MiraclePtr
          04.09.2023 10:43

          Ну тогда стоит с самого начала указывать требования, сколько надо, и расписывать, какие у вас такие диковинные юзкейсы, что вам 150 мегабит это неприемлемо мало.
          Серьезно, у меня есть доступ к мониторингу корпоративного VPN (несколько сотен пользователей) и своего частного VPN для друзей для обхода блокировок (десяток пользователей) - и там и там 99% клиентов не утилизируют канал более чем на 20-30 мегабит даже в пиках.


          1. aborouhin
            04.09.2023 10:43

            Спасибо за ответы. У меня такая ситуация, что пики совпадают по времени у клиентов в основном (я выше описал - частное файловое облако, очень много общих папок, в которые как один что-то выложил - сразу у всех начинает скачиваться), так что 150 Мбит/с на мои десяток пользователей - это, в целом, терпимо, но не особо радостно. Потестирую, подумаю над топологией VPN-сети, может продублирую VPN-сервер тупо через RR DNS, чтобы клиентов разнести.


      1. uneasy
        04.09.2023 10:43

        А можете поделиться ссылкой на какой-нибудь гайд по BBR?



  1. dper
    04.09.2023 10:43

    Есть VPS (вне России). ОС на нём - Ubuntu server 22.04.3 LTS. На WordPress (nginx) там крутится не сильно нагруженный сайт. (На порту 443.) Есть доменное имя (типа server.com).

    Туда же я присоседил сервер OpenVPN (на udp-порт). Клиентов у VPN-сервера... (одномоментно) штук до 10. Разумеется, в последнее время тот VPN стал попадать под ковровые блокировки РКН :((

    Удастся ли по этому мануалу 1) прикрыть VPN Cloak`ом так, чтобы 2) все не VPN-запросы направлять на свой же сайт?