← К библиотеке
Протоколы Практика

VLESS + TLS: базовый рабочий конфиг

Иногда нужен не стелс, а честный TLS на своём домене — под CDN или туда, где важна совместимость, а не маскировка под чужой сайт. Ниже — рабочий конфиг, выпуск сертификата и честный разговор о том, где этот вариант палится. Впиши домен и email в конструктор сверху, остальное копируй.

Зачем вообще честный TLS, если есть Reality

Скажу сразу, без иллюзий: как РФ-стелс это слабее Reality. Твой SNI виден в открытом виде, и его можно резать по списку доменов. Reality тут устойчивее, и если нода живёт под жёстким DPI — бери его.

Но у честного TLS есть своя ниша, ради которой я его держу. Он дружит с CDN — за Cloudflare и подобными фронтами нужен именно настоящий сертификат на твоём домене, донорский Reality туда не заедет. Он умеет fallback на реальный сайт: тот, кто ткнулся без правильного клиента, попадает на нормальную страницу, а не на пустоту. И он банально простой — ни ключей x25519, ни shortId, ни донора. Берут его ради совместимости, не ради маскировки.

Шаг 1 — выпускаем сертификат

Домен должен указывать A-записью на IP ноды. Порт 80 на время выпуска — свободен (HTTP-01 валидация Let's Encrypt стучится туда).

bash
apt -y install certbot
certbot certonly --standalone -d your-domain.com -m admin@your-domain.com --agree-tos --non-interactive

Серт ляжет в /etc/letsencrypt/live/your-domain.com/ — там fullchain.pem и privkey.pem, они и пойдут в конфиг.

Грабли из практики: на РФ-хостинге HTTP-01 иногда таймаутит («Timeout after connect»). Это часто транзиент — просто повтори команду один-два раза, обычно со второго проходит. Если стабильно не идёт — проверь, что домен на «сером облаке» (DNS only, не под Cloudflare-прокси) и :80 открыт в файрволе, либо переходи на DNS-01 без 80-го порта.

Шаг 2 — конфиг-профиль целиком

Это полный профиль Xray для панели: log / inbounds / outbounds / routing. Вставляй целиком, значения подставит конструктор:

config.json
{
  "log": { "loglevel": "none" },
  "inbounds": [
    {
      "tag": "vless-tls",
      "listen": "0.0.0.0",
      "port": 443,
      "protocol": "vless",
      "settings": {
        "clients": [],
        "decryption": "none",
        "fallbacks": [{ "dest": "8080" }]
      },
      "sniffing": { "enabled": true, "destOverride": ["http", "tls", "quic"] },
      "streamSettings": {
        "network": "raw",
        "security": "tls",
        "tlsSettings": {
          "serverName": "your-domain.com",
          "minVersion": "1.2",
          "alpn": ["h2", "http/1.1"],
          "certificates": [
            {
              "certificateFile": "/etc/letsencrypt/live/your-domain.com/fullchain.pem",
              "keyFile": "/etc/letsencrypt/live/your-domain.com/privkey.pem"
            }
          ]
        }
      }
    }
  ],
  "outbounds": [
    { "tag": "DIRECT", "protocol": "freedom" },
    { "tag": "BLOCK",  "protocol": "blackhole" }
  ],
  "routing": { "rules": [
    { "ip": ["geoip:private"], "outboundTag": "BLOCK" },
    { "domain": ["geosite:category-ads-all"], "outboundTag": "BLOCK" },
    { "protocol": ["bittorrent"], "outboundTag": "BLOCK" }
  ]}
}

Разбор ключевого:

  • network: raw — это TCP (в новых сборках Xray транспорт называется raw, старое имя tcp тоже валидно).
  • clients: [] не трогай — панель сама наполнит пользователей из сквадов.
  • fallbacks → dest 8080 — весь «левый» трафик без правильного клиента уйдёт на реальный сайт или nginx, слушающий :8080. Ткнёшься браузером — увидишь нормальную страницу, а не «что-то на 443». Держи там правдоподобный сайт.
  • alpn: ["h2", "http/1.1"] — согласуй с тем, что отдаёт CDN, если ставишь за фронтом.
  • routing режет приватные сети, рекламу и торренты — последнее обязательно, иначе прилетит abuse от хостера.

Шаг 3 — параметры на Host

Сам конфиг клиентов не содержит — их даёт панель. Параметры подключения задаются на хосте:

Host
Address      : your-domain.com
Port         : 443
SNI / Host   : your-domain.com
ALPN         : h2, http/1.1
flow         : (пусто)
fingerprint  : firefox

Обрати внимание: flow пустой. Vision — это фишка Reality-TCP, тут его нет. И fingerprint ставь firefox, а не chrome — chrome палевный и местами роняет ноду.

Грабли, о которых лучше знать заранее

  • SNI виден. Твой домен светится в ClientHello открытым текстом. Под жёстким РФ-DPI его могут резать по списку. Начали резать — уходи на Reality/Selfsteal, это ровно та проблема, которую Reality решает.
  • Серт живёт 90 дней. Поставь certbot renew в cron и обязательно перезапускай ноду после обновления — иначе Xray продолжит отдавать старый серт из памяти, и клиенты отвалятся молча.
  • За CDN чаще берут не это. Честный TLS ложится за CDN, но для фронтинга обычно удобнее XHTTP — он спроектирован под HTTP-транспорт и капризные CDN. Об этом — в статьях про XHTTP.

Механику того, почему открытый SNI — это уязвимость, и как Reality её обходит, я разбирал в теории про Reality. Тут — рабочий минимум для случая, когда нужен именно честный TLS.

Следующий гайд XHTTP-транспорт: когда и зачем → Не понравилась статья или что-то непонятно? Напишите мне — помогу или поправлю. @notrealvpn →
Материал носит образовательный характер и посвящён инженерии сетевой инфраструктуры. Вы отвечаете за соблюдение законов своей юрисдикции.