По традиции, нейрокартинка для отвлечения внимания
По традиции, нейрокартинка для отвлечения внимания

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

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

Кроме того, что этот протокол еще более устойчив к выявлению, приятным фактом будет и то, что настройка сервера XRay для XTLS-Reality гораздо проще, чем описанные ранее варианты - после предыдущих статей я получил довольно много комментариев типа "А что так сложно, нужен домен, нужны сертификаты, и куча всего" - теперь все будет гораздо проще.

XTLS-Reality

Коротко про XTLS-Reality. Это самое новое изобретение от авторов XRay. Про XRay (и его прородителя V2Ray, он же V2Fly) я рассказывал в предыдущей статье. XTLS-Reality поддерживается в последних релизах XRay, Sing-box и многих клиентах.

Он предназначен для защиты от выявления методом active probing. В отличие от старых протоколов (Shadowsocks, VMess, VLESS, и транспорта XTLS-Vision), определение “свой/чужой” здесь происходит еще на этапе TLS-хендшейка в момент чтения ClientHello. Если клиент опознан как “свой”, сервер работает как прокси, а если нет - вжух! - и TLS подключение передается на какой-нибудь другой абсолютно реальный хост с TLS (например, google.com или gosuslugi.ru), и таким образом клиент (или цензор, желающий методом active probing проверить, а что же прячется на том конце) получит настоящий TLS-сертификат от google.com или gosuslugi.ru и настоящие данные с этого сервера. Полное соответствие. Механизм определения "свой/чужой" во многом схож с механизмом работы Cloak, и позволяет достоверно определить подлинность клиента, но вместе с тем не вызывает подозрения у цензоров и устойчив к replay-атакам - со стороны систем анализа трафика это выглядит как подключение к настоящему популярному сайту, сервер отдает настоящий TLS-сертификат этого сайта, и вообще все (включая TLS fingerprint сервера) выглядит до предела аутентично и не вызывает подозрений. Бонусом еще XTLS-Reality обычно используется в паре с XTLS-Vision, то есть мы имеем очень достоверно выглядящие паттерны трафика из-за отсуствия двойного шифрования TLS-in-TLS (и заодно еще очень высокую производительность, у меня между хостами в Москве и в центральной Европе XRay легко выдает >100 мегабит).

Единственный минус подобного решения - в отличие от более старых протоколов (VLESS без XTLS) нет возможности работать через websocket-транспорт, и, соответственно, через CDN типа Cloudflare.

Установка сервера XRay

А теперь настало время все это настроить. Дано: VPS на Linux (Debian или Ubuntu, на других дистрибутивах плюс-минус то же самое) с IPv4 или IPv6-адресом.

Установку XRay и уже описывал в предыдущей статье, поэтому здесь буду краток.

Можно установить XRay руками:

wget https://github.com/XTLS/Xray-core/releases/download/v1.8.1/Xray-linux-64.zip
mkdir /opt/xray
unzip ./Xray-linux-64.zip -d /opt/xray
chmod +x /opt/xray/xray
nano /usr/lib/systemd/system/xray.service
systemctl enable xray
xray.service
[Unit]
Description=Xray Service
Documentation=https://github.com/xtls
After=network.target nss-lookup.target

[Service]
User=nobody
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
NoNewPrivileges=true
ExecStart=/opt/xray/xray run -config /opt/xray/config.json
Restart=on-failure
RestartPreventExitStatus=23
LimitNPROC=10000
LimitNOFILE=1000000

[Install]
WantedBy=multi-user.target

А можно установить скриптом от разработчиков (почему-то по умолчанию он ставит старую версию 1.7.5, которая не поддерживает Reality, поэтому нужно явно указать более свежую):

bash -c "$(curl -L https://raw.githubusercontent.com/XTLS/Xray-install/046d9aa2432b3a6241d73c3684ef4e512974b594/install-release.sh)" @ install --version 1.8.1 

