cloak
June 11, 2024

Установка и настройка Cloak Standalone Server для обфускации трафика

1. Установка Cloak Standalone Server

1.1 Используемая документация

1.2 Дополнительное ПО

Для проверки корректности файлов JSON нам понадобится утилита jq. Установить ее можно из репозиториев или напрямую из git:

_URL="https://github.com/jqlang/jq/releases/download/jq-1.7.1/jq-linux-amd64"
_APP="/usr/bin/jq"

wget -q -O ${_APP} ${_URL}
chmod a+x ${_APP}
chown 0:0 ${_APP}

unset _URL _APP

Проверку можно выполнить командой:

jq '.' <path_to_file>

1.3 Установка cloak-server

Настроим переменные для процесса установки:

_URL="https://github.com/cbeuw/Cloak/releases/download/v2.9.0/ck-server-linux-amd64-v2.9.0"
_APP="/usr/bin/cloak-server"
_CFG="/etc/cloak/server.json"
_CFGSHADOWSOCKS="/etc/cloak/cloak-client-shadowsocks-direct.json"
_CFGSQUID="/etc/cloak/cloak-client-squid-direct.json"
_SVC="/etc/systemd/system/cloak-server.service"

Загружаем и устанавливаем cloak-server из git:

wget -q -O ${_APP} ${_URL}
chmod a+x ${_APP}
chown 0:0 ${_APP}

Для конфига нам понадобятся ключевая пара (открытый и закрытый ключ) и как минимум один UID пользователя. Сгенерировать ключевую пару можно командой

cloak-server -k

или

cloak-server -key

-k Генерация пары публичного и приватного ключа и вывод в консоль в формате <public key>,<private key>
-key Генерация ключевой пары в виде двух строк с публичным и приватным ключом

Публичная часть ключа нам понадобится для конфигурации клиента, приватная часть остается на сервере и ни кому не передается.

_KEYS=$(${_APP} -k)
_PUBKEY=$(echo ${_KEYS} | cut -d, -f1)
_PRIVKEY=$(echo ${_KEYS} | cut -d, -f2)

_UID=$(${_APP} -u)

Сохраним ключевую пару:

cat >~root/cloak-keys.txt <<HEREDOC
Your PUBLIC key is:                   ${_PUBKEY}
Your PRIVATE key is (keep it secret): ${_PRIVKEY}
HEREDOC

Создадим конфиг для нашего сервиса:

mkdir -p $(dirname ${_CFG})

cat >${_CFG} <<HEREDOC
{
  "ProxyBook": {
    "shadowsocks": [
      "tcp",
      "127.0.0.1:8388"
    ],
    "squid": [
      "tcp",
      "127.0.0.1:3128"
    ]
  },
  "BindAddr": [
    ":443"
  ],
  "BypassUID": [
    "${_UID}"
  ],
  "RedirAddr": "mail.google.com",
  "PrivateKey": "${_PRIVKEY}"
}
HEREDOC

Так в конфиге сервера, в секции ProxyBook у нас два варианта подключения для клиентов:

  • shadowsocks
  • squid

Предполагается что сервисы, на которые будет выполняться перенаправление из туннеля, размещены локально и прослушивают порты 8388 и 3128 соответственно.

Конфигурации для клиентов будут выглядеть следующим образом:

cat >${_CFGSHADOWSOCKS} <<HEREDOC
{
  "Transport": "direct",
  "ProxyMethod": "shadowsocks",
  "EncryptionMethod": "plain",
  "UID": "${_UID}",
  "PublicKey": "${_PUBKEY}",
  "ServerName": "mail.google.com",
  "NumConn": 4,
  "BrowserSig": "chrome",
  "StreamTimeout": 300
}
HEREDOC
cat >${_CFGSQUID} <<HEREDOC
{
  "Transport": "direct",
  "ProxyMethod": "squid",
  "EncryptionMethod": "aes-256-gcm",
  "UID": "${_UID}",
  "PublicKey": "${_PUBKEY}",
  "ServerName": "mail.google.com",
  "NumConn": 4,
  "BrowserSig": "chrome",
  "StreamTimeout": 300
}
HEREDOC

Проверим все конфигурации на наличие ошибок:

jq '.' ${_CFG}
jq '.' ${_CFGSHADOWSOCKS}
jq '.' ${_CFGSQUID}

Установим и запустим службу:

cat >${_SVC} <<HEREDOC
[Unit]
Description=Cloak Server
Documentation=https://github.com/cbeuw/Cloak/wiki
After=network-online.target

