Схема сетевого взаимодействия:

Настройка работы Р7-Команда за NAT (reverse proxy + stun/turn)

Внесение записей в глобальный DNS:

1) Перед инсталляцией рекомендуется внести необходимые записи в глобальный dns, для возможности работы приложения, после всех указанных ниже действий. Необходимо задать три А записи: Для названия сервера управления, для медиа сервера и Coturn сервера. Пример записей ниже: Настройка работы Р7-Команда за NAT (reverse proxy + stun/turn)

На сервере с ролями reverse proxy и stun/turn:

Установка производилась на ОС Debian 11. Предполагается что на данном сервере имеется сетевой адаптер с прямым белым ip адресом, а также второй сетевой интерфейс с доступом в корпоративную сеть. Либо имеется один сетевой интерфейс без белого ip адреса и используется Port forwarding для такого сервера. 2) Установите Nginx и Coturn TURN если они еще не установлены:
apt install nginx coturn -y
3) Запустите службу nginx и добавьте её в автозагрузку:
systemctl enable --now nginx
4) Создайте файл для сервера управления /etc/nginx/conf.d/team_proxy.conf со следующим содержимым:
map $http_host $this_host {
"" $host;
default $http_host;
}
map $http_x_forwarded_proto $the_scheme {
default $http_x_forwarded_proto;
"" $scheme;
}
map $http_x_forwarded_host $the_host {
default $http_x_forwarded_host;
"" $this_host;
}
map $http_upgrade $proxy_connection {
default upgrade;
"" close;
}
server {
listen 80;
server_name {DNS_NAME_TEAM} ;
server_tokens off;
## Redirects all traffic to the HTTPS host
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name {DNS_NAME_TEAM};
ssl_certificate {PATH_TO_CERTIFICATE};
ssl_certificate_key {PATH_TO_KEY};
ssl_session_timeout 24h;
ssl_session_cache shared:SSL:16m;
ssl_session_tickets on;
ssl_prefer_server_ciphers on;
ssl_ciphers AES256+EECDH:AES256+EDH:!aNULL;
add_header Strict-Transport-Security "max-age=31536000;";
location / {
proxy_pass https://{IP_SERVER_TEAM};
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $proxy_connection;
proxy_set_header X-Forwarded-Host $the_host;
proxy_set_header X-Forwarded-Proto $the_scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Где,
  • {PATH_TO_CERTIFICATE} — полный путь до ssl сертификата (для домена team.domain.ru). для защищённого соединения HTTPS, например /etc/ssl/fullchain.pem;
  • {PATH_TO_KEY} — полный путь до ключа от сертификата, например /etc/ssl/privkey.pem;
  • {IP_SERVER_TEAM} — приватный ip адрес сервера, где установлен сервер управления команд, например, 192.168.1.12;
  • {DNS_NAME_TEAM} — dns имя для сервера управления, которое Вы прописали, например, team.domain.ru
5) Создайте файл для медиа сервера /etc/nginx/conf.d/media_proxy.conf со следующим содержимым:
server {
listen 80;
listen 443 ssl http2;
server_name {IP_SERVER_MEDIA};
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 32 16k;
gzip_min_length 256;
gzip_types application/atom+xml
application/geo+json
application/javascript
application/x-javascript
application/json
application/ld+json
application/manifest+json
application/rdf+xml
application/rss+xml
application/xhtml+xml
application/xml
font/eot
font/otf
font/ttf
image/svg+xml
text/css
text/javascript
text/plain
text/xml;
proxy_next_upstream error timeout http_502 http_503 http_504 http_429 ;
if ($scheme = http) {
return 301 https://$server_name$request_uri;
}
ssl_session_timeout 24h;
ssl_session_cache shared:SSL:16m;
ssl_session_tickets on;
ssl_prefer_server_ciphers on;
ssl_ciphers AES256+EECDH:AES256+EDH:!aNULL;
add_header Strict-Transport-Security "max-age=31536000;";
ssl_certificate {PATH_TO_CERTIFICATE};
ssl_certificate_key {PATH_TO_KEY};
location / {
proxy_pass_request_headers on;
proxy_pass_request_body on;
proxy_set_header Host $host;
proxy_pass https://{IP_SERVER_MEDIA};
proxy_http_version 1.1;
proxy_pass_header Set-Cookie;
proxy_pass_header P3P;
real_ip_header X-Forwarded-For;
}
}
Где,
  • {PATH_TO_CERTIFICATE} — полный путь до ssl сертификата (для домена media.domain.ru). для защищённого соединения HTTPS, например /etc/ssl/fullchain.pem;
  • {PATH_TO_KEY} — полный путь до ключа от сертификата, например /etc/ssl/privkey.pem;
  • {IP_SERVER_MEDIA} — приватный ip адрес сервера, где установлен медиа сервер команд, например, 192.168.1.11;
  • {DNS_NAME_MEDIA} — dns имя для медиа сервера, которое Вы прописали, например, media.domain.ru
6) Перезапустите службу nginx:
systemctl restart nginx
7) Отредактируйте файл для coturn роли /etc/turnserver.conf приведя его содержимое к виду: Дальнейшая конфигурация предполагает использования STUN и TURN ролей на данном сервере. Это пример конфигурации.
listening-ip=0.0.0.0 # Прослушивать все IP-адреса
external-ip={EXTERNAL_IP}
relay-ip={RELAY_IP}
relay-ip={RELAY_IP}
fingerprint
lt-cred-mech
user={CREDENTIAL}
realm={DNS_NAME_COTURN}
syslog
min-port=10000
max-port=30000
log-file=/tmp/turnserver.log
verbose
Verbose
Где,
  • {EXTERNAL_IP} — внешний белый ip адрес (как пример задан на этапе 1) ;
  • {RELAY_IP} — необходимо указать как внутренний адрес, заданный на одном из сетевых адаптеров, так и внешний адрес сервера, укажите их на разных строках;
  • {CREDENTIAL} — учетная запись для авторизации на turn сервере (пример: mediauser:12345678);
  • {DNS_NAME_COTURN} — dns имя для coturn сервера, которое Вы прописали в глобальном DNS, например, stunturn.domain.ru