Скрипт установит XRay и создаст для него systemd-юнит.

Настройка сервера XRay

Для настройки нам понадобится ряд параметров. Часть из них нам может сгенерировать сам XRay:

/usr/local/bin/xray uuid # /opt/xray/xray если устанавливали вручную
/usr/local/bin/xray x25519 # /opt/xray/xray если устанавливали вручную

На выходе вы получите UUID (идентификатор пользователя для протокола аутентификации VLESS), а также приватный и публичный ключи - запишите их, они вам понадобятся.

Еще один параметр, который нужен - short ID, он представляет собой просто шестнадцатиричное число (символы 0-9, a-g) длиной до 8 байт (16 символов) - можно набрать любую абракадабру типа "aabbccdd" или запустить openssl rand -hex 8

А вот дальше начинается самое интересное. Нам нужно найти сайт, под который мы будем маскироваться.

Требования довольно простые:

это должен быть иностранный сервер (вне РФ), не забаненный по домену Роскомнадзором, поддерживающий подключения по TLSv1.3 и HTTP/2, имеющий заглавную страницу, которая не переадресовывает на какой-нибудь другой домен. Если совсем упарываться, то неплохо было бы если бы IP-адрес был из диапазона того же облачного хостера, что и у вас, и чтобы сервер поддерживал Online Certificate Status Protocol (OCSP). Если вы не знаете, что вся эта фигня значит - не заморачивайтесь, выбирайте что-нибудь простое, например

  • www.microsoft.com:443

  • dl.google.com:443

  • www.samsung.com:443

  • www.googletagmanager.com:443

  • www.asus.com:443

  • www.amd.com:443

  • www.cisco.com:443

  • www.linksys.com:443

  • www.nvidia.com:443

    и т.д.

Сервер выбрали, настало время редактировать конфиг. Если вы ставили XRay вручную то он будет лежать в /opt/xray/config.json, если скриптом - то в /usr/local/etc/xray/config.json.

Приводим его к следующему виду:

