Установка XRay на сервере Ubuntu или Debian

1 Подготовка

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

1.1 Домен

Можно купить платный и привязать его к IP-адресу сервера, то есть создать в регистраторе домена запись типа A с IP-адресом сервера и названием домена.

Можно создать бесплатный домен 3-го уровня на сервисе freemyip.com. Для этого вводим название домена и, если он доступен, сайт выдаст ссылку следующего вида: https://freemyip.com/update?token=токен&domain=название-домена Для привязки созданного домена к IP нашего сервера, на сервере выполняем команду:

curl выданная_ссылка

1.2 E-mail

E-mail понадобится для получения SSL-сертификата, также он будет прописан в конфиге XRay. Не уверен, что E-Mail должен быть действующим, так как никаких проверок по почте не происходит.

1.3 UUID

Уникальный идентификатор пользователя (uuid) будет прописан в конфиге и нужен для подключения по VLESS. Чтобы сгенерировать uuid, можно установить программу uuid:

sudo apt install uuid

И далее вызвать:

uuid

Можно выполнить данный шаг на своём компьютере под ОС LInux или на сервере. А также можно воспользоваться специальным сервисом, например https://www.uuidgenerator.net/version4

1.4 Пароль

Для шифрования соединения по протоколу ShadowSocks, лучше всего использовать современные методы: 2022-blake3-aes-128-gcm или 2022-blake3-aes-256-gcm Для этого нужно сгенерировать соответствующий пароль. Если у нас на домашнем компьютере Linux, можно сгенерировать его там. Некоторые способы доступны и для Windows (но рекомендуется отказаться от использования Windows для личных целей). 2022-blake3-aes-256-gcm — это схема AEAD, для которой нужен 32-байтовый (256-бит) ключ. Рассмотрим несколько способов генерации такого ключа. Если мы хотим использовать 2022-blake3-aes-128-gcm, при генерации указываем 16 байт вместо 32.

1-й способ

Генерируем 32 байта и выводим base64 (удобно хранить/копировать):

# 32 байта случайных -> base64
openssl rand -base64 32

2-й способ

через /dev/urandom:

head -c 32 /dev/urandom | base64

3-й способ

Детерминированный ключ на основе фразы (BLAKE3) - если нужно один и тот же пароль по фразе. Удобно, если нужно восстановить ключ по фразе. Нужен пакет blake3 для Python:

Устанавливаем Python-пакет через pip:

pip3 install --user blake3

Либо можно создать виртуальное окружение через uv или poetry, и установить пакет туда.

Создаём Python-скрипт generate_blake3_key_from_seed.py через любой редактор:

nvim generate_blake3_key_from_seed.py
import base64, sys
from blake3 import blake3

phrase = b"моя секретная фраза"   # заменяем на свою фразу
h = blake3(phrase).digest(length=32)
print(base64.b64encode(h).decode())

Выполняем скрипт:

python3 generate_blake3_key_from_seed.py

4-й способ

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

2 Отключение IPv6 на сервере

Для XRay лучше отключить IPv6, потому что:

Открываем файл:

sudo nvim /etc/sysctl.conf

Добавляем в конец следующие строки:

net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

Затем выполняем команду:

sudo sysctl -p

Чтобы проверить, что IPv6 отключился, можно выполнить следующую команду:

cat /proc/sys/net/ipv6/conf/all/disable_ipv6

Если 1 — всё ок, IPv6 отключён.

3 Получение SSL-сертификата для домена

Получим бесплатный SSL-сертификат от LetsEncrypt. Установим certbot:

sudo apt install certbot

И запросим SSL-сертификат

sudo certbot certonly --standalone --preferred-challenges http -d название_домена

Certbot спросит ваш E-mail на всякий случай, спросит, согласны ли вы с правилами, запросит сертификат от LetsEncrypt, положит его в папочку /etc/letsencrypt и создаст правило, чтобы он обновлялся каждые 3 месяца. При каждом обновлении сертификата нужно перезапускать XRay-сервер, давайте попросим certbot делать это автоматически:

Открываем файл:

sudo nvim /etc/letsencrypt/renewal/название_домена.conf

В конец добавляем строку:

renew_hook = systemctl reload xray

4. Установка nginx

Порт 8080 у нас будет использоваться для VLESS fallback (можно использовать и другой порт). На нем у нас должен слушать веб-сервер с сайтом для маскировки. Самый просто вариант это сделать - поставить позади него nginx:

sudo apt install nginx

Откроем файл /etc/nginx/sites-enabled/default:

sudo nvim /etc/nginx/sites-enabled/default

Есть 3 варианта содержимого:

1-й вариант

поставить стандартную заглушку nginx:

server {
        listen 127.0.0.1:8080 default_server;
        
        root /var/www/html;
        index index.html index.htm index.nginx-debian.html;

        server_name _;

        location / {
                try_files $uri $uri/ =404;
        }
}

Также это может быть реальный сайт с html-страницами, например, с котиками. Или сайт на php, но тогда конфигурация будет более сложной, и это уже не тема данной инструкции.

