Нам понадобится домен, E-mail, UUID и пароль. Подготовим их, согласно инструкции ниже, и запишем в какой-нибудь файл, чтобы были под рукой. Не стоит делиться этими данными (кроме, возможно, E-mail) с третьми лицами, так как, например, пары домен и UUID уже достаточно, чтобы использовать для подключения по протоколу VLESS.
Можно купить платный и привязать его к IP-адресу сервера, то есть создать в регистраторе домена запись типа A с IP-адресом сервера и названием домена.
Можно создать бесплатный домен 3-го уровня на сервисе freemyip.com. Для этого вводим название домена и, если он доступен, сайт выдаст ссылку следующего вида: https://freemyip.com/update?token=токен&domain=название-домена Для привязки созданного домена к IP нашего сервера, на сервере выполняем команду:
curl выданная_ссылкаE-mail понадобится для получения SSL-сертификата, также он будет прописан в конфиге XRay. Не уверен, что E-Mail должен быть действующим, так как никаких проверок по почте не происходит.
Уникальный идентификатор пользователя (uuid) будет прописан в конфиге и нужен для подключения по VLESS. Чтобы сгенерировать uuid, можно установить программу uuid:
sudo apt install uuidИ далее вызвать:
uuidМожно выполнить данный шаг на своём компьютере под ОС LInux или на сервере. А также можно воспользоваться специальным сервисом, например https://www.uuidgenerator.net/version4
Для шифрования соединения по протоколу 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.
Генерируем 32 байта и выводим base64 (удобно хранить/копировать):
# 32 байта случайных -> base64
openssl rand -base64 32через /dev/urandom:
head -c 32 /dev/urandom | base64Детерминированный ключ на основе фразы (BLAKE3) - если нужно один и тот же пароль по фразе. Удобно, если нужно восстановить ключ по фразе. Нужен пакет blake3 для Python:
Устанавливаем Python-пакет через pip:
pip3 install --user blake3Либо можно создать виртуальное окружение через uv или poetry, и установить пакет туда.
Создаём Python-скрипт generate_blake3_key_from_seed.py через любой редактор:
nvim generate_blake3_key_from_seed.pyimport 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Онлайн-инструменты. Существуют сайты-генераторы случайных байтов / base64 генераторы. Но не рекомендуется получать критичные ключи через онлайн-генераторы, если хочется спокойствия по безопасности.
Для XRay лучше отключить IPv6, потому что:
Клиенты могут использовать IPv6 и “обходить” IPv4-блокировки, но это может сломать прокси или фаервол.
Многие фаерволы и iptables-фильтры по умолчанию не фильтруют IPv6, если сами не настроим.
Часто XRay-конфигурации вообще не проверяют, через какой стек работает соединение.
Открываем файл:
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 отключён.
Получим бесплатный 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Порт 8080 у нас будет использоваться для VLESS fallback (можно использовать и другой порт). На нем у нас должен слушать веб-сервер с сайтом для маскировки. Самый просто вариант это сделать - поставить позади него nginx:
sudo apt install nginxОткроем файл /etc/nginx/sites-enabled/default:
sudo nvim /etc/nginx/sites-enabled/defaultЕсть 3 варианта содержимого:
поставить стандартную заглушку 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, но тогда конфигурация будет более сложной, и это уже не тема данной инструкции.
веб-сервер спрашивает у подключающихся логин и пароль, и отклоняет все введенные варианты:
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 все равно запустится даже без этого файла.
переадресовывать подключения на какой-нибудь другой сайт
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Самый простой вариант - установить XRay с помощью готового скрипта:
sudo bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ installЕсли мы устанавливали 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) поддерживаются такие уровни логирования:
"none" — полное отключение логов.
"error" — только ошибки.
"warning" — предупреждения и ошибки.
"info" — базовый уровень (инфо, предупреждения, ошибки). Обычно по умолчанию.
"debug" — подробный отладочный вывод (много строк).
Для протокола 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-файл, обычно это связано с лишними запятыми в конце {} блока, в этом случае он укажет, на какой строке ошибка. Исправляем ошибки, перезапускаем еще раз, и переходим к настройке клиента.