{
  "log": {
    "loglevel": "info"
  },
  "routing": {
    "rules": [],
    "domainStrategy": "AsIs"
  },
  "inbounds": [
    {
      "port": 23,
      "tag": "ss",
      "protocol": "shadowsocks",
      "settings": {
        "method": "2022-blake3-aes-128-gcm",
        "password": "aaaaaaaaaaaaaaaabbbbbbbbbbbbbbbb",
        "network": "tcp,udp"
      }
    },
    {
      "port": 443,
      "protocol": "vless",
      "tag": "vless_tls",
      "settings": {
        "clients": [
          {
            "id": "4c3fe585-ac09-41df-b284-70d3fbe18884",
            "email": "user1@myserver",
            "flow": "xtls-rprx-vision"
          }
        ],
        "decryption": "none"
      },
      "streamSettings": {
        "network": "tcp",
        "security": "reality",
		"realitySettings": {
			"show": false,
			"dest": "www.microsoft.com:443",
			"xver": 0,
			"serverNames": [
				"www.microsoft.com"
			],
			"privateKey": "GOTPj_klK7_j_IvjxiCtyBL80RYotYSOdBBBSfFOMH4",
			"minClientVer": "",
			"maxClientVer": "",
			"maxTimeDiff": 0,
			"shortIds": [
				"aabbccdd"
			]
		}
      },
      "sniffing": {
        "enabled": true,
        "destOverride": [
          "http",
          "tls"
        ]
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "freedom",
      "tag": "direct"
    },
    {
      "protocol": "blackhole",
      "tag": "block"
    }
  ]
}

На что обратить внимание: в "serverNames" указан домен, под сервер которого вы маскируетесь (в данном случае www.microsoft.com), "id" в секции "clients" - это тот самый UUID, что мы сгенерировали выше. "privateKey" и первый элемент в массиве "shortIds" - это приватный ключ и short ID, что мы тоже сгенерировали выше. Публичный ключ не теряйте, он будет нужен на клиенте.

В этом конфиге так же на 23 порту настроен Shadowsocks-2022, на всякий случай, вдруг пригодится. Если не надо, или хочется полной маскировки - можно удалить этот элемент из "inbounds".

Перезапускаем еще раз xray:

$ systemctl restart xray

Проверяем что все нормально запустилось:

$ journalctl -u xray

Например, XRay может ругнуться что не удается распарсить JSON-файл, обычно это связано с лишними запятыми в конце {} блока, в этом случае он укажет, на какой строке ошибка. Исправляем ошибки, перезапускаем еще раз, и переходим к настройке клиентов.

Настройка клиентов

Сначала Nekobox на десктопе (Windows, Linux).

Если вы раньше им не пользовались, нужно переключить его на использование движка sing-box, Preferences -> Basic Settings -> Core:

Идем в Server -> New profile и заполняем все вот так:

Address - IP-адрес вашего сервера, UUID - соответственно, UUID, SNI должен соответствовать домену, под который вы маскируетесь (один из списка "serverNames" из конфига сервера), uTLS - я выбираю Chrome (это маскировка клиента под обычный браузер), Reality Pbk - публичный ключ (не приватный, а второй, публичный), Reality Sid - shortId из конфига выше.

Сохраняем, кликаем правой кнопкой мыши на новый сервер в списке, жмем Start, и проверяем подключение выбрав там же Current Select -> URL test.

Если все нормально, то галочками "VPN Mode" или "System proxy" можно завернуть трафик всех приложений на прокси.

Настройка v2rayN под Windows аналогична, набор параметров тот же, вот скриншот (не мой, из гугла):

Автор Nekobox перестал собирать версии под macOS, поэтому я рекомендую использовать Wings X. Настройки точно такие же.

Если вдруг вам нравятся Clash-based клиенты (например, Clash Verge под Windows, Linux, MacOS или для мобильных устройств), то нужно использовать ядро Clash.Meta и специальны конфиг для Clash. В случае с Clash Verge можно сделать так:

  1. Settings -> Clash Core -> Выбрать Meta

  2. Сохранить конфиг в какой-нибудь локальный файл:

clash-reality.yml
mode: global
mixed-port: 7890
allow-lan: false
log-level: info
ipv6: true
secret: ''
external-controller: 127.0.0.1:9090
proxies:
- name: vless-reality-vision
  type: vless
  server: xxx.xx.xx.xx # ваш IP
  port: 443
  uuid: 4c3fe585-ac09-41df-b284-70d3fbe18884 # ваш UUID
  network: tcp
  tls: true
  udp: true
  flow: xtls-rprx-vision
  servername: www.microsoft.com # ваш фейковый домен
  reality-opts:
    public-key: kbITklNKTdfvB6e3xy97pTV7gjl3Z3irv246oRZ5Gnk # public key
    short-id: aabbccdd # short ID
  client-fingerprint: chrome

  1. Profiles -> New - Type : Local -> выбрать ваш файл и кликнуть по нему в окне Clash

  2. Proxies -> выбрать ваш новый прокси на вкладке Global -> кликнуть по полю справа чтобы протестировать подключение, должно появиться значение пинга

  3. Settings -> System proxy: вкл - после этого трафик всей системы пойдет через прокси. Можно использовать и TUN, но для этого надо запускать Clash Verge от рута.

Далее, мобильные клиенты. Вариант раз: в Nekobox или в v2ray кликнуть правой кнопкой мыши на ваш сервер из списка, выбрать Share -> QR code или Link, и получить ссылку или QR-код, которые потом можно отсканировать/вставить в мобильные клиенты. Либо вбить все те же данные руками, вот как это выглядит в андроидовском v2rayNG (версия из Google Play еще не обновилась и не умеет работать с Reality, скачиваем APK с Гитхаба):

скриншоты

Под iOS я рекомендую использовать Shadowrocket (3$) или Wings X (он бесплатный). Настройки подключения полностью аналогичны описанному выше.

Советы бывалых

  1. Очень рекомендуется настраивать на клиентах правила маршрутизации (пример в комментариях), чтобы трафик до .ru-доменов и хостов с российскими IP шел напрямую, а не через прокси (в клиентах для такого поставляется GeoIP база данных).

  2. Обязательно используйте uTLS на клиентах, выставляя правильный TLS fingerprint (например, Chrome).
    Если при использовании XTLS вы почему-то не можете подключиться, в логах сервера видна ошибка типа "failed to use xtls-rprx-vision, found outer tls version 771", попробуйте сменить версию uTLS. У меня, например, при выборе "android" клиент не подключается, а при выборе "chrome" все окей.

  3. Для увеличения производительности можно настроить на сервере Bottleneck Bandwidth и Round-trip propagation time (BBR) congestion control algorithm:
    echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
    echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
    sysctl -p

  4. Чтобы проверить, что маскировка работает как надо, добавьте IP-адрес вашего сервера и домен, под который вы маскируетесь, в hosts-файл (на Linux это /etc/hosts, на Windows это c:\windows\system32\drivers\etc\hosts), например, "38.25.63.10 www.microsoft.com", и после этого попробуйте зайти на этот адрес браузером - должна открыться настоящая страница этого домена с настоящим TLS-сертификатом:

    Другой вариант: использовать CURL.
    curl -v --resolve www.microsoft.com:443:151.101.65.69 https://www.microsoft.com 
    (вместо 151.101.xx.xx должен быть IP вашего сервера)

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


  1. MiraclePtr Автор
    26.04.2023 05:42
    +1

    GeoIP из Nekobox (да и других клиентов) знает российские диапазоны, а вот GeoSite - уже нет, ага.

    В итоге у меня работает вот такая настройка, GeoIP активируется стандартным образом в Nekobox:

    правила по суффиксам Nekobox не умеет, но их умеет sing-box в его основе, поэтому жмем "Custom" и прописываем

    вот такое
    {
        "rules": [
            {
                "domain_suffix": [
                    ".ru"
                ],
                "outbound": "direct"
            }
        ]
    }
    

    После этого весь трафик до .ru-доменов и российских IP-адресов будет идти напрямую.

    Если нужно заблокировать полностью - то в первом окне вместо Direct вставить в Block, а в JSON-коде исправить direct на block.


  1. maeris
    26.04.2023 05:42
    +4

    У вас там в curl ссылочка небезопасная. Нужна вот эта.


    1. MiraclePtr Автор
      26.04.2023 05:42
      +3

      Справедливо.

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

      Ссылку в статье поправил.


  1. Mayurifag
    26.04.2023 05:42
    +5

    Большое спасибо за статью!

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

    Мне в этом плане https://github.com/WeeJeWel/wg-easy нравится, — докер контейнер поднял, опционально лейблы для траефика прописал и всё — удобно создаёшь конфигурации в минималистичном WebUI в пару кликов. Благодаря докеру машина чистенькая, кучи команд не делаешь, всё работает сразу без головняка. Из UI cразу доступен QR код, чтобы быстро на мобильных устройствах настроить соединение или передать (родителям/жене/девушке).

    И вот мечтаю, чтобы подобное удобство было б доступно и для описываемых Вами в цикле статей bleeding-edge способов обходов блокировок. В идеальном мире ещё в контейнере (этом же или соседнем, в который DNS запросы бы ходили) можно резку рекламы + кеш днс. Надеюсь, комьюнити к этому ещё придёт, что простота установки и поддержки должна быть по возможности в приоритете.


    1. MiraclePtr Автор
      26.04.2023 05:42
      +2

      Для Xray и сотоварищей существует много разных user-friendly серверных морд с простой установкой.

      Есть Marzban, например - его тоже можно ставить через Docker, он включает в себя XRay, обещает красивый интерфейс для настройки и управления пользователями и даже встроенный Telegram-бот.

      Ещё есть Libertea, Hiddify (про него сказано что он умеет Reality), и разные форки X-UI, где обещают все то же самое.

      Не тестировать и сравнивать их у меня пока времени и терпения нет :)


  1. schebotar
    26.04.2023 05:42

    За Caddy такую конструкцию не спрятать?


    1. MiraclePtr Автор
      26.04.2023 05:42

      Такую - нет. Вариант с Caddy был описан в предыдущей статье, но здесь он не сработает - XTLS (оба, что Vision, что Reality) используют Заки на уровне TLS, и поэтому TLS-прдклбчение должно терминироваться именно в XRay, а не в Caddy.

      Единственное, для чего тут сработает Caddy (или какой-нибудь HAProxy) - если надо на одном сервере держать и прокси, и какой-нибудь веб-сайт, то модно разруливать клиентов по SNI, передавая входящие подключения с SNI веб-сайта на веб-сервер (тот же Caddy или Nginx), а все остальное (включая наш фейковый microsoft.com) на XRay. Но насколько такая конструкция демаскирует прокси - вопрос открытый :)


  1. molodoydushoy
    26.04.2023 05:42
    +1

    с точки зрения защиты от обнаружения пробниками - можете пяснить, обращаемся к вася_пупкин.ком и получаем сертифкат от гуггла - разве это не раскрывает систему?


    1. MiraclePtr Автор
      26.04.2023 05:42

      Неа. Присмотритесь внимательнее к настройкам клиентов, там есть поле SNI, и в нем указывается тот же фейковый домен популярного сайта (в примере - microsoft.com). То есть со стороны это выглядит как подключение к microsoft.com, цензоры хотят проверить, так ли это, подключаются к этому адресу с этим SNI сами - а там действительно сертификат и контент настоящего microsoft.com.

      Домен вася_пупкин.ком уже не нужен, он нигде не фигурирует


  1. AlexHighTower
    26.04.2023 05:42
    +1

    А клиент под MacOS подскажите?
    Указанный Nekobox не имеет поддержки мака (


    1. MiraclePtr Автор
      26.04.2023 05:42

      Имеет и работает, я им сам пользуюсь на маке - но последняя версия доступная под мак там 2.12, она не поддерживает Reality :(

      Wings X тоже имеет десктопную версию, но я ее не тестировал, можно попробовать.


      1. AlexHighTower
        26.04.2023 05:42

        Можете ткнуть носом?
        На гитхабе в релизах только под линух, и вин, в ридми macOS вычернут
        Wings X требует макось старше 13 и не хочет на старой моей системе запускаться (


        1. MiraclePtr Автор
          26.04.2023 05:42

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

          Автор пишет, что свежие версии под мак по-прежнему можно собрать руками.

          Ещё вариант - Clash.Verge, но там формат конфигурации совсем другой, надо адаптировать.


          1. AlexHighTower
            26.04.2023 05:42

            сделал конфиг как по ссылке выше, но не нравится ему, ругается
            2023-04-26 15:33:06 INFO — [clash]: FTL [Config] parse config failed error=proxy 0: unsupport proxy type: vless
            2023-04-26 15:33:06 INFO — clash core terminated


        1. MiraclePtr Автор
          26.04.2023 05:42

          Добавил пример конфига Clash Verge и краткое описание настройки.


  1. blind_oracle
    26.04.2023 05:42

    На будущее - интересно и полезно. Но зачем этим сейчас заниматься? Wireguard никто не блокирует и, возможно, не будет - может стоит решать проблемы по мере поступления?


    1. Aelliari
      26.04.2023 05:42
      +1

      Потом, если его заблокируют, заниматься этим будет сложнее.

      Я, например, в качестве личного использую IKEv2 поднятый скриптом… Но на всякий случай ведь можно поднять рядом и такой, «резервный» канал, мало ли что будет дальше, или куда придётся временно поехать, один раз я так обломался с wireguard

      P.S. Эх, хотелось бы целостную инструкцию по IKEv2+eap-tls+radius, ради статических ip внутри тоннеля… Но целостной так и не нашел


      1. blind_oracle
        26.04.2023 05:42

        Поработав в своё время с IPSEC (и на цисках и в юниксах - привет, StrongSwan) я бы от него держался нафиг подальше.

        Wireguard простой как тапок, быстрый и работает надёжно. А шансов на дыру в реализации гораздо меньше - код WG в десятки раз короче всей богодельни IPSEC.

        Плюс я не уверен что при блокировке IKE портов (500/4500) его вообще возможно куда-либо перевесить в стандартных клиентах, WG же пофиг через какой порт работать.

        Резервным можно держать какой-нибудь OpenVPN в Transparent TLS режиме, например.


    1. MiraclePtr Автор
      26.04.2023 05:42
      +1

      Начать блокировать могут в любой момент, ибо все технические возможности для этого есть, нужно только кнопочку нажать. Чем на больше шагов вперёд вы дальше цензоров, тем больше времени будет чтобы адаптироваться к новым проблемам (особенно когда настраиваете прокси не себе, а оставшимся в РФ слабо подкованным в технологиях друзьям и родственникам).


  1. Tyrkin
    26.04.2023 05:42

    1. Очень рекомендуется настраивать на клиентах правила маршрутизации, чтобы трафик до .ru-доменов и хостов с российскими IP шел напрямую, а не через прокси (в клиентах для такого поставляется GeoIP база данных).

    А где такую базу брать? В клиентах там все для Китая. По крайней мере я не нашел. Пробовал в nekobox в поля маршрутизации вставлять по всякому - не работает. По конкретному IP правила срабатывают. А домен .ru так и не смог заблокировать. А очень бы хотелось - я то могу и сам контролировать куда и как ходить - а вот с супругой будут проблемы. Ей бы надо как нить "железно" ограничить .ru )


    1. MiraclePtr Автор
      26.04.2023 05:42
      +1

      GeoIP из Nekobox (да и других клиентов) знает российские диапазоны, а вот GeoSite - уже нет, ага.

      В итоге у меня работает вот такая настройка, GeoIP активируется стандартным образом в Nekobox:

      правила по суффиксам Nekobox не умеет, но их умеет sing-box в его основе, поэтому жмем "Custom" и прописываем

      вот такое
      {
          "rules": [
              {
                  "domain_suffix": [
                      ".ru"
                  ],
                  "outbound": "direct"
              }
          ]
      }
      

      После этого весь трафик до .ru-доменов и российских IP-адресов будет идти напрямую.

      Если нужно заблокировать полностью - то в первом окне вместо Direct вставить в Block, а в JSON-коде исправить direct на block.


      1. Tyrkin
        26.04.2023 05:42

        Спасибо! (вечером попробую .. * извиняюсь - забыл упомянуть что я именно nekobox для win имел ввиду )).

        А вот такой вопрос про развитие технологии: я только на днях настроил сервер по Вашей предыдущей статье) .. Я так понимаю что можно просто переделать там конфиг и создать в клиенте новое подключение? А nginx "просто останется" ненужным? ( я не использую SS или WS ) . То есть все предыдущие варианты как бы обесценились? Или оставить vision как запасной вариант.. ? Хотя в чем там "запас"? - наверное смысла в предыдущих вариантах уже нет? Вот если я хочу иметь пару или тройку серверов на всякий случай - тогда на одном вот этот последний вариант с reality , на втором Naive уже есть (стОит на него надеяться?) а на третий? - сделать дубликат новой с reality или оставить как раз предыдущий с vision ? Что бы вы посоветовали?