2-й вариант

веб-сервер спрашивает у подключающихся логин и пароль, и отклоняет все введенные варианты:

server {
        listen 127.0.0.1:8080 default_server;
        
        server_name _;

        location / {
            auth_basic "Administrator’s Area";
            auth_basic_user_file /etc/htpasswd;
        }
}

Сам файл /etc/htpasswd может вообще даже не существовать: нам не нужно проверять правильность пароля, мы будем отклонять все подряд, делая вид, что пароль не подошел. Nginx все равно запустится даже без этого файла.

3-й вариант

переадресовывать подключения на какой-нибудь другой сайт

server {
        listen 127.0.0.1:8080 default_server;
  
        server_name _;

        location / {
             proxy_pass http://lib.ru;
        }
}

В результате при попытке открытия адреса прокси браузером загрузится зеркало lib.ru - заменитм его на какой-нибудь другой сайт. Использовать для этого какие-либо популярные или навороченный сайты явно не стоит, а вот какую-нибудь богом забытую хомпагу эпохи Web 1.0 или безымянную webftp-файлосвалку - уже можно. А чтобы некоторые тупые боты или пауки поисковых систем не нагнали нам трафика, можно добавить опции ratelimit-модуля в Nginx и ограничить скорость передачи данных с “переадресованного” сайта, например, до 1 мегабита. Также можно проксировать на ваш сайт на Python или NodeJS, но тогда конфигурация будет более сложной, и это уже не тема данной инструкции.

После внесения изменений, протестируем, что конфигурация nginx синтаксически верная:

sudo nginx -t

И, если это так, перезапустим nginx:

sudo systemctl restart nginx

5. Установка XRay

Самый простой вариант - установить XRay с помощью готового скрипта:

sudo bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install

6. Настройка конфигурации и запуск

Если мы устанавливали XRay с помощью скрипта, у нас будет следующий файл конфигурации: /usr/local/etc/xray/config.json, откроем его:

sudo nvim /usr/local/etc/xray/config.json

Удалим содержимое и вставим своё:

{
  "log": {
    "loglevel": "none",
    "access": "/var/log/xray/access.log",
    "error": "/var/log/xray/error.log"
  },
  "routing": {
    "rules": [],
    "domainStrategy": "AsIs"
  },
  "inbounds": [
    {
      "port": 2023,
      "tag": "ss",
      "protocol": "shadowsocks",
      "settings": {
        "method": "2022-blake3-aes-256-gcm",
        "password": "наш_пароль",
        "network": "tcp,udp"
      }
    },
    {
      "port": 443,
      "protocol": "vless",
      "tag": "vless_tls",
      "settings": {
        "clients": [
          {
            "id": "наш_uuid",
            "email": "наш_E-mail",
            "flow": "xtls-rprx-vision"
          }
        ],
        "decryption": "none",
        "fallbacks": [
          {
            "path": "/myverysecretpath",
            "dest": "@vless-ws"
          },
          {
            "dest": "8080"
          }
        ]
      },
      "streamSettings": {
        "network": "tcp",
        "security": "tls",
        "tlsSettings": {
          "alpn": ["http/1.1", "h2"],
          "certificates": [
            {
              "certificateFile": "/etc/letsencrypt/live/наш_домен/fullchain.pem",
              "keyFile": "/etc/letsencrypt/live/наш_домен/privkey.pem"
            }
          ]
        }
      },
      "sniffing": {
        "enabled": true,
        "destOverride": ["http", "tls"]
      }
    },
    {
      "listen": "@vless-ws",
      "protocol": "vless",
      "tag": "vless_ws",
      "settings": {
        "clients": [
          {
            "id": "наш_uuid",
            "email": "наш_E-mail"
          }
        ],
        "decryption": "none"
      },
      "streamSettings": {
        "network": "ws",
        "security": "none",
        "wsSettings": {
          "path": "/myverysecretpath"
        }
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "freedom",
      "tag": "direct"
    },
    {
      "protocol": "blackhole",
      "tag": "block"
    }
  ]
}

Если нужно включить логирование, то заменяем значение loglevel с “none” на “info”, либо другой уровень логирования. Однако это приведёт к тому, что при использовании VPN наш реальный IP-адрес, с которого будет подключение, будет сохраняться в логах.

В XRay (как и в V2Ray) поддерживаются такие уровни логирования:

Для протокола ShadowSocks вместо 2023 можно указать любой незанятый порт.

Заменим везде наш_домен, наш_E-mail, наш_uuid и наш_пароль соответствующими данными, записанными на 1-м шаге. Также, если мы используем метод шифрования 2022-blake3-aes-128-gcm, а не 2022-blake3-aes-256-gcm, заменим соответствующее значение в поле “method”.

Откроем файл службы XRay:

sudo nvim /etc/systemd/system/xray.service

Заменим имя пользователя по умолчанию с nobody на root

После этого выполняем:

sudo systemctl daemon-reload
sudo systemctl restart xray

Проверить, что XRay успешно запустился, можно командой:

sudo journalctl -u xray

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