Загрузка данных
Да. Но я бы **не делал просто VLESS + REALITY поверх старого TCP-варианта**. Для новой установки я бы взял:
- **сервер:** Xray-core;
- **протокол:** VLESS;
- **transport:** **XHTTP**;
- **security:** **REALITY**;
- **клиент на NixOS:** тоже **Xray-core CLI**, а не sing-box;
- локально: SOCKS5 + HTTP proxy, а при необходимости — TUN.
Причина: актуальный Xray прямо поддерживает связку VLESS + XHTTP + REALITY, причём REALITY сейчас поддерживается с RAW, XHTTP и gRPC. Сам Xray описывает XHTTP как отдельный современный transport, а HTTPUpgrade, например, уже рекомендует заменять на XHTTP. XTLS+1
При этом важно понимать: **«максимально живучей» конфигурации не существует**. Если оператор блокирует конкретные IP/ASN или активно анализирует трафик, любой публичный сервер может перестать работать. Поэтому ниже я также дам архитектуру с резервным вторым транспортом.
## Что именно будем строить
Схема:
```
NixOS
│
│ SOCKS5 / HTTP / TUN
▼
Xray client
│
│ VLESS
│ XHTTP
│ REALITY
▼
Ubuntu VPS :443
│
▼
Xray server
│
▼
Internet
```
На сервере **не нужен настоящий TLS-сертификат для твоего домена**: REALITY использует TLS-подобное рукопожатие и параметры целевого публичного сайта. Клиент проверяет REALITY по публичному ключу сервера, `shortId` и имени сервера. XTLS
---
# 1\. Что понадобится
Предположим:
```
VPS IPv4: 203.0.113.10
VPS OS: Ubuntu 24.04 LTS
SSH user: root
порт: 443/tcp
REALITY target: www.example.com
SNI: www.example.com
```
**`www.example.com` здесь только пример. Не копируй его.**
Target следует выбирать реальный TLS-сайт, который:
- стабильно доступен из сети, где будет клиент;
- работает на TCP/443;
- нормально отвечает на TLS ClientHello;
- имеет предсказуемый сертификат/SAN;
- не является твоим VPS;
- желательно не находится за CDN, который превращает твой VPS в потенциальный открытый TCP-forwarder.
Сам Xray отдельно предупреждает о риске с target за CDN/Cloudflare: неавторизованные REALITY-соединения могут быть перенаправлены на target, поэтому неудачный выбор target может превратить VPS в нежелательный прокси. XTLS
---
# 2\. Подготовка Ubuntu
Подключаемся:
```
ssh root@203.0.113.10
```
Обновляем систему:
```
apt update
apt full-upgrade -y
apt install -y curl unzip ca-certificates jq openssl
```
Проверяем время:
```
timedatectl status
```
Если NTP выключен:
```
timedatectl set-ntp true
```
Это важно: REALITY имеет механизм проверки допустимой разницы времени между клиентом и сервером. XTLS
---
# 3\. Firewall
Я бы оставил наружу только SSH и 443.
Если используешь UFW:
```
apt install -y ufw
ufw default deny incoming
ufw default allow outgoing
ufw allow 22/tcp
ufw allow 443/tcp
ufw enable
```
Проверить:
```
ufw status verbose
```
**Не открывай UDP/443**, если конкретно выбранная конфигурация его не использует.
---
# 4\. Установка Xray
Используем официальный install script проекта Xray, а не случайный one-click installer. Репозиторий Xray указывает его как официально поддерживаемый Linux-способ установки. GitHub+1
Сначала скачиваем скрипт:
```
cd /root
curl -fsSLo install-release.sh \
https://github.com/XTLS/Xray-install/raw/main/install-release.sh
```
Посмотреть его перед запуском:
```
less install-release.sh
```
Запустить:
```
bash install-release.sh
```
После установки:
```
/usr/local/bin/xray version
```
Конфигурация обычно находится здесь:
```
/usr/local/etc/xray/config.json
```
а бинарник:
```
/usr/local/bin/xray
```
Именно такую структуру использует официальный installer. GitHub
---
# 5\. Генерируем UUID
```
xray uuid
```
Получишь что-то вроде:
```
8f5c0f5e-2a9c-4b6e-9c0e-123456789abc
```
Сохрани его.
Например:
```
UUID="8f5c0f5e-2a9c-4b6e-9c0e-123456789abc"
```
UUID должен быть случайным и уникальным; официальная документация Xray прямо рекомендует генерировать его через `xray uuid` или `uuidgen`. XTLS
---
# 6\. Генерируем REALITY keypair
Выполни:
```
xray x25519
```
Получишь примерно:
```
Private key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Public key: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
```
**Private key остаётся только на сервере.**
**Public key понадобится клиенту.**
Это соответствует актуальной схеме REALITY: сервер хранит `privateKey`, клиент — соответствующий ему публичный ключ (`password` в Xray-конфиге; название исторически несколько сбивает с толку). XTLS
---
# 7\. Генерируем shortId
Например:
```
openssl rand -hex 8
```
Получится:
```
4e8a2c91d73f05ab
```
Сохрани его.
REALITY допускает до 16 hex-символов; количество символов должно быть чётным. XTLS
---
# 8\. Проверяем REALITY target
Предположим, ты выбрал:
```
www.example.com
```
На сервере:
```
xray tls ping www.example.com
```
Если target использует 443, этого достаточно.
Если хочешь проверить конкретный порт:
```
xray tls ping www.example.com:443
```
Xray сам рекомендует `xray tls ping` для проверки поведения target. XTLS
Я бы **не переходил дальше**, пока target не выглядит нормально.
---
# 9\. Конфигурация сервера
Открываем:
```
nano /usr/local/etc/xray/config.json
```
Для начала ставим минимальную конфигурацию.
```
{
"log": {
"loglevel": "warning"
},
"inbounds": [
{
"listen": "0.0.0.0",
"port": 443,
"protocol": "vless",
"settings": {
"clients": [
{
"id": "YOUR-UUID",
"flow": "xtls-rprx-vision"
}
],
"decryption": "none"
},
"streamSettings": {
"network": "xhttp",
"security": "reality",
"xhttpSettings": {
"path": "/xray"
},
"realitySettings": {
"show": false,
"target": "www.example.com:443",
"serverNames": [
"www.example.com"
],
"privateKey": "YOUR-REALITY-PRIVATE-KEY",
"shortIds": [
"YOUR-SHORT-ID"
]
}
}
}
],
"outbounds": [
{
"protocol": "freedom",
"tag": "direct"
},
{
"protocol": "blackhole",
"tag": "block"
}
]
}
```
Замени:
```
YOUR-UUID
YOUR-REALITY-PRIVATE-KEY
YOUR-SHORT-ID
www.example.com
```
на свои значения.
### Важный момент про XHTTP + Vision
Актуальная документация Xray разрешает REALITY вместе с XHTTP, а VLESS поддерживает `xtls-rprx-vision`. XTLS+1
Если конкретная версия Xray при запуске выдаёт ошибку совместимости параметров, **не начинай экспериментировать с десятком настроек**. Сначала:
```
xray version
```
и:
```
xray run -test -config /usr/local/etc/xray/config.json
```
---
# 10\. Проверяем конфигурацию
Очень важный этап:
```
xray run -test \
-config /usr/local/etc/xray/config.json
```
Если всё хорошо, получишь сообщение об успешной проверке.
Если ошибка — **не перезапускай работающий сервер**, пока её не исправишь.
---
# 11\. Запускаем Xray
```
systemctl enable xray
systemctl restart xray
```
Проверяем:
```
systemctl status xray --no-pager
```
Должно быть:
```
Active: active (running)
```
Проверяем порт:
```
ss -lntp | grep ':443'
```
Должно быть примерно:
```
LISTEN ... 0.0.0.0:443 ...
```
---
# 12\. Если Xray не стартует
Смотри:
```
journalctl -u xray -n 100 --no-pager
```
И отдельно:
```
xray run -test \
-config /usr/local/etc/xray/config.json
```
Чаще всего проблема в:
- неправильном JSON;
- неправильном `privateKey`;
- неправильном `shortId`;
- несовпадающем `serverNames`;
- занятом порте 443;
- неправильном transport;
- несовместимости версии клиента/сервера.
---
# 13\. Клиент NixOS: почему я предлагаю Xray CLI
Для твоего сценария я бы **не ставил GUI-клиент**.
Есть два разумных варианта:
### Вариант A — Xray
Плюсы:
- тот же core, что и сервер;
- актуальная поддержка REALITY/XHTTP;
- CLI;
- удобно держать конфигурацию декларативно в NixOS;
- можно сделать systemd service;
- можно поднять SOCKS/HTTP;
- можно сделать TUN.
### Вариант B — sing-box
sing-box тоже отлично поддерживает VLESS \+ REALITY и является очень хорошим Linux CLI-клиентом. В его документации VLESS имеет `xtls-rprx-vision`, TLS и transport-параметры, а REALITY поддерживается непосредственно. Sing Box+1
Но для **XHTTP + REALITY** я бы сейчас использовал именно Xray, потому что XHTTP — собственный современный transport Xray, тогда как sing-box документирует V2Ray transport отдельно и не предоставляет аналогичного XHTTP transport в этой части конфигурации. Sing Box
---
# 14\. Установка Xray на NixOS
Сначала проверь:
```
nix search nixpkgs xray
```
Xray присутствует в nixpkgs; официальный sing-box сайт также указывает nixpkgs как способ установки sing-box на NixOS. Sing Box
В `configuration.nix`:
```
environment.systemPackages = with pkgs; [
xray
];
```
Затем:
```
sudo nixos-rebuild switch
```
Проверяем:
```
xray version
```
---
# 15\. Клиентская конфигурация Xray
Создай, например:
```
/etc/nixos/xray-client.json
```
```
{
"log": {
"loglevel": "warning"
},
"inbounds": [
{
"listen": "127.0.0.1",
"port": 1080,
"protocol": "socks",
"settings": {
"udp": true
}
},
{
"listen": "127.0.0.1",
"port": 1081,
"protocol": "http"
}
],
"outbounds": [
{
"tag": "proxy",
"protocol": "vless",
"settings": {
"vnext": [
{
"address": "203.0.113.10",
"port": 443,
"users": [
{
"id": "YOUR-UUID",
"encryption": "none",
"flow": "xtls-rprx-vision"
}
]
}
]
},
"streamSettings": {
"network": "xhttp",
"security": "reality",
"xhttpSettings": {
"path": "/xray"
},
"realitySettings": {
"serverName": "www.example.com",
"fingerprint": "chrome",
"password": "YOUR-REALITY-PUBLIC-KEY",
"shortId": "YOUR-SHORT-ID",
"spiderX": "/"
}
}
},
{
"tag": "direct",
"protocol": "freedom"
},
{
"tag": "block",
"protocol": "blackhole"
}
],
"routing": {
"domainStrategy": "AsIs",
"rules": [
{
"type": "field",
"ip": [
"geoip:private"
],
"outboundTag": "direct"
}
]
}
}
```
Здесь:
```
address
```
— **IP твоего VPS**, а
```
serverName
```
— target/SNI.
То есть это нормально, что:
```
address = 203.0.113.10
serverName = www.example.com
```
REALITY именно так и работает.
---
# 16\. Что такое `fingerprint`
Я бы оставил:
```
"fingerprint": "chrome"
```
REALITY требует TLS fingerprint на клиенте; Xray прямо указывает `chrome` как стандартный пример. XTLS
Не надо каждый раз менять fingerprint «для маскировки». Стабильная, правдоподобная конфигурация лучше, чем хаотическое переключение параметров.
---
# 17\. Проверяем клиентскую конфигурацию
На NixOS:
```
xray run -test \
-config /etc/nixos/xray-client.json
```
Потом вручную запускаем:
```
xray run \
-config /etc/nixos/xray-client.json
```
В другом терминале:
```
curl \
--proxy socks5h://127.0.0.1:1080 \
https://ifconfig.me
```
Если всё работает, внешний IP должен быть IP VPS.
---
# 18\. Делаем systemd service на NixOS
Я бы не запускал Xray вручную.
В `configuration.nix`:
```
systemd.services.xray-client = {
description = "Xray client";
wantedBy = [ "multi-user.target" ];
after = [ "network-online.target" ];
wants = [ "network-online.target" ];
serviceConfig = {
ExecStart =
"${pkgs.xray}/bin/xray run -config /etc/nixos/xray-client.json";
Restart = "on-failure";
RestartSec = "3";
DynamicUser = true;
NoNewPrivileges = true;
PrivateTmp = true;
ProtectSystem = "strict";
ProtectHome = true;
};
};
```
Затем:
```
sudo nixos-rebuild switch
```
Проверка:
```
systemctl status xray-client
```
Логи:
```
journalctl -u xray-client -f
```
---
# 19\. Использование CLI
Теперь приложения можно направлять через SOCKS5:
```
curl --proxy socks5h://127.0.0.1:1080 https://example.com
```
Git:
```
git -c http.proxy=socks5h://127.0.0.1:1080 clone https://github.com/...
```
wget:
```
https_proxy=http://127.0.0.1:1081 \
http_proxy=http://127.0.0.1:1081 \
wget https://example.com
```
SSH:
```
ssh \
-o 'ProxyCommand=nc -x 127.0.0.1:1080 -X 5 %h %p' \
user@example.com
```
---
# 20\. SOCKS5 vs HTTP
Я бы использовал:
```
127.0.0.1:1080 = SOCKS5
127.0.0.1:1081 = HTTP
```
Для CLI в Linux основным сделал бы **SOCKS5**.
Особенно важно использовать:
```
socks5h://
```
а не:
```
socks5://
```
`h` означает, что hostname разрешается через прокси, а не локально.
Например:
```
curl --proxy socks5h://127.0.0.1:1080 https://example.com
```
---
# 21\. Если хочешь проксировать весь NixOS
Тогда SOCKS недостаточно: далеко не каждое приложение умеет SOCKS.
В таком случае я бы сделал второй вариант:
```
NixOS
│
▼
Xray TUN
│
▼
VLESS → XHTTP → REALITY
│
▼
VPS
```
Это существенно удобнее для desktop Linux.
Но TUN требует более сложной маршрутизации, DNS и исключений для самого VPS/Xray. Поэтому я бы **сначала добился стабильной работы через SOCKS**, а уже затем добавлял TUN.
---
# 22\. Что я бы НЕ делал
Не советую следующие популярные конфигурации как основной вариант:
### VLESS + WS + TLS + CDN
Это уже довольно старый шаблон.
### VLESS + HTTPUpgrade
Xray прямо рекомендует переходить на XHTTP вместо HTTPUpgrade из-за характерных признаков HTTPUpgrade. XTLS
### VMess
Для новой установки я бы его не выбирал. Xray позиционирует VLESS как лёгкий stateless-протокол, а современный стек Xray строится вокруг VLESS/XTLS/REALITY/XHTTP. XTLS+1
### WireGuard как единственный публичный endpoint
WireGuard криптографически хороший, но сам Xray отмечает, что его фиксированный UDP-признак относительно легко классифицируется/блокируется, поэтому для прямого обхода фильтрации это плохой вариант. XTLS
---
# 23\. Самое важное: не один сервер
Если тебе действительно нужна **живучесть**, я бы не пытался выжать её из одного VPS.
Архитектура лучше такая:
```
┌── VPS #1
NixOS ── client ───────┤
└── VPS #2
```
Например:
```
Node A:
VLESS + XHTTP + REALITY
Node B:
VLESS + REALITY
другой IP
другой ASN
другой target
```
И клиент имеет два outbound'а:
```
proxy-a
proxy-b
```
с возможностью переключения.
Это намного полезнее, чем бесконечно подкручивать параметры одного узла.
---
# 24\. Ещё одна важная защита сервера
REALITY имеет интересную особенность: неавторизованный трафик может быть отправлен на `target`. Xray отдельно предупреждает, что при неудачном выборе target это может создать проблему с нежелательным использованием твоего сервера. XTLS
Поэтому:
- не ставь первым попавшийся Cloudflare-домен;
- не используй свой VPS как target;
- проверяй target через `xray tls ping`;
- следи за bandwidth;
- держи `show: false`;
- не включай подробный access log без необходимости.
---
# 25\. Обновления
На сервере периодически:
```
cd /root
bash install-release.sh
```
После обновления:
```
xray version
```
Проверка:
```
xray run -test \
-config /usr/local/etc/xray/config.json
```
И только затем:
```
systemctl restart xray
```
Xray-документация отдельно предупреждает, что актуальная документация может описывать поля, которых нет в старой версии, поэтому версии клиента и сервера лучше держать современными. XTLS
---
# 26\. Что в итоге я рекомендую
Для твоего случая я бы начал именно с:
```
Xray
├── VLESS
├── XHTTP
├── REALITY
└── XTLS Vision
```
и на NixOS:
```
Xray CLI
├── SOCKS5 :1080
└── HTTP :1081
```
а затем, если нужен системный proxy:
```
Xray TUN
```
И обязательно иметь **второй VPS**, если под «живучестью» ты подразумеваешь не просто защиту от DPI, а способность продолжать работать после блокировки конкретного IP.
Официальная документация Xray сейчас прямо указывает REALITY как транспортную защиту, совместимую с RAW/XHTTP/gRPC, а Xray поддерживает VLESS, XTLS Vision и XHTTP как собственные современные компоненты. XTLS+1
### Полезные официальные страницы
```
xray version
```
- Xray — официальная документация
- Xray REALITY configuration
- Xray transport configuration
- Xray installer
- sing-box documentation
**Но есть один нюанс:** приведённый выше XHTTP-конфиг я бы не стал слепо копировать на production без сверки с конкретной версией Xray — XHTTP довольно активно развивается. Если скажешь **версию Ubuntu (`24.04/22.04`), архитектуру VPS (`amd64/arm64`) и версию NixOS**, я могу следующим сообщением дать тебе **полностью готовый комплект файлов**: `config.json` сервера + `configuration.nix` \+ клиентский `config.json` \+ systemd + TUN + команды генерации всех секретов, так чтобы осталось только подставить IP и выбранный target.