@spectralwhite

Как пробросить порты через nginx для работы turn сервера?

Не могу победить nginx, уже несколько раз перечитал документацию, но либо читаю не в том месте, либо что-то упускаю. Уверен что дел на пару минут.

Так вот, имеется следующая схема:
63836729b42fa806842524.png

1) Свой домен с поддоменами указанными на cloudflare.
2) Роутер Ubiquiti EdgeRouter Lite ERLite-3 у которого порты 80, 443, 8008, 8448, 3478-3485, 5349, 49152-65535(UDP only) проброшены до nginx сервера.
3) Физический сервер с ESXi в котором крутятся несколько серверов на Ubuntu Server, где у каждого сервера свой поддомен
4) Nginx сервер разруливает пакеты для разных поддоменов на разные локальные IP адреса

Так вот, matrix synapse сервер работает исправно, переписки работают, голосовые сообщения работают, всё хорошо, но стоит совершить звонок, или видеозвонок, то бесконечно идёт подключение и всё никак не подключится. На matrix synapse сервере есть TURN сервер - coturn. Я пробовал проверить его работу следующим образом: В роутере пробросил порты сразу до matrix сервера, в обход nginx сервера. И сразу звонки и видеозвонки заработали. То есть 100% дело ни в cloudflare, ни в роутере, ни в ESXi, ни в matrix сервере, ни в turn сервере(который внутри matrix). 100% дело в nginx сервере.
6383621531f20324771571.png

Далее я искал ответы в просторах интернета, пытался многократно читать документацию по nginx, и при попытке настроить как советуют в интернете, соблюдая то что указано в документации, всё равно получаю ошибку и ничего не запускается.

Исходя из ответов в интернете, необходимо в nginx указать следующее:
stream
stream {
    server {
        listen 3478;
        proxy_pass 192.168.2.100:3478;
    }
    server {
        listen 5349;
        proxy_pass 192.168.2.100:5349;
    }
    server {
        listen 64000-64700 udp;
        proxy_pass 192.168.2.100:$server_port;
    }
}

Где 192.168.2.100 - это адрес turn сервера, в моём случае это и есть адрес matrix сервера.

Эти строки я пытался вставить и в nginx.conf, и в /etc/nginx/sites-enabled/matrix.mydomen.ru.conf, и в /etc/nginx/conf.d/matrix.mydomen.ru.conf, но всё бестолку. Стоит убрать эти строки, сразу nginx работает, но не работают звонки.

Чтобы иметь больше входных данных, вот содержимое конфигов:

1) nginx сервер:
/etc/nginx/nginx.conf
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
	worker_connections 768;
	# multi_accept on;
}

