Ручная установка голого ядра Xray-core без панелей. Только Docker и конфиг файлы.
- Структура репозитория
- 1. Обновление системы
- 2. Установка Docker
- 3. Скачать образ Xray
- 4. Включить BBR
- 5. Подобрать SNI
- 6. Скачать репозиторий
- 7. Сгенерировать UUID и ключи
- 8. Заполнить конфиг
- 9. Маршрутизация трафика
- 10. Настройка логов
- 11. Запустить контейнер
- 12. Управление контейнером
- 13. Собрать ссылку для клиента
- Клиенты
.
├── config/
│ ├── 00_log.json # Уровень логирования и пути к файлам логов
│ ├── 01_api.json # gRPC API для управления xray на лету
│ ├── 02_dns.json # DNS серверы для резолвинга доменов
│ ├── 03_routing.json # Правила маршрутизации трафика
│ ├── 04_policy.json # Таймауты соединений и размер буфера
│ ├── 05_inbounds.json # Входящий VLESS+Reality: порт, UUID, ключи, SNI
│ ├── 06_outbounds.json # Куда направлять трафик: в интернет или в блок
│ ├── 07_transport.json # Глобальные настройки транспорта (убраны в новых версиях)
│ ├── 08_stats.json # Счётчики трафика по пользователям для биллинга
│ └── 09_reverse.json # Обратное проксирование (сервер → клиент)
└── logs/
└── .gitkeep
sudo apt update && sudo apt upgrade -yОфициальные инструкции по установке Docker для твоей системы:
docker pull ghcr.io/xtls/xray-core:latestПроверить версию ядра:
docker run --rm ghcr.io/xtls/xray-core:latest versionАктуальную версию смотри в пакетах репозитория.
BBR — алгоритм управления перегрузкой TCP от Google. Увеличивает скорость, особенно на каналах с потерями пакетов. Применяется на уровне ядра хоста, контейнер подхватывает автоматически.
cat > /etc/sysctl.d/99-bbr.conf << 'EOF'
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr
EOF
sysctl -p /etc/sysctl.d/99-bbr.confПроверить:
sysctl net.ipv4.tcp_congestion_control
# → net.ipv4.tcp_congestion_control = bbrSNI (Server Name Indication) — домен под который маскируется трафик. Reality делает TLS handshake неотличимым от обращения к этому домену.
Важно: сканер запускай локально на своём компе. Запуск с VPS может привести к бану сервера хостером.
Страница релизов: https://github.com/XTLS/RealiTLScanner/releases/latest
Windows: скачай RealiTLScanner-windows-64.exe
Linux/Mac: скачай RealiTLScanner-linux-64, затем:
chmod +x RealiTLScanner-linux-64IP своего VPS смотри в личном кабинете хостера. Сканируй подсеть /16 — например, для VPS с адресом 195.66.24.43 это 195.66.0.0/16:
Windows:
RealiTLScanner-windows-64.exe -addr 195.66.0.0/16 -thread 10 -timeout 5
Linux/Mac:
./RealiTLScanner-linux-64 -addr 195.66.0.0/16 -thread 10 -timeout 5Результаты сохранятся в out.csv. Нужны строки где feasible=true и TLS версия 1.3.
Из найденных доменов открой несколько в браузере — убедись что сайт реально работает и отдаёт HTTPS. Этот домен вставляешь в dest и serverNames в конфиге.
git clone https://github.com/wild-paws/xray.git /opt/xray
cd /opt/xray
chmod 777 logsUUID — идентификатор пользователя:
docker run --rm ghcr.io/xtls/xray-core:latest uuidПример:
0cbfd2e0-7368-4afb-a7e0-4ea78a2fa382
X25519 ключи — для шифрования Reality:
docker run --rm ghcr.io/xtls/xray-core:latest x25519Пример:
Private key: YFOdjBK73yxpsyoSEJJmUaND6BFq65gv41OXfwERwkQ
Public key: Ers1clRrYxF_eXQKPXvMmo4J6bhrkxB_F18UU9OghyA
Приватный ключ идёт в конфиг сервера, публичный — в ссылку для клиента.
В репозитории 05_inbounds.json содержит три входящих подключения — можно использовать все сразу или оставить только нужные.
VLESS + TCP + Reality (порт 443) — основной и самый совместимый. Трафик неотличим от обычного TLS к легитимному сайту. Работает на всех клиентах.
VLESS + XHTTP + Reality (порт 8443) — продвинутый вариант. XHTTP разделяет upload и download на два отдельных HTTP-соединения — это сильно затрудняет анализ трафика DPI по сравнению с TCP. Может работать через CDN. Минус — поддерживают только xray-based клиенты: v2rayTun, Happ, v2rayN, v2rayNG. Sing-box клиенты не поддерживают.
Shadowsocks 2022 (порт 54321) — простой и быстрый протокол. Менее стелсовый чем Reality, но полезен как запасной вход или для устройств где VLESS не поддерживается.
nano /opt/xray/config/05_inbounds.json| Поле | Что вставить |
|---|---|
id |
UUID из шага 7 — одинаковый для TCP и XHTTP |
dest и serverNames |
SNI домен из шага 5, например github.com |
privateKey |
Приватный ключ из шага 7 — одинаковый для TCP и XHTTP |
shortIds |
Произвольная hex-строка 2-16 символов, например 0a1b2c3d |
path в xhttpSettings |
Произвольный путь, например /mypath2024 — должен совпадать в клиенте |
password |
Пароль для Shadowsocks — см. ниже |
Метод 2022-blake3-aes-128-gcm требует ровно 16 байт в base64:
openssl rand -base64 16Пример вывода:
zMpozIQdHJsSteIJfWGkDA==
Этот пароль вставляешь в поле password и используешь в клиенте.
Если используешь дополнительные протоколы — открой их порты в UFW:
ufw allow 8443/tcp
ufw allow 54321/tcp
ufw allow 54321/udpПравила в 03_routing.json обрабатываются сверху вниз — первое совпадение побеждает.
Блок рекламы — режет рекламные домены до того как запрос уйдёт куда-либо:
{ "type": "field", "domain": ["geosite:category-ads-all"], "outboundTag": "block" }Блок торрентов — xray распознаёт BitTorrent на уровне протокола и режет соединение:
{ "type": "field", "protocol": ["bittorrent"], "outboundTag": "block" }Важно про split tunneling. Если хочешь чтобы российские сайты шли напрямую с устройства, минуя VPS — это настраивается на клиенте, не на сервере.
directна сервере означает лишь «не перенаправлять на следующий прокси», но запрос всё равно уходит с немецкого IP. Настрой правила маршрутизации в самом приложении (Happ, v2rayTun и др.) — там добавьgeoip:ru,geosite:category-ruс тегомdirect.
Если логи не нужны — отключи их совсем:
nano /opt/xray/config/00_log.json{
"log": {
"loglevel": "none",
"access": "none",
"error": "none"
}
}По умолчанию в конфиге уже стоит info — пишется каждое соединение с IP и доменом. Пути /var/log/xray/ внутри контейнера монтируются в /opt/xray/logs/ на хосте через команду запуска из шага 10.
Уровни логирования (каждый включает все уровни выше):
| Уровень | Что пишется |
|---|---|
debug |
Всё подряд, только для отладки |
info |
Каждое соединение с IP и доменом |
warning |
Только проблемы |
error |
Только критические ошибки |
none |
Ничего |
Без ротации файлы будут расти бесконечно. Настраиваем автоматическое удаление когда файл достиг 1MB:
cat > /etc/logrotate.d/xray << 'EOF'
/opt/xray/logs/*.log {
size 1M
rotate 1
missingok
notifempty
compress
copytruncate
}
EOF
chmod 644 /etc/logrotate.d/xrayПроверить что конфиг написан без ошибок:
logrotate -v /etc/logrotate.d/xrayЕсли всё хорошо — в выводе не будет слова error. Если конфиг сломан, увидишь строку вида error: /etc/logrotate.d/xray:8 unexpected text.
Применить вручную прямо сейчас:
logrotate -f /etc/logrotate.d/xrayLogrotate без флагов запускается автоматически раз в сутки через cron — больше ничего настраивать не нужно.
Устанавливаем UFW если нет:
apt install ufw -yНастраиваем правила — закрываем все входящие, кроме SSH и 443:
ufw default deny incoming
ufw default allow outgoing
ufw allow 22/tcp
ufw allow 443/tcp
ufw enableПроверить:
ufw statusПорт 443 выбран не случайно — это стандартный HTTPS. Трафик на 443 не вызывает подозрений у DPI и не блокируется провайдерами.
docker run -d \
-p 443:443 \
-p 8443:8443 \
-p 54321:54321 \
-p 54321:54321/udp \
--name xray --restart=always \
-v /opt/xray/config:/usr/local/etc/xray \
-v /opt/xray/logs:/var/log/xray \
ghcr.io/xtls/xray-core:latestЕсли используешь только VLESS+TCP — оставь только -p 443:443.
Проверить что запустился без ошибок:
docker logs xrayВ логах должны быть строки Reading config: для каждого файла и отсутствие Failed to start.
Посмотреть логи:
docker logs xrayПерезапустить (например после изменений конфига):
docker restart xrayОстановить:
docker stop xrayУдалить контейнер:
docker rm -f xrayУдалить образ:
docker rmi ghcr.io/xtls/xray-core:latestПолностью удалить всё — контейнер, образ, файлы, ротацию логов и BBR:
docker rm -f xray
docker rmi ghcr.io/xtls/xray-core:latest
rm -rf /opt/xray
rm -f /etc/logrotate.d/xray
rm -f /etc/sysctl.d/99-bbr.conf
sysctl -pvless://UUID@IP_СЕРВЕРА:443?type=tcp&security=reality&pbk=ПУБЛИЧНЫЙ_КЛЮЧ&fp=FINGERPRINT&sni=SNI_ДОМЕН&sid=SHORT_ID&flow=xtls-rprx-vision&packetEncoding=xudp#НАЗВАНИЕ
Пример:
vless://0cbfd2e0-7368-4afb-a7e0-4ea78a2fa382@195.66.24.43:443?type=tcp&security=reality&pbk=Ers1clRrYxF_eXQKPXvMmo4J6bhrkxB_F18UU9OghyA&fp=ios&sni=github.com&sid=0a1b2c3d&flow=xtls-rprx-vision&packetEncoding=xudp#myserver-tcp
vless://UUID@IP_СЕРВЕРА:8443?type=xhttp&security=reality&pbk=ПУБЛИЧНЫЙ_КЛЮЧ&fp=FINGERPRINT&sni=SNI_ДОМЕН&sid=SHORT_ID&path=%2Fapi%2Fv1%2Fstream&packetEncoding=xudp#НАЗВАНИЕ
Пример:
vless://0cbfd2e0-7368-4afb-a7e0-4ea78a2fa382@195.66.24.43:8443?type=xhttp&security=reality&pbk=Ers1clRrYxF_eXQKPXvMmo4J6bhrkxB_F18UU9OghyA&fp=ios&sni=github.com&sid=0a1b2c3d&path=%2Fapi%2Fv1%2Fstream&packetEncoding=xudp#myserver-xhttp
Про path: XHTTP маскирует трафик под обычные HTTP-запросы к веб-серверу. path — это URL-путь этих запросов. Он должен выглядеть как настоящий API-эндпоинт или статический файл, а не как /proxy или /vpn. В конфиге сервера и в ссылке клиента путь должен совпадать. В URL / кодируется как %2F.
Примеры хороших путей: /api/v1/stream, /cdn/assets/bundle, /static/js/app
XHTTP поддерживают только xray-based клиенты: v2rayTun и Happ. В Hiddify и Sing-box не работает.
| Параметр | Значение |
|---|---|
UUID |
Из шага 7 |
IP_СЕРВЕРА |
Внешний IP твоего VPS |
pbk |
Публичный ключ из шага 7 (не приватный!) |
fp |
Fingerprint браузера — см. таблицу ниже |
sni |
SNI домен из шага 5 |
sid |
shortId из конфига |
packetEncoding=xudp |
Обязательно для голосовых звонков в WhatsApp и Telegram |
#НАЗВАНИЕ |
Отображаемое имя сервера в клиенте, например #myserver |
Fingerprint — имитация конкретного браузера. Выбирай под устройство клиента:
fp |
Устройство |
|---|---|
ios |
iPhone, iPad |
android |
Android |
chrome |
Chrome на Windows/Linux |
firefox |
Firefox |
edge |
Microsoft Edge |
Ссылку вставляй в клиент через «Добавить по ссылке» или QR-код.
v2rayTun — iOS, Android, Windows, macOS. Быстрый, простой, бесплатный. Поддерживает все три протокола из этого конфига.
- iOS: App Store
- Android: Google Play
- Windows / macOS: v2raytun.com
Happ — iOS, Android, Windows, macOS, Linux, tvOS, Android TV. Гибкие правила маршрутизации, зашифрованные подписки. Поддерживает все три протокола из этого конфига.
- iOS / macOS: App Store
- Android: Google Play
- Windows / Linux: happ.su