[Service]
Type=simple
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
ExecStart=${_APP} -c ${_CFG}
Restart=always

[Install]
WantedBy=multi-user.target
HEREDOC

systemctl daemon-reload

systemctl enable --now $(basename ${_SVC})

systemctl status $(basename ${_SVC})

Удалим переменные, которые создавали для процесса установки:

unset _URL _APP _CFG _CFGSHADOWSOCKS _CFGSQUID_SVC _KEYS _PUBKEY _PRIVKEY _UID

2. Установка Cloak Standalone Client

2.1 Установка cloak-client

Настроим переменные для процесса установки cloak-client:

_URL="https://github.com/cbeuw/Cloak/releases/download/v2.9.0/ck-client-linux-amd64-v2.9.0"
_APP="/usr/bin/cloak-client"
_CFGSHADOWSOCKS="/etc/cloak/cloak-client-shadowsocks-direct.json"
_CFGSQUID="/etc/cloak/cloak-client-squid-direct.json"
_SVC="/etc/systemd/system/cloak-client@.service"

Загружаем и устанавливаем cloak-client из git:

wget -q -O ${_APP} ${_URL}
chmod a+x ${_APP}
chown 0:0 ${_APP}

Конфигурация у нас есть на сервере, просто скопируем файл на клиентский комп.

mkdir -p /etc/cloak/
cat >${_CFGSHADOWSOCKS} <<HEREDOC
{
  "Transport": "direct",
  "ProxyMethod": "shadowsocks",
  "EncryptionMethod": "plain",
  "UID": "zA2FSjulYdZO/tf5xZSbjQ==",
  "PublicKey": "wHpXaRMi87TYMZUsavLclgRf/lENV2jt4mJ2SJkCk1w=",
  "ServerName": "mail.google.com",
  "NumConn": 4,
  "BrowserSig": "chrome",
  "StreamTimeout": 300
}
HEREDOC
cat >${_CFGSQUID} <<HEREDOC
{
  "Transport": "direct",
  "ProxyMethod": "squid",
  "EncryptionMethod": "aes-256-gcm",
  "UID": "zA2FSjulYdZO/tf5xZSbjQ==",
  "PublicKey": "wHpXaRMi87TYMZUsavLclgRf/lENV2jt4mJ2SJkCk1w=",
  "ServerName": "mail.google.com",
  "NumConn": 4,
  "BrowserSig": "chrome",
  "StreamTimeout": 300
}
HEREDOC

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

Шаблоны службы в systemd имеют вид servicename@.service

Так же, помимо конфига для нашей службы, понадобится файл с переменными окружения службы. Так как службы у нас будет две, первая туннелирует shadowsocks, вторая squid, то и файлов конфигураций с переменными окружения тоже будет два.

cat >/etc/default/cloak-client-shadowsocks-direct <<HEREDOC
LISTENIP=127.0.0.1
LISTENPORT=8388
REMOTESERVER="shadowsocks.example.com"
REMOTEPORT=443
HEREDOC
cat >/etc/default/cloak-client-squid-direct <<HEREDOC
LISTENIP=127.0.0.1
LISTENPORT=3128
REMOTESERVER="shadowsocks.example.com"
REMOTEPORT=443
HEREDOC

Создадим конфиг службы и перезапустим systemd:

cat >${_SVC} <<HEREDOC
[Unit]
Description=Cloak Client %i
Documentation=https://github.com/cbeuw/Cloak
After=network-online.target

[Service]
Type=simple
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
EnvironmentFile=/etc/default/%p-%i
ExecStart=${_APP} -c /etc/cloak/%p-%i.json -i \${LISTENIP} -l \${LISTENPORT} -s \${REMOTESERVER} -p \${REMOTEPORT}
Restart=always

[Install]
WantedBy=multi-user.target
HEREDOC

systemctl daemon-reload

Включим автозапуск служб при старте системы и запустим их:

systemctl enable --now cloak-client@shadowsocks-direct
systemctl enable --now cloak-client@squid-direct

Проверяем что все работает:

systemctl status cloak-client@shadowsocks-direct
systemctl status cloak-client@squid-direct

Удаляем наши переменные:

unset _URL _APP _CFGSHADOWSOCKS _CFGSQUID _SVC

Так как служба клиента запускается из шаблона, имеет смысл пояснить зависимости между параметрами в конфигурации службы и именами файлов с переменными окружения и конфигураций cloak-client.

Значимые параметры конфигурации службы:

EnvironmentFile=/etc/default/%p-%i

