VPN·HUB·CRACK
Все рабочие конфиги: Reality, Self-steal, XHTTP, WARP · VPN HUB CRACK
Все рабочие конфиги: Reality, Self-steal, XHTTP, WARP
Профили подключений (inbounds)
Каждый «способ подключения» = комбинация трёх осей:
- Протокол: VLESS / Trojan / Shadowsocks / Hysteria2 (что внутри; VLESS: лёгкий протокол Xray, основа большинства VPN).
- Транспорт: TCP(raw) / XHTTP / (gRPC/WS) (как пакуется поток).
- Безопасность: Reality / TLS / Self-steal (как маскируется рукопожатие, момент установки соединения; TLS: обычное шифрование HTTPS).
В Remnawave это ложится в цепочку: Config Profile (полный Xray-конфиг с inbounds/outbounds/routing) → Inbound (один блок из конфига) → Host (адрес/порт/SNI для клиента) → Squad (= тариф). То есть сначала добавляете inbound в Config Profile, затем создаёте Host, который на него ссылается, и привязываете к скваду.
📖 Незнакомые слова? Все термины простыми словами есть в Словаре терминов.
🚀 Не хотите собирать конфиги руками? MultiScript поднимает ноду с нужным инбаундом (Reality / Hysteria2 / selfsteal) одной формой: ключи и shortId генерит сам. См. «О MultiScript».
Что выбрать (шпаргалка)
| Профиль | Где блокируют по… | Нужен домен | Нужен серт | Стелс | Когда брать |
|---|---|---|---|---|---|
| VLESS-TCP-Reality | SNI/handshake | нет | нет | высокий | базовый выбор, быстро |
| VLESS-Selfsteal (Reality на свой сайт) | SNI/handshake + актив-проб | да | да (на сайт) | максимальный | основной для жёсткого DPI |
| VLESS-TCP-TLS | нет (палится по SNI) | да | да | средний | за CDN / когда нужен честный TLS |
| VLESS-XHTTP-TLS | IP (через CDN) | да | да | высокий | Cloudflare/CDN, мобильные |
| VLESS-XHTTP-Reality | SNI + поведение | нет | нет | высокий | Reality + плюсы XHTTP |
| VLESS-XHTTP-Selfsteal | всё сразу | да | да | максимальный | топ-стелс, но сложнее |
| Hysteria2 | TCP режут, потери | да | да | средний (QUIC) | моб. сети, плохие каналы |
| Trojan | нет | да | да | средний | резерв/другой протокол |
| Shadowsocks-2022 | нет | нет | нет | низкий | запасной канал, IoT |
| WARP native | нет (это outbound) | нет | нет | нет | разблок ChatGPT/гео, чистый egress |
Практика: основная нода = Selfsteal (Reality на свой сайт) + Hysteria2. Остальное как резерв/под спецзадачи. WARP не способ подключения клиента, а исходящий маршрут (см. в конце).
Полный конфиг-профиль (вставляется целиком)
В Remnawave в Config Profile кладётся весь Xray-конфиг ноды (log / dns / inbounds / outbounds / routing), а не отдельный inbound. Ниже дан рабочий профиль VLESS + Reality (официальный шаблон Remnawave). Скопируйте его целиком в редактор профиля и поменяйте только отмеченные строки:
{
"log": { "loglevel": "none" },
"inbounds": [
{
"tag": "VLESS_TCP_REALITY",
"port": 443,
"listen": "0.0.0.0",
"protocol": "vless",
"settings": { "clients": [], "decryption": "none" }, // clients НЕ трогаем — заполнит панель
"sniffing": { "enabled": true, "destOverride": ["http","tls","quic"] },
"streamSettings": {
"network": "raw", // raw = бывш. tcp (новые сборки)
"security": "reality",
"realitySettings": {
"target": "google.com:443", // ← ЗАМЕНИТЬ: «донор» (чужой TLS1.3-сайт) ИЛИ свой (self-steal)
"shortIds": [""], // ← можно оставить "" или задать свой: openssl rand -hex 8
"privateKey": "PRIVATE_KEY", // ← ЗАМЕНИТЬ: privateKey из генератора панели
"serverNames": ["google.com"] // ← ЗАМЕНИТЬ: SNI = домен из target
}
}
}
],
"outbounds": [
{ "tag": "DIRECT", "protocol": "freedom" },
{ "tag": "BLOCK", "protocol": "blackhole" }
],
"routing": { "rules": [
{ "ip": ["geoip:private"], "outboundTag": "BLOCK" },
{ "domain": ["geosite:private"], "outboundTag": "BLOCK" },
{ "protocol": ["bittorrent"], "outboundTag": "BLOCK" } // режем торренты — иначе abuse от хостера
]}
}
Что поменять (всего 3 строки):
- privateKey: приватный ключ Reality. Генерится прямо в панели (см. ниже), CLI не нужен. publicKey из той же пары пойдёт в Host.
- serverNames и target: домен-маскировка. Два режима:
- чужой донор (проще, без своего сайта): target: "google.com:443", serverNames: ["google.com"], любой крупный сайт с TLS 1.3, не за CDN, не ваш;
- self-steal (максимальный стелс, нужен локальный сайт-обманка): target: "/dev/shm/nginx.sock" + добавить "xver": 1, serverNames: ["ваш-домен"] (nginx на unix-сокете отдаёт ваш сайт, см. раздел «VLESS-Selfsteal» ниже).
- shortIds: оставьте [""] (принимает любой) или задайте свой HEX.
- ⚠️ clients: [] не трогайте: Remnawave сам подставит пользователей из сквадов.
Где взять ключи Reality: в самой панели. В редакторе профиля есть генератор пары x25519 (кнопка генерации ключей; под капотом /api/system/tools/x25519/generate). Нажали → privateKey вставляете в конфиг, publicKey запоминаете для Host. (CLI-вариант, если хочется: docker exec <нода> xray x25519.)
Для других протоколов (XHTTP, Hysteria2, Trojan, SS, WARP-outbound) берёте этот же каркас
log/outbounds/routingи заменяете/добавляете блок вinbounds(илиoutboundsдля WARP): готовые блоки ниже по статье.
Как привязать: профиль → нода → Host → сквад (по UI Remnawave)
Пошагово, по реальным экранам панели (ветка 2.x). Цепочка: Config Profile → Inbound → Host → Squad → пользователь.
- Config Profiles →
Create Config Profile. Имя (напр.main). В редакторе вставьте конфиг выше, сгенерируйте ключи x25519 (кнопка генератора), впишитеserverNames/target. У inbound естьtag(VLESS_TCP_REALITY), по нему он выбирается дальше. Save. - Nodes → Management →
+ Create new node. Заполните Country, Internal name, Address (IP/домен ноды), Port (=NODE_PORT, дефолт2222). НажмитеSelect Config Profile→ выберитеmain→ галочками отметьте нужные inbound-ы. Save. - В карточке ноды блок
Important information: скопируйтеSECRET_KEY(иконка копирования) или нажмитеCopy docker-compose.yml. На сервере ноды поднимите контейнер:
services:
remnanode:
image: remnawave/node:latest
network_mode: host
restart: always
environment:
- NODE_PORT=2222
- SECRET_KEY=КЛЮЧ_ИЗ_ПАНЕЛИ
docker compose up -d → через пару секунд нода станет online. Панель сама зальёт Xray-конфиг на ноду по NODE_PORT, авторизуясь SECRET_KEY.
4. Hosts → создать host. Поля:
- Remark: имя сервера для клиента (напр. 🇳🇱 NL · Reality).
- Inbound: выберите тот же inbound (VLESS_TCP_REALITY). (Один Host = один inbound.)
- Address: домен/IP ноды. Port подтянется из inbound.
- Advanced Options (для Reality критично):
- Security = reality
- SNI = ваш serverNames (тот же домен)
- Public Key = publicKey из сгенерированной пары (не приватный!)
- Short ID = тот же, что в конфиге (или пусто, если там [""])
- Fingerprint = firefox или qq (⛔ не chrome, палевный и на части сборок не даёт ноде стартовать; см. статью «Один хост → тысячи юзеров»)
- Save. (В 2.1.18+ можно явно «link nodes to Hosts», привязать конкретные ноды к хосту.)
5. Internal Squads → Edit (Default-Squad или + новый) → отметьте ваш inbound → Save. ❗ Без этого пользователи inbound не увидят.
6. Users → создать/выбрать юзера → назначить сквад (или на скваде «Add users»). Юзер получает subscription URL, отдаёте клиенту.
Итог-формула доступа: (inbounds в сквадах юзера) ∩ (inbounds, включённые на ноде) ∩ (видимые хосты). Если клиент «не видит сервер», почти всегда забыли шаг 5 (добавить inbound в сквад). Полная установка панели/нод описана в статье «Remnawave с нуля».
Как выглядит создание Host (шаг 4) в панели:
serverName/домен, Отпечаток (Fingerprint): ставьте firefox или qq (⛔ не chrome).Подготовка (общее для всех)
Генерация ключей/идентификаторов (на ноде, где стоит Xray):
xray x25519 # пара ключей Reality (см. ниже, как читать вывод)
xray uuid # UUID клиента (VLESS/Trojan-как-uuid)
openssl rand -hex 8 # shortId для Reality (можно несколько)
⚠️ Как читать вывод
xray x25519(проверено на xray 26.3.27): он печатает две строки:PrivateKey: <…>иPassword (PublicKey): <…>.PrivateKeyидёт в конфиг ноды (privateKey), аPassword (PublicKey)это и есть публичный ключ, его вставляете клиенту / в Host → Public Key. Не пугайтесь слова «Password»: это публичный ключ Reality, а не пароль. Для всего, что на своём сертификате (TLS/Self-steal/Hysteria2/Trojan-TLS):
apt -y install certbot
ufw allow 80/tcp # HTTP-01 валидации нужен открытый :80
certbot certonly --standalone -d your.domain # A-запись домена -> IP ноды
# серты: /etc/letsencrypt/live/your.domain/{fullchain.pem,privkey.pem}
⚠️ Проверено на РФ-хостинге: HTTP-01 валидация LE иногда таймаутит (
Timeout after connect, «server may be slow»), это часто транзиент: просто повторите команду 1–2 раза, обычно со второго раза серт выпускается. Если стабильно не проходит, убедитесь, что домен на сером облаке (DNS only, не Cloudflare-proxy) и:80открыт в ufw, либо используйте DNS-01 (без порта 80).В Remnawave конфиг Xray вы редактируете в Config Profile (панель сама раскатывает его на ноды). Команды
xray x25519/uuidможно выполнить на любой ноде или локально: это просто генераторы.
1. VLESS-TCP-Reality (классический)
Зачем. Базовый стелс без своего домена и сертификата: рукопожатие «крадётся» у чужого реального сайта-донора (TLS 1.3). DPI видит обычный визит на cloudflare.com. Минус. SNI-донор (cloudflare.com; SNI: имя сайта, видное в начале соединения до шифрования) не резолвится в ваш IP: при глубоком анализе это рассинхрон «SNI≠владелец IP». Для жёсткого DPI лучше Self-steal (ниже).
Конфиг-профиль целиком (вставьте в Config Profile, поменяйте только отмеченное ←):
{
"log": { "loglevel": "none" },
"inbounds": [
{
"tag": "vless-reality",
"listen": "0.0.0.0",
"port": 443,
"protocol": "vless",
"settings": { "clients": [], "decryption": "none" },
"sniffing": { "enabled": true, "destOverride": ["http", "tls", "quic"] },
"streamSettings": {
"network": "raw",
"security": "reality",
"realitySettings": {
"show": false,
"target": "www.cloudflare.com:443", // ← донор (чужой TLS1.3-сайт, не за CDN, не ваш)
"xver": 0,
"serverNames": ["www.cloudflare.com"], // ← = домен донора
"privateKey": "PRIVATE_KEY_X25519", // ← privateKey из генератора панели
"shortIds": [""]
}
}
}
],
"outbounds": [
{ "tag": "DIRECT", "protocol": "freedom" },
{ "tag": "BLOCK", "protocol": "blackhole" }
],
"routing": { "rules": [
{ "ip": ["geoip:private"], "outboundTag": "BLOCK" },
{ "domain": ["geosite:private", "geosite:category-ads-all"], "outboundTag": "BLOCK" },
{ "protocol": ["bittorrent"], "outboundTag": "BLOCK" }
]}
}
clients: []не трогайте: Remnawave подставит пользователей из сквадов.flow(vision: добавка к VLESS, маскирует размеры пакетов) задаётся на стороне Host. Донор: чужой домен с TLS 1.3 + HTTP/2, не за CDN, не ваш; ротируйтеserverNamesмежду нодами. Клиенту нужно: UUID, publicKey, shortId, serverName(=донор), flow=vision.
2. VLESS-Selfsteal (Reality «крадёт» ваш собственный сайт)
Зачем. Самый честный Reality: serverName = ваш домен (A-запись на ноду), а dest = локальный сайт-обманка на этой же ноде. Активное прозванивание вашего IP с вашим SNI попадает на настоящий сайт → SNI, IP и контент согласованы. Эталон стелса для РФ/жёсткого DPI.
Нужно: свой домен + реальный сайт-заглушка (nginx/caddy) с валидным сертом, слушающий локально.
Шаг 1: сайт-обманка (nginx на 127.0.0.1:8443, реальный серт вашего домена):
server {
listen 127.0.0.1:8443 ssl http2 proxy_protocol; # proxy_protocol — чтобы видеть реальный IP от Xray
server_name your.domain;
ssl_certificate /etc/letsencrypt/live/your.domain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your.domain/privkey.pem;
ssl_protocols TLSv1.3;
root /var/www/decoy; # положите туда правдоподобный статичный сайт
location / { try_files $uri /index.html; }
}
Шаг 2: конфиг-профиль целиком (Reality смотрит на ваш сайт):
{
"log": { "loglevel": "none" },
"inbounds": [
{
"tag": "vless-selfsteal",
"listen": "0.0.0.0",
"port": 443,
"protocol": "vless",
"settings": { "clients": [], "decryption": "none" },
"sniffing": { "enabled": true, "destOverride": ["http", "tls", "quic"] },
"streamSettings": {
"network": "raw",
"security": "reality",
"realitySettings": {
"show": false,
"target": "127.0.0.1:8443", // локальный сайт-обманка (nginx из Шага 1)
"xver": 1, // PROXY-protocol → реальный IP клиента в nginx
"serverNames": ["your.domain"], // ← ВАШ домен (A-запись на эту ноду)
"privateKey": "PRIVATE_KEY_X25519", // ← privateKey из генератора панели
"shortIds": [""]
}
}
}
],
"outbounds": [
{ "tag": "DIRECT", "protocol": "freedom" },
{ "tag": "BLOCK", "protocol": "blackhole" }
],
"routing": { "rules": [
{ "ip": ["geoip:private"], "outboundTag": "BLOCK" },
{ "domain": ["geosite:private", "geosite:category-ads-all"], "outboundTag": "BLOCK" },
{ "protocol": ["bittorrent"], "outboundTag": "BLOCK" }
]}
}
Проверка стелса: откройте https://your.domain в браузере: должен открыться сайт-обманка (а не ошибка). Значит и DPI увидит то же самое.
3. VLESS-TCP-TLS
Зачем. Честный TLS на вашем домене+серте. Прост, дружит с CDN и fallback-ом на реальный сайт. Минус: TLS-ClientHello с вашим SNI можно резать по списку SNI (Reality тут устойчивее). Нужно: домен + сертификат (certbot).
{
"log": { "loglevel": "none" },
"inbounds": [
{
"tag": "vless-tls",
"listen": "0.0.0.0",
"port": 443,
"protocol": "vless",
"settings": {
"clients": [],
"decryption": "none",
"fallbacks": [{ "dest": "8080" }] // «левый» трафик → реальный сайт/nginx на :8080
},
"sniffing": { "enabled": true, "destOverride": ["http", "tls", "quic"] },
"streamSettings": {
"network": "raw",
"security": "tls",
"tlsSettings": {
"serverName": "your.domain", // ← ваш домен
"minVersion": "1.2",
"alpn": ["h2", "http/1.1"],
"certificates": [
{
"certificateFile": "/etc/letsencrypt/live/your.domain/fullchain.pem", // ← путь к серту
"keyFile": "/etc/letsencrypt/live/your.domain/privkey.pem" // ← путь к ключу
}
]
}
}
}
],
"outbounds": [
{ "tag": "DIRECT", "protocol": "freedom" },
{ "tag": "BLOCK", "protocol": "blackhole" }
],
"routing": { "rules": [
{ "ip": ["geoip:private"], "outboundTag": "BLOCK" },
{ "domain": ["geosite:private", "geosite:category-ads-all"], "outboundTag": "BLOCK" },
{ "protocol": ["bittorrent"], "outboundTag": "BLOCK" }
]}
}
⚠️ Серт для TLS-профилей (этот §3 и далее §4 XHTTP-TLS, Trojan, SS-2022) на ноде Remnawave надо положить ВНУТРЬ контейнера. Путь
certificateFile: /etc/letsencrypt/...Xray резолвит внутри контейнераremnanode, а не на хосте, если файла там нет, нода падает сSPAWN_ERROR: xray(видно вdocker exec remnanode tail /var/log/supervisor/xray.out.log). Выпуск серта + бинд-маунт/opt/certbot/certs:/etc/letsencrypt:roв контейнер (монтировать папку целиком, не толькоlive/) + авто-renew с рестартом ноды: смотрите в разделе про certbot ниже (под профилем Hysteria).
4. VLESS-XHTTP-TLS
Зачем. XHTTP (бывш. SplitHTTP) это современный транспорт поверх HTTP: отлично проходит через CDN (Cloudflare), устойчив, без «вебсокетных» болячек. С честным TLS+доменом. Берут, когда блокируют по IP (прячемся за CDN) и на мобильных.
Нужно: домен + серт (или серт от CDN). Xray ≥ 1.8.16. С XHTTP flow не используется.
{
"log": { "loglevel": "none" },
"inbounds": [
{
"tag": "vless-xhttp-tls",
"listen": "0.0.0.0",
"port": 443,
"protocol": "vless",
"settings": { "clients": [], "decryption": "none" },
"sniffing": { "enabled": true, "destOverride": ["http", "tls", "quic"] },
"streamSettings": {
"network": "xhttp",
"security": "tls",
"xhttpSettings": {
"host": "your.domain", // ← ваш домен
"path": "/xh", // ← секретный путь (тот же у клиента)
"mode": "auto"
},
"tlsSettings": {
"serverName": "your.domain", // ← ваш домен
"alpn": ["h2", "http/1.1"],
"certificates": [
{
"certificateFile": "/etc/letsencrypt/live/your.domain/fullchain.pem", // ← серт
"keyFile": "/etc/letsencrypt/live/your.domain/privkey.pem" // ← ключ
}
]
}
}
}
],
"outbounds": [
{ "tag": "DIRECT", "protocol": "freedom" },
{ "tag": "BLOCK", "protocol": "blackhole" }
],
"routing": { "rules": [
{ "ip": ["geoip:private"], "outboundTag": "BLOCK" },
{ "domain": ["geosite:private", "geosite:category-ads-all"], "outboundTag": "BLOCK" },
{ "protocol": ["bittorrent"], "outboundTag": "BLOCK" }
]}
}
Режимы mode: auto (сам выбирает), packet-up (надёжнее за капризными CDN), stream-up/stream-one (ниже задержка). За Cloudflare включайте проксирование (оранжевое облако) и тот же path.
5. VLESS-XHTTP-Reality
Зачем. Плюсы XHTTP (CDN-дружелюбие, стабильность) + стелс Reality без своего серта (донорский SNI). Нужно: ключи Reality, донор-домен.
{
"log": { "loglevel": "none" },
"inbounds": [
{
"tag": "vless-xhttp-reality",
"listen": "0.0.0.0",
"port": 443,
"protocol": "vless",
"settings": { "clients": [], "decryption": "none" },
"sniffing": { "enabled": true, "destOverride": ["http", "tls", "quic"] },
"streamSettings": {
"network": "xhttp",
"security": "reality",
"xhttpSettings": {
"path": "/xh", // ← секретный путь (тот же у клиента)
"mode": "auto"
},
"realitySettings": {
"show": false,
"target": "www.cloudflare.com:443", // ← донор (чужой TLS1.3-сайт)
"serverNames": ["www.cloudflare.com"], // ← = домен донора
"privateKey": "PRIVATE_KEY_X25519", // ← privateKey из генератора панели
"shortIds": [""]
}
}
}
],
"outbounds": [
{ "tag": "DIRECT", "protocol": "freedom" },
{ "tag": "BLOCK", "protocol": "blackhole" }
],
"routing": { "rules": [
{ "ip": ["geoip:private"], "outboundTag": "BLOCK" },
{ "domain": ["geosite:private", "geosite:category-ads-all"], "outboundTag": "BLOCK" },
{ "protocol": ["bittorrent"], "outboundTag": "BLOCK" }
]}
}
6. VLESS-XHTTP-Selfsteal
Зачем. Максимальный стелс: XHTTP + Reality, где dest = ваш локальный сайт, serverNames = ваш домен (как в п.2, но транспорт XHTTP). Самый устойчивый, но и самый «навороченный», настраивайте, когда базовое уже работает.
Нужно: свой домен + сайт-обманка (nginx как в п.2) + ключи Reality.
{
"log": { "loglevel": "none" },
"inbounds": [
{
"tag": "vless-xhttp-selfsteal",
"listen": "0.0.0.0",
"port": 443,
"protocol": "vless",
"settings": { "clients": [], "decryption": "none" },
"sniffing": { "enabled": true, "destOverride": ["http", "tls", "quic"] },
"streamSettings": {
"network": "xhttp",
"security": "reality",
"xhttpSettings": { "path": "/xh", "mode": "auto" }, // ← секретный путь
"realitySettings": {
"show": false,
"target": "127.0.0.1:8443", // локальный сайт-обманка (nginx, п.2)
"xver": 1,
"serverNames": ["your.domain"], // ← ВАШ домен
"privateKey": "PRIVATE_KEY_X25519", // ← privateKey из генератора панели
"shortIds": [""]
}
}
}
],
"outbounds": [
{ "tag": "DIRECT", "protocol": "freedom" },
{ "tag": "BLOCK", "protocol": "blackhole" }
],
"routing": { "rules": [
{ "ip": ["geoip:private"], "outboundTag": "BLOCK" },
{ "domain": ["geosite:private", "geosite:category-ads-all"], "outboundTag": "BLOCK" },
{ "protocol": ["bittorrent"], "outboundTag": "BLOCK" }
]}
}
7. Hysteria2
Зачем. QUIC/UDP с агрессивным конгешн-контролем (BBR): лучший протокол на потерях/мобильных сетях и там, где режут TCP.
✅ Как это работает в Remnawave (НЕ как в типовых гайдах). В современном Xray-core (26.x) Hysteria2 это обычный inbound
protocol: hysteria(version 2), поэтому в Remnawave его заводят профилем в панели, а НЕ ставят отдельным демономbash <(curl get.hy2.sh)с одним общим паролем в/etc/hysteria/config.yaml. Сclients: []панель сама наполняет пользователей → полноценный per-user: учёт трафика, лимиты, отключение, как у VLESS. Серт получаем Certbot'ом на ноде и пробрасываем в контейнер ноды. Standalone-демон панель не видит и трафик по нему не считает, для коммерческого сервиса не годится.
Нужно: домен (A-запись на ноду), свободный порт 80 (для выпуска серта), открытый UDP/443 (UDP не лимитировать).
1. Certbot в Docker (на ноде)
mkdir -p /opt/certbot && cd /opt/certbot && nano docker-compose.yml
services:
certbot:
container_name: certbot
image: certbot/certbot
network_mode: host
volumes:
- ./certs:/etc/letsencrypt
2. Выпуск сертификата (порт 80 должен быть свободен)
--standalone сам поднимет временный веб-сервер на :80 для проверки домена. Замените домен и e-mail на свои:
docker run --rm \
-v $(pwd)/certs:/etc/letsencrypt \
-v $(pwd)/var-lib-letsencrypt:/var/lib/letsencrypt \
--network host \
certbot/certbot certonly --standalone \
--non-interactive --agree-tos \
--email you@example.com \
-d your.domain
Серт ляжет в
/opt/certbot/certs/live/your.domain/. Если :80 занят (nginx/caddy селфстила), временно остановите его на время выпуска.
3. Проброс сертификатов в контейнер ноды
Монтируем всю папку /etc/letsencrypt (не только live/, иначе сломаются симлинки на archive/ и Xray не прочитает серт):
cd /opt/remnanode/ && nano docker-compose.yml
services:
remnanode:
# ...
volumes:
- '/opt/certbot/certs:/etc/letsencrypt:ro' # :ro — только чтение
cd /opt/remnanode && docker compose down && docker compose up -d
ufw allow 443/udp # Hysteria2 — это UDP; провайдер/файрвол не должны его резать
4. Config Profile в панели (вставляется целиком)
Пути указывают на внутренние папки контейнера, которые мы пробросили выше. Замените your.domain; clients: [] оставьте: панель наполнит пользователей сама:
{
"log": { "loglevel": "none" },
"inbounds": [
{
"tag": "HYSTERIA-BBR",
"listen": "0.0.0.0",
"port": 443,
"protocol": "hysteria",
"settings": { "clients": [], "version": 2 },
"streamSettings": {
"network": "hysteria",
"security": "tls",
"tlsSettings": {
"alpn": ["h3"],
"certificates": [
{ "certificateFile": "/etc/letsencrypt/live/your.domain/fullchain.pem",
"keyFile": "/etc/letsencrypt/live/your.domain/privkey.pem" }
]
},
"hysteriaSettings": { "version": 2 }
}
}
],
"outbounds": [
{ "tag": "DIRECT", "protocol": "freedom" },
{ "tag": "BLOCK", "protocol": "blackhole" }
],
"routing": { "rules": [
{ "ip": ["geoip:private"], "outboundTag": "BLOCK" },
{ "domain": ["geosite:private"], "outboundTag": "BLOCK" },
{ "protocol": ["bittorrent"], "outboundTag": "BLOCK" }
]}
}
Дальше как обычно: включить инбаунд на ноде → создать Host (Remark «🇫🇮 FIN · Hysteria2», Address = домен ноды) → добавить инбаунд в нужные сквады. Клиент получит hysteria2://-ссылку в подписке.
⚠️ Чтобы Hysteria2 показалась в Happ, отдавайте подписку как JSON. Happ (и ряд других клиентов) видит Hysteria2 только из JSON-подписки. Если подписка отдаётся «обычным» текстом, Hysteria2 в приложении просто не появится (VLESS будет, а Hysteria нет). Включите в панели: Настройки подписки → Доп. опции → «Использовать JSON в базовой подписке» (①) и сохраните.
5. Автообновление серта (cron)
Серты Let's Encrypt живут 90 дней. Обновляем раз в месяц (28-го) и перезапускаем ноду, чтобы Xray подхватил новый файл (crontab -e):
0 0 28 * * cd /opt/certbot && docker compose run --rm certbot renew && cd /opt/remnanode && docker compose restart
Рестарт ноды после
renewобязателен: без него Hysteria продолжит отдавать старый серт до перезапуска.renewреально перевыпускает, только когда до конца серта < 30 дней, иначе ничего не делает (так что ежемесячный запуск безопасен).
Чтобы Remnawave видел онлайн и считал трафик Hysteria, обновите Xray-ядро ноды
⚠️ Баг ядра: на Xray-core 26.3.27 Remnawave не видит Hysteria-юзера онлайн и не считает ему трафик. В свежих сборках это поправлено, проверено на 26.5.9 (и новее). Лечится подменой Xray-ядра на ноде: монтируем свежий бинарь поверх штатного в контейнер remnanode.
# 1) каталог под кастомное ядро
mkdir -p /opt/remnanode/custom-xray && cd /opt/remnanode/custom-xray
# 2) скачать свежий Xray (актуальную версию см. в релизах XTLS/Xray-core)
wget https://github.com/XTLS/Xray-core/releases/download/v26.5.9/Xray-linux-64.zip
# 3) распаковать (unzip поставить, если нет) → появится бинарь ./xray
apt update && apt install -y unzip
unzip -o Xray-linux-64.zip
В docker-compose.yml ноды (/opt/remnanode/docker-compose.yml), в volumes: сервиса remnanode, добавьте монтирование бинаря поверх штатного:
volumes:
- '/opt/remnanode/custom-xray/xray:/usr/local/bin/xray:ro'
Пересоздать ноду и проверить версию:
cd /opt/remnanode && docker compose down && docker compose up -d && docker compose logs -f -t
docker exec -it remnanode xray version # должно показать 26.5.9 (или новее)
Откат «как было»: удалите эту строку из
volumesи пересоздайте ноду (docker compose down && docker compose up -d). Подмена бинаря это общий приём: так же накатывают любой свежий/патченый Xray на ноду, не дожидаясь обновления образаremnawave/node.
8. Trojan
Зачем. Прикидывается обычным HTTPS-сайтом: без пароля отдаёт реальный сайт (fallback), проксирует только своих. Хороший «другой протокол» в резерв, если VLESS-паттерн начнут фингерпринтить.
⚠️ Проверено на xray 26.3.27: Trojan работает (тест с РФ-сервера прошёл, HTTP 200), но ядро при старте пишет
The feature Trojan (with no Flow) is deprecated… migrate to VLESS with Flow & Seed. Держите Trojan только как резерв, основным делайте VLESS+Reality. Нужно: домен + серт ИЛИ поверх Reality (без своего серта).
Trojan + TLS (свой домен + fallback на сайт):
{
"log": { "loglevel": "none" },
"inbounds": [
{
"tag": "trojan-tls",
"listen": "0.0.0.0",
"port": 443,
"protocol": "trojan",
"settings": {
"clients": [],
"fallbacks": [{ "dest": "8080" }] // без пароля → реальный сайт на :8080
},
"sniffing": { "enabled": true, "destOverride": ["http", "tls", "quic"] },
"streamSettings": {
"network": "raw",
"security": "tls",
"tlsSettings": {
"serverName": "your.domain", // ← ваш домен
"certificates": [
{
"certificateFile": "/etc/letsencrypt/live/your.domain/fullchain.pem", // ← серт
"keyFile": "/etc/letsencrypt/live/your.domain/privkey.pem" // ← ключ
}
]
}
}
}
],
"outbounds": [
{ "tag": "DIRECT", "protocol": "freedom" },
{ "tag": "BLOCK", "protocol": "blackhole" }
],
"routing": { "rules": [
{ "ip": ["geoip:private"], "outboundTag": "BLOCK" },
{ "domain": ["geosite:private", "geosite:category-ads-all"], "outboundTag": "BLOCK" },
{ "protocol": ["bittorrent"], "outboundTag": "BLOCK" }
]}
}
clients: []заполнит панель. При raw-Xray впишите пароли вручную:[{ "password": "СИЛЬНЫЙ_ПАРОЛЬ" }]. Trojan + Reality (без своего серта):
{
"log": { "loglevel": "none" },
"inbounds": [
{
"tag": "trojan-reality",
"listen": "0.0.0.0",
"port": 443,
"protocol": "trojan",
"settings": { "clients": [] },
"sniffing": { "enabled": true, "destOverride": ["http", "tls", "quic"] },
"streamSettings": {
"network": "raw",
"security": "reality",
"realitySettings": {
"show": false,
"target": "www.cloudflare.com:443", // ← донор (чужой TLS1.3-сайт)
"serverNames": ["www.cloudflare.com"], // ← = домен донора
"privateKey": "PRIVATE_KEY_X25519", // ← privateKey из генератора панели
"shortIds": [""]
}
}
}
],
"outbounds": [
{ "tag": "DIRECT", "protocol": "freedom" },
{ "tag": "BLOCK", "protocol": "blackhole" }
],
"routing": { "rules": [
{ "ip": ["geoip:private"], "outboundTag": "BLOCK" },
{ "domain": ["geosite:private", "geosite:category-ads-all"], "outboundTag": "BLOCK" },
{ "protocol": ["bittorrent"], "outboundTag": "BLOCK" }
]}
}
9. Shadowsocks-2022
Зачем. Лёгкий AEAD-протокол без TLS-рукопожатия: запасной канал и для слабых устройств/IoT. Минус: нет TLS-маскировки → под жёстким DPI заметнее; держите как дополнение, не как основной для РФ. Нужно: ничего лишнего (домен/серт не нужны).
{
"log": { "loglevel": "none" },
"inbounds": [
{
"tag": "ss2022",
"listen": "0.0.0.0",
"port": 8388,
"protocol": "shadowsocks",
"settings": {
"method": "2022-blake3-aes-128-gcm",
"password": "BASE64_16BYTE_KEY", // ← openssl rand -base64 16
"network": "tcp,udp"
}
}
],
"outbounds": [
{ "tag": "DIRECT", "protocol": "freedom" },
{ "tag": "BLOCK", "protocol": "blackhole" }
],
"routing": { "rules": [
{ "ip": ["geoip:private"], "outboundTag": "BLOCK" },
{ "domain": ["geosite:private", "geosite:category-ads-all"], "outboundTag": "BLOCK" },
{ "protocol": ["bittorrent"], "outboundTag": "BLOCK" }
]}
}
Ключ: openssl rand -base64 16. Для ...aes-256-gcm используйте openssl rand -base64 32.
⚠️ Проверено на xray 26.3.27: SS-2022 работает (тест прошёл, HTTP 200), но ядро пишет
Shadowsocks … is deprecated … migrate to VLESS Encryption. Это нормально для запасного канала, но основным не делайте: приоритет VLESS+Reality.
10. WARP native (Cloudflare WireGuard): это outbound
Зачем. Не способ подключения клиента, а исходящий маршрут. Выпускает выбранный трафик через Cloudflare WARP (WireGuard): - разблокирует сервисы, режущие IP дата-центров (ChatGPT/OpenAI, Spotify, Netflix-гео и т.п.); - даёт «чистый» egress и рабочий IPv6 на ноде без него; - санкционка/гео: выводим только нужные домены, остальное напрямую.
Шаг 1: получить ключи WARP (wgcf):
# берём АКТУАЛЬНУЮ версию (URL с хардкодом версии часто отдаёт 404)
VER=$(curl -fsSL -o /dev/null -w '%{url_effective}' https://github.com/ViRb3/wgcf/releases/latest); VER=${VER##*/v}
wget -O /usr/bin/wgcf "https://github.com/ViRb3/wgcf/releases/download/v${VER}/wgcf_${VER}_linux_amd64"
chmod +x /usr/bin/wgcf
wgcf register --accept-tos # создаёт wgcf-account.toml
wgcf generate # создаёт wgcf-profile.conf (PrivateKey, Address v4/v6)
⚠️ Проверено на живом сервере: не пишите версию руками (
wgcf_2.2.22…): на дату теста актуальна v2.2.31, а старый URLlatest/download/wgcf_2.2.22…отдаёт 404 (скачивается пустой файл →Permission denied). Команда выше подставляет реальную версию сама. Шаг 2: конфиг-профиль целиком (Reality-inbound + WARP-outbound + роутинг):
{
"log": { "loglevel": "none" },
"inbounds": [
{
"tag": "vless-reality",
"listen": "0.0.0.0",
"port": 443,
"protocol": "vless",
"settings": { "clients": [], "decryption": "none" },
"sniffing": { "enabled": true, "destOverride": ["http", "tls", "quic"] },
"streamSettings": {
"network": "raw",
"security": "reality",
"realitySettings": {
"show": false,
"target": "www.cloudflare.com:443", // ← донор
"serverNames": ["www.cloudflare.com"], // ← = домен донора
"privateKey": "PRIVATE_KEY_X25519", // ← privateKey из генератора панели
"shortIds": [""]
}
}
}
],
"outbounds": [
{ "tag": "DIRECT", "protocol": "freedom" },
{ "tag": "BLOCK", "protocol": "blackhole" },
{
"tag": "warp",
"protocol": "wireguard",
"settings": {
"secretKey": "PRIVATE_KEY_из_wgcf-profile", // ← из wgcf-profile.conf
"address": ["172.16.0.2/32", "2606:4700:110:XXXX/128"], // ← из wgcf-profile.conf
"peers": [
{
"publicKey": "bmXOC+F1FxEMF9dyiK2H5/1SUtzH0JuVo51h2wPfgyo=", // публичный ключ Cloudflare WARP
"endpoint": "162.159.192.1:2408" // ← ЯВНЫЙ IPv4! (engage.cloudflareclient.com резолвится в IPv6)
}
],
"mtu": 1280,
"reserved": [0, 0, 0], // ← 3 байта из client_id (WARP reserved calculator)
"noKernelTun": true // ← ОБЯЗАТЕЛЬНО на Remnawave-ноде (Xray в Docker): без неё kernel-TUN падает на read-only /proc/sys
}
}
],
"routing": { "rules": [
{ "ip": ["geoip:private"], "outboundTag": "BLOCK" },
{ "domain": ["geosite:private", "geosite:category-ads-all"], "outboundTag": "BLOCK" },
{ "protocol": ["bittorrent"], "outboundTag": "BLOCK" },
{ "domain": ["geosite:openai", "domain:spotify.com", "geosite:netflix"], "outboundTag": "warp" } // ← что гнать через WARP
]}
}
✅ Проверено на живом сервере (xray 26.3.27): с IPv4-эндпоинтом и
reserved: [0,0,0]WARP поднялся: egress стал IP Cloudflare (104.28.x), а не сервера. Если у ноды нет IPv6, обязательно явный IPv4-эндпоинт (engage.cloudflareclient.comуводит в v6 →network is unreachable).reservedне лежит вwgcf-profile.confнапрямую: это 3 байта изclient_idаккаунта (конвертер wgcf→Xray/«WARP reserved calculator»).[0,0,0]часто работает; для «капризных» свежих эндпоинтов вычислите корректныйreserved. ⚠️"noKernelTun": trueобязателен на ноде Remnawave. Xray там работает в Docker, где/proc/sysтолько для чтения, а свежий Xray по умолчанию поднимает WireGuard через kernel-TUN и падает:failed to disable ipv4 rp_filter … read-only file system→ весьwarp-аутбаунд мёртв. Строка возвращает userspace-стек (gVisor). На standalone-бинаре xray (как в QA выше,/opt/qa)/proc/sysписаемый, поэтому там WARP поднимался и без неё, в контейнере поведение другое. WARP+ (Plus): если есть ключ-лицензия,wgcf update --license-key ВАШ_КЛЮЧподнимет лимиты/скорость.
В Remnawave WARP добавляется в Config Profile как outbound + правило в routing, не как Host. Затем любой ваш inbound может выпускать выбранные домены через него.
Как это собрать в Remnawave (резюме)
- Config Profile → вставляете нужные
inbounds(из блоков выше) + при желанииoutbounds(WARP)/routing. - Inbound → панель видит каждый
tagкак отдельный inbound. - Host → создаёте на каждый inbound: адрес (ваш домен/IP), порт, SNI/serverName, путь (для XHTTP), publicKey/shortId (для Reality).
- Squad (= тариф) → включаете нужные хосты; клиент получает подписку с несколькими конфигами и авто-фейловером.
Связано: «Протоколы и обфускация» (базовый разбор протоколов), «Хосты: несколько нод и транспортов» (раздача одного/нескольких транспортов с нод), «Каскад (multihop)» (склейка нод цепочкой).
Если инбаунд поднялся, но клиент его не видит
Готовый профиль ещё не гарантия, что протокол доедет до приложения. Между конфигом и клиентом пять мест, где он теряется: инбаунд не включён у ноды, порт закрыт файрволом, транспорт назван raw вместо tcp (ядро понимает, а генератор подписки нет), хост не попал в шаблон подписки, либо плитку перехватывает балансировщик автовыбора.
Порядок диагностики с командами: в статье Протокол поднялся, а клиент его не видит.