http {

	##
	# Basic Settings
	##

	sendfile on;
	tcp_nopush on;
	types_hash_max_size 2048;
	# server_tokens off;

	# server_names_hash_bucket_size 64;
	# server_name_in_redirect off;

	include /etc/nginx/mime.types;
	default_type application/octet-stream;

	##
	# SSL Settings
	##

	ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
	ssl_prefer_server_ciphers on;

	##
	# Logging Settings
	##

	access_log /var/log/nginx/access.log;
	error_log /var/log/nginx/error.log;

	##
	# Gzip Settings
	##

	gzip on;

	# gzip_vary on;
	# gzip_proxied any;
	# gzip_comp_level 6;
	# gzip_buffers 16 8k;
	# gzip_http_version 1.1;
	# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

	##
	# Virtual Host Configs
	##

	include /etc/nginx/conf.d/*.conf;
	include /etc/nginx/sites-enabled/*;
}


#mail {
#	# See sample authentication script at:
#	# http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
#
#	# auth_http localhost/auth.php;
#	# pop3_capabilities "TOP" "USER";
#	# imap_capabilities "IMAP4rev1" "UIDPLUS";
#
#	server {
#		listen     localhost:110;
#		protocol   pop3;
#		proxy      on;
#	}
#
#	server {
#		listen     localhost:143;
#		protocol   imap;
#		proxy      on;
#	}
#}

stream {
    access_log off;
    error_log /var/log/nginx/streamerror.log;

    include /etc/nginx/conf.d/*.streamconf;
    include /etc/nginx/sites-enabled/*.streamconf;
}

/etc/nginx/sites-enabled/matrix.mydomen.ru.conf
server {
        listen 80;
        server_name matrix.mydomen.ru;
        return 404;
    }

    server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        listen 8448 ssl http2 default_server;
        listen [::]:8448 ssl http2 default_server;
#        listen 3478-3485;
#        listen 5349;
#        listen 64000-64700;
        server_name matrix.mydomen.ru;
        access_log /var/log/nginx/matrix/access.log;
        error_log /var/log/nginx/matrix/error.log;

        location / {
            proxy_pass  https://192.168.2.100;
        }
        # ssl on;
        ssl_certificate /etc/letsencrypt/live/matrix.mydomen.ru/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/matrix.mydomen.ru/privkey.pem;
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
        include /etc/letsencrypt/options-ssl-nginx.conf;
    }
#stream {
#        server {
#                listen 3478;
#                server_name matrix.mydomen.ru;
#                proxy_pass 192.168.2.100:3478;
#        }

#        server {
#                listen 5349;
#                server_name matrix.mydomen.ru;
#                proxy_pass 192.168.2.100:5349;
#        }

#        server {
#                listen 64000-64700 udp;
#                server_name matrix.mydomen.ru;
#                proxy_pass 192.168.2.100:$server_port;
#        }
#}

2) на matrix сервере:
/etc/nginx/sites-enabled/matrix.mydomen.ru.conf
server {
    if ($host = matrix.mydomen.ru) {
        return 301 https://matrix.mydomen.ru:$server_port$uri;
    }
    listen 80;
    server_name matrix.mydomen.ru;
    return 404;
}

server {
    listen 443 ssl;
    server_name matrix.mydomen.ru;

    ssl_certificate /etc/letsencrypt/live/matrix.mydomen.ru/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/matrix.mydomen.ru/privkey.pem;

    location / {
       #set $cors "";
       #if ($http_origin ~* (matrix\.spectra\.su|app\.element\.io)$) {
       #    set $cors "true";
       #}


       #if ($cors = "true") {
       #    add_header 'Access-Control-Allow-Origin' "$http_origin";
       #    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, DELETE, PUT';
       #    add_header 'Access-Control-Allow-Credentials' 'true';
       #    add_header 'Access-Control-Allow-Headers' 'User-Agent,Keep-Alive,Content-Type';
       #}
        proxy_pass http://localhost:8008;
        proxy_set_header X-Forwarded-For $remote_addr;
	#add_header Access-Control-Allow-Origin *;
        # Nginx by default only allows file uploads up to 1M in size
        # Increase client_max_body_size to match max_upload_size defined in homeserver.yaml
        client_max_body_size 10M;
    }
    location ~* ^(/_matrix|/_synapse/client) {
	#add_header Access-Control-Allow-Origin *;
        # note: do not add a path (even a single /) after the port in `proxy_pass`,
        # otherwise nginx will canonicalise the URI and cause signature verification
        # errors.
        proxy_pass http://localhost:8008;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;

        # Nginx by default only allows file uploads up to 1M in size
        # Increase client_max_body_size to match max_upload_size defined in homeserver.yaml
        client_max_body_size 50M;
    }
    location ~ /_matrix/client/r0/register/available {
        proxy_pass http://localhost:8008;
        #add_header Access-Control-Allow-Origin *;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $remote_addr;
    }

    location ~ /_matrix/client/r0/voip/turnServer {
        proxy_pass http://localhost:3478;
        #add_header Access-Control-Allow-Origin *;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $remote_addr;
    }


    location ~ /.well-known/matrix/server {
        proxy_pass http://localhost:8008;
        #add_header Access-Control-Allow-Origin *;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $remote_addr;
    }
    location ~ /.well-known/matrix/client {
        proxy_pass http://localhost:8008;
        #add_header Access-Control-Allow-Origin *;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $remote_addr;
    }

}

# This is used for Matrix Federation
# which is using default TCP port '8448'
server {
    listen 8448 ssl;
    server_name matrix.mydomen.ru;

    ssl_certificate /etc/letsencrypt/live/matrix.mydomen.ru/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/matrix.mydomen.ru/privkey.pem;

    location / {
        proxy_pass http://localhost:8008;
        proxy_set_header X-Forwarded-For $remote_addr;
    }
}


Учитывая что напрямую, без nginx сервера всё работает, то конфиги на matrix сервере верные, но на всвякий случай их указал. Что я делаю не так с nginx сервером, я не понимаю. Буду очень благодарен за помощь. Заранее спасибо!
  • Вопрос задан
  • 547 просмотров
Пригласить эксперта
Ответы на вопрос 1
@AUser0
Чем больше знаю, тем лучше понимаю, как мало знаю.
Вынесите содержимое stream{} в файл
/etc/nginx/sites-enabled/matrix.mysite.ru.streamconf
, сам stream{} уже определён в nginx.conf.

И server_name бесполезен, nginx вообще не будет анализировать эти TCP и UDP потоки, он их просто bypass-ит сквозь себя.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы