TURN

Обновлено 29 апреля 2020

TURN

Введение

TURN (Traversal Using Relay NAT) — это протокол, который позволяет узлу за NAT или брандмауэром получать входящие данные через TCP или UDP соединения. Такая возможность особенно актуальна для узлов позади симметричных NAT, или брандмауэров, которые собираются стать принимающей стороной в соединении с одним конкретным узлом (peer-ом).

Взаимодействие между двумя пользователями приложения WebRTC с участием серверов STUN и TURN.

TURN сервер – это улучшенный STUN сервер, поэтому любой TURN сервер может работать и как STUN сервер. STUN (Session Traversal Utilities for NAT) — это сетевой протокол, который позволяет клиенту, находящемуся за сервером трансляции адресов (или за несколькими такими серверами), определить свой внешний IP-адрес, способ трансляции адреса и порты во внешней сети, связанный с определённым внутренним номером порта. Эта информация используется для установления соединения UDP между двумя хостами в случае, если они оба находятся за маршрутизатором NAT.

TURN сервер используется в крайнем случае, как посредник (relay), превращая p2p в клиент-сервер-клиентную связь, там где прямая связь невозможна. WebRTC успешно справляется с такими проблемами, используя протокол ICE, который, правда, требует использования дополнительных серверов (STUN, TURN). WebRTC – технология, ориентированная на браузеры, которая позволяет соединить два клиента для видео-передачи данных. Основные особенности – внутренняя поддержка браузерами и способность соединять клиентов без использования дополнительных серверов – соединение peer-to-peer (p2p).

Установка соединения p2p – довольно трудная задача, так как компьютеры не всегда обладают публичными IP адресами. Из-за небольшого количества IPv4 адресов (а также в некоторых целях безопасности) был разработан механизм NAT (Network Address Translation), который позволяет создавать приватные сети, например, для частного использования. Многие домашние роутеры сейчас поддерживают NAT и благодаря этому все домашние устройства имеют выход в интернет, хотя провайдеры интернета обычно предоставляют один IP адрес. Публичные IP адреса - уникальны в интернете, а приватные нет. Именно поэтому установка соединения p2p явяется не простой задачаей.

Подготовка LXC контейнера

Мы рекомендуем выполнить установку TURN сервера в отдельном контейнере, настроив его согласно инструкции.

Установка TURN сервера

Установить TURN сервер coturn:

emerge -a net-im/coturn

Получение сертификата Let's Encrypt

Получите сертификат домена turn.example.org согласно руководству.

Настройка TURN сервера

Скопируйте настройки по умолчанию:

cp /etc/turnserver.conf.default /etc/turnserver.conf

Сгенерируйте закрытый ключ:

openssl rand -hex 16

4b85833c7fdf06130bd7398ac9af558b

Выполните настройку TURN сервера, указав 443 в качестве SSL порта, внешний IP адрес 1.2.3.4, механизмы авторизаии и ключ 4b85833c7fdf06130bd7398ac9af558b, а также сертификат и ключ для turn.example.org, и параметры SSL соединения:

/etc/turnserver.conf
# TURN listener port for TLS (Default: 5349).
# Note: actually, "plain" TCP & UDP sessions can connect to the TLS & DTLS
# port(s), too - if allowed by configuration. The TURN server 
# "automatically" recognizes the type of traffic. Actually, two listening
# endpoints (the "plain" one and the "tls" one) are equivalent in terms of
# functionality; but we keep both endpoints to satisfy the RFC 5766 specs.
# For secure TCP connections, we currently support SSL version 3 and 
# TLS version 1.0, 1.1 and 1.2.
# For secure UDP connections, we support DTLS version 1.
#
tls-listening-port=443

# If the server is behind NAT, you need to specify the external IP address.
# If there is only one external address, specify it like this:
external-ip=1.2.3.4
# If you have multiple external addresses, you have to specify which
# internal address each corresponds to, like this. The first address is the
# external ip, and the second address is the corresponding internal IP.
#external-ip=172.17.19.131/10.0.0.11
#external-ip=172.17.18.132/10.0.0.12

# Fingerprints in TURN messages are required for WebRTC
fingerprint

# The long-term credential mechanism is required for WebRTC
lt-cred-mech

# Configure coturn to use the "TURN REST API" method for validating time-
# limited credentials. BigBlueButton will generate credentials in this
# format. Note that the static-auth-secret value specified here must match
# the configuration in BigBlueButton's turn-stun-servers.xml
# You can generate a new random value by running the command:
#   openssl rand -hex 16
use-auth-secret
static-auth-secret=4b85833c7fdf06130bd7398ac9af558b

# If the realm value is unspecified, it defaults to the TURN server hostname.
# You probably want to configure it to a domain name that you control to
# improve log output. There is no functional impact.
realm=example.com

# Configure TLS support.
# Adjust these paths to match the locations of your certificate files
cert=/etc/letsencrypt/live/turn.example.org/fullchain.pem
pkey=/etc/letsencrypt/live/turn.example.org/privkey.pem
# Limit the allowed ciphers to improve security
# Based on https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
cipher-list="ECDH+AESGCM:ECDH+CHACHA20:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS"

# Enable longer DH TLS key to improve security
dh2066

# All WebRTC-compatible web browsers support TLS 1.2 or later, so disable
# older protocols
no-tlsv1
no-tlsv1_1
#no-tlsv1_2

Важно

Вместо порта 443 можно использовать любой другой порт. 443 порт используется для обхода некоторых строгих NAT.

Запустите TURN сервер:

/etc/init.d/turnserver start

Добавьте TURN сервер в автозагрузку:

rc-update add turnserver