/etc/default - каталог в котором служба будет выполнять поиск файла с переменными окружения для запуска службы %p - имя файла шаблона службы без @.service, в нашем примере это cloak-client
%i - параметр передаваемый после @ в имени шаблона службы

ExecStart=${_APP} -c /etc/cloak/%p-%i.json -i \${LISTENIP} -l \${LISTENPORT} -s \${REMOTESERVER} -p \${REMOTEPORT}

-c /etc/cloak/%p-%i.json - путь до файла конфигурации клиента. Имя файла конфигурации формируется по аналогии с именем файла содержащим переменные окружения службы.

Если на удаленном сервере, где установлен cloak-server, уже настроена служба Squid, после запуска cloak-client можно пробовать подключиться к адресу 127.0.0.1 и порту 3128 для проверки работы HTTP прокси.

Для работы Shadowsocks в параметрах клиента shadowsocks необходимо указать адрес подключения 127.0.0.1 и порт 8388. После переконфигурирования клиента shadowsocks можно указать в браузере параметры SOCKS5 прокси сервера и проверить соединение.

Cloak не предоставляет инструменты проксирования, для этого используются shadowsocks или squid. Cloak предоставляет туннель весь трафик которого внешне выглядит как HTTPS, внутри же можно туннелировать любой TCP трафик.

2.2 Настройка работы cloak-client через реверс прокси или CDN

Помимо работы напрямую Клиент-Сервер, cloak умеет работать через облачных провайдеров, например Cloud Flare, или reverse proxy. Подробно разбирать настройку CF не будем, рассмотрим настройку reverse proxy на базе nginx.

Настройка серверной части не изменится. В конфигурации клиента изменится параметр "Transport": "direct" на "Transport": "CDN" и добавится новый параметр "CDNWsUrlPath": "/cloak-ws-shadowsocks". Итоговые конфигурации клиентов работающих через CDN будут выглядеть следующим образом:

{
  "Transport": "CDN",
  "CDNWsUrlPath": "/cloak-ws-shadowsocks",
  "ProxyMethod": "shadowsocks",
  "EncryptionMethod": "plain",
  "UID": "zA2FSjulYdZO/tf5xZSbjQ==",
  "PublicKey": "wHpXaRMi87TYMZUsavLclgRf/lENV2jt4mJ2SJkCk1w=",
  "ServerName": "mail.google.com",
  "NumConn": 4,
  "BrowserSig": "chrome",
  "StreamTimeout": 300
}
{
  "Transport": "CDN",
  "CDNWsUrlPath": "/cloak-ws-squid",
  "ProxyMethod": "squid",
  "EncryptionMethod": "aes-256-gcm",
  "UID": "zA2FSjulYdZO/tf5xZSbjQ==",
  "PublicKey": "wHpXaRMi87TYMZUsavLclgRf/lENV2jt4mJ2SJkCk1w=",
  "ServerName": "mail.google.com",
  "NumConn": 4,
  "BrowserSig": "chrome",
  "StreamTimeout": 300
}

Теперь к настройке проксирования websockets в nginx. Подробная документация по проксированию websockets: https://nginx.org/ru/docs/http/websocket.html

cat >/etc/nginx/conf.d/01_upstream.conf <<HEREDOC
upstream cloak-server {
    server 127.0.0.1:44300;
}
HEREDOC
cat >/etc/nginx/conf.d/02_map.conf <<HEREDOC
map \$http_upgrade \$connection_upgrade {
    default upgrade;
    ''      close;
}
HEREDOC
server {

    listen 443 ssl;
    
    ...
    
    location /cloak-ws-shadowsocks {

        proxy_pass http://cloak-server;

        proxy_http_version 1.1;
        proxy_set_header Upgrade    \$http_upgrade;
        proxy_set_header Connection \$connection_upgrade;
    }

    location /cloak-ws-squid {

        proxy_pass http://cloak-server;

        proxy_http_version 1.1;
        proxy_set_header Upgrade    \$http_upgrade;
        proxy_set_header Connection \$connection_upgrade;
    }
    
    ...

}

Если cloak-server размещается на том же сервере где запушен nginx, придется изменить порт cloak-server на другой, например 44300. В файле 01_upstream.conf это видно. В то же время с реверса нам ни что не мешает маршрутизировать трафик на любой другой сервер сети где размещена служба cloak-server, тогда менять порт для cloak-server нет необходимости. Важно в параметре proxy_pass указывать протокол http потому как https схема не поддерживается в cloak-server на сервере назначения.

USDT/TRC20: TW4ZRcrb4qBRb9uSNiu9wJCWveCp4rLoGL