8) Перезапустите службу coturn:
systemctl restart coturn

Установите медиа сервер по инструкции:

Установку можно производить по инструкции (раздел 6), за исключением части пунктов, где требуется коррекция: https://support.r7-office.ru/team/team_install/team_install/ 9) Пропишите записи DNS в /etc/hosts
127.0.0.1 localhost
{INTERNAL_IP} media.domain.ru
{DNS_NAME_COTURN_LOCAL} stunturn.domain.ru stunturn
Где,
  • {INTERNAL_IP} — необходимо указать внутренний адрес медиа сервера;
  • {DNS_NAME_COTURN_LOCAL} — необходимо указать внутренний адрес, до сервера с ролями reverse proxy и stun/turn (обязательно оставьте имя сервиса без домена, как пример: stunturn).
10) После запуска скрипта установка, с выбором установки медиа сервера, вы можете увидеть запись. Настройка работы Р7-Команда за NAT (reverse proxy + stun/turn) Так как наша конфигурация подразумевает установку в закрытом контуре, выберите пункт <Все равно продолжить> 11) Продолжите установку медиа сервера по инструкции. 12) После завершения установки, создайте конфигурационный файл /etc/media/media.properties.d/media.properties со следующим содержимым:
com.mind.media.profile.webrtc.relayCandidates=true
com.mind.media.profile.webrtc.reflexiveCandidates=true
  • com.mind.media.profile.webrtc.relayCandidates=true: Эта строка включает использование ретрансляционных кандидатов (relay candidates) для соединения WebRTC. Ретрансляционные кандидаты используются, когда два клиента WebRTC не могут установить прямое соединение друг с другом (например, если они находятся за NAT). В этом случае, сервер TURN (или STUN) выступает в качестве ретранслятора, позволяя клиентам обмениваться данными через него;
  • com.mind.media.profile.webrtc.reflexiveCandidates=true: Эта строка включает использование рефлексивных кандидатов (reflexive candidates) для соединения WebRTC. Рефлексивные кандидаты позволяют клиентам узнать свой внешний IP- адрес, даже если они находятся за NAT. Это важно, так как некоторые устройства не могут получить свой внешний IP-адрес напрямую.
13) В конфигурационном файле /etc/xcoder/xcoder.conf дополните секцию webrtc_rtpgw авторизационными данными:
webrtc_rtpgw
{
pool_min_free 100
workers_per_process 64
port_range_begin 20000
port_range_end 30000
turn_hosts
{
stunturn:3478
{
protocol "tcp"
username "mediauser"
password "12345678"
}
}
stun_hosts
{
"stunturn:3478"
}
}
}
Где,
  • stunturn:3478 — это имя хоста и порт coTURN сервера (он же указан в /etc/hosts) ;
  • username — имя пользователя для аутентификации на сервере coTURN;
  • password — пароль для аутентификации на сервере coTURN.
14) Перезапустите зависимые службы для применения изменений:
systemctl restart nginx.service opensips.service xcoder-media.service

Установите сервер управления по инструкции:

Установку можно производить по инструкции (раздел 7), за исключением части пунктов, где требуется коррекция: https://support.r7-office.ru/team/team_install/team_install/ 15) Пропишите записи DNS в /etc/hosts
127.0.0.1 localhost
{INTERNAL_IP} media.domain.ru
Где,
  • {INTERNAL_IP} — необходимо указать внутренний адрес медиа сервера.
16) После запуска скрипта установка, с выбором установки сервера управления, вы дойдете до пункта. Настройка работы Р7-Команда за NAT (reverse proxy + stun/turn) где необходимо указать url медиа сервера. 17) Создайте директорию для считывания конфигурационного файла
mkdir /root/.team/config.d
18) После завершения установки, создайте конфигурационный файл /root/.team/config.d/ss-production.properties с настройками для stun/turn сервера со следующим содержимым:
mind.stun.url=stun:stunturn.domain.ru:3478
mind.turn.url=turn:stunturn.domain.ru:3478
mind.turn.username=mediauser
mind.turn.password=12345678
Где,
  • mind.stun.url=stun:stunturn.domain.ru:3478: определяет адрес и порт сервера STUN (Session Traversal Utilities for NAT). Сервер STUN используется для определения внешнего IP-адреса и порта устройства, находящегося за NAT. В примере адрес сервера STUN — stunturn.domain.ru, а порт — 3478;
  • mind.turn.url=turn:stunturn.domain.ru:3478: определяет адрес и порт сервера TURN (Traversal Using Relays around NAT). Сервер TURN используется для ретрансляции трафика WebRTC, когда два устройства не могут установить прямое соединение друг с другом (например, если они находятся за NAT). В этом случае, сервер TURN выступает в качестве посредника, позволяя устройствам обмениваться данными через него. В примере адрес сервера TURN — stunturn.domain.ru, а порт — 3478;
  • mind.turn.username=mediauser: определяет имя пользователя для аутентификации на сервере TURN;
  • mind.turn.password=12345678: определяет пароль для аутентификации на сервере TURN.
19) Перезапустите сервер управления для применения изменений:
reboot
В данной конфигурации задержка в начале звонка, составляющая от 6 до 12 секунд до попадания в комнату, является стандартным показателем
Была ли полезна статья?
Позвольте нам стать лучше