Asmy
Управление

TCP с TLS

Как открыть TURN или другой TCP-сервис через общий порт 443 с сертификатом Caddy.

Режим «Защищённый TCP (TLS)» нужен для сервисов, которые используют TLS, но не говорят по HTTP. Например, встроенный TURN-сервер LiveKit принимает подключения браузера по TURN/TLS. Обычный HTTPS reverse proxy такой протокол не передаст.

HTTPS — это HTTP внутри TLS. Здесь Caddy завершает TLS и передаёт приложению исходный поток TCP без HTTP-обработки. Создавать, изменять и удалять такие домены может только администратор всего Asmy.

Как устроено подключение

Клиент подключается к turn.example.com:443 и передаёт имя домена через TLS SNI. Caddy выбирает нужный маршрут по этому имени, использует сертификат домена и соединяется с внутренним портом приложения в сети server.

Обычные HTTPS-сайты продолжают использовать тот же внешний TCP-порт 443. Дополнительный публичный порт для этого маршрута не требуется. Режим рассчитан на TLS с самого начала соединения и SNI; он не предназначен для STARTTLS, произвольного TCP без TLS или UDP.

Настройка домена

  1. Подключите контейнер приложения к общей Docker-сети server. Он должен слушать интерфейс контейнера, доступный из Caddy.
  2. Настройте DNS имени turn.example.com на сервер. Проверьте A и AAAA, если обе записи существуют.
  3. Откройте проект → «Домены» → добавление домена.
  4. Выберите «Защищённый TCP (TLS)». Введите имя домена без протокола, пути и порта.
  5. Укажите Alias контейнера или сервиса и внутренний порт, например livekit:5349.
  6. Сохраните и примените конфигурацию.

Не используйте это же имя одновременно для сайта, другого маршрута или ручного блока. Caddy управляет сертификатом автоматически: публичные DNS и доступные извне TCP-порты 80/443 должны позволять проверку домена центром сертификации. Отдельный HTTP-сайт под TURN-доменом создавать не нужно.

Внутри сети server Caddy передаёт незашифрованный TCP. Upstream должен ожидать именно его; не направляйте маршрут на порт, где приложение самостоятельно ждёт TLS. Не публикуйте этот внутренний порт через ports без самостоятельной необходимости: это создаст путь в обход Caddy.

Настройки www, HTTP-заголовков, Basic Auth, WebSocket и тестовых поддоменов в этом режиме недоступны: они относятся к HTTP. Asmy не создаёт сам TURN-сервер, пользователей или правила доступа к приложению.

На иллюстрации — локальный пример с включённой передачей IP. Для рабочего подключения подставьте свой публичный домен и Alias приложения.

Передача IP клиента

«Передавать IP клиента» выключено по умолчанию. При включении Caddy добавляет к потоку заголовок PROXY protocol v2. Это не HTTP-заголовок X-Forwarded-For.

Включайте настройку только если upstream поддерживает PROXY protocol и настроен принимать его от Caddy. Иначе соединение не заработает. На стороне upstream ограничьте доверенные адреса реальной сетью или адресами Caddy; не доверяйте PROXY-заголовкам из любых источников.

Пример: встроенный TURN LiveKit

Для LiveKit 1.13.10 соответствующая часть конфигурации выглядит так:

turn:
  enabled: true
  domain: turn.example.com
  tls_port: 5349
  external_tls: true
  proxy_protocol: true
  proxy_protocol_trusted_cidrs:
    - 172.28.0.0/24

Здесь 172.28.0.0/24 — пример, а не универсальное значение. Подставьте фактическую доверенную подсеть подключения Caddy, проверив docker network inspect server и адрес, с которого LiveKit принимает соединение. Остальная конфигурация LiveKit — ключи, доступ к комнатам, node IP, media-порты и ограничения relay — настраивается отдельно владельцем приложения.

В Asmy задайте turn.example.com, Alias livekit, порт 5349 и включите передачу IP. external_tls: true означает, что TLS завершается в Caddy: экспортировать сертификат и приватный ключ в LiveKit не нужно. Если передача IP не нужна, выключите её с обеих сторон и уберите параметры PROXY protocol из примера.

В этой версии LiveKit объявляет клиенту внешний TURN/TLS-порт 443 при external_tls; tls_port: 5349 задаёт внутренний listener. Не используйте его как ожидаемый внешний порт. При другой версии проверьте соответствующие настройки LiveKit и реализацию TURN.

Проверка и ограничения

Проверьте сертификат снаружи по нужному имени и работу самого протокола, а не только открытый порт. Для TURN нужен успешный relay трафика. Страница в браузере под TURN-доменом не является проверкой: этот маршрут не обслуживает HTTP.

При проблеме начните с логов Caddy, DNS, сети, внутреннего порта и согласованности PROXY protocol. Успешное применение конфигурации подтверждает запуск Caddy, но не готовность upstream и не завершение выдачи сертификата. Пересоздание Caddy при применении может оборвать текущие соединения. Обычное автоматическое продление сертификата не требует перезапуска LiveKit.

Copyright © 2026