Ретрансляция без потоков на coturn

Есть аналогичный вопрос Сервер Coturn - Relay не работает, но это неприменимо, так как серверы Amazon находятся за NAT, которого у нас нет.

У нас есть голая металлическая машина, подключенная к открытому Интернету. Когда мы заставляем соединение WebRTC использовать relay, происходит обмен кандидатами, и мы видим кандидата relay, но тогда потоков нет.

Вот конфиг. Мы играли со всеми вещами, такими как настройка external-ip, включение и выключение TLS, но безрезультатно.

listening-ip=<public-address>
listening-port=443
tls-listening-port=443
cert=/etc/star-attach-live-certificate.pem
pkey=/etc/star-attach-live-certificate.key

min-port=49152
max-port=65535

realm=turn.example.com
server-name=servername.example.com

fingerprint
max-bps=550000
use-auth-secret
static-auth-secret=<secret>
check-origin-consistency
userdb=/usr/local/var/db/turndb

realm указывает на балансировщик нагрузки, который может перенаправить на тот или иной сервер, но я думаю, что это не проблема.

Когда я вызываю сервер из https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/ я получаю все 3 кандидата.

Ответ ICE Trickle

Инструмент https://test.webrtc.org дает мне следующее:

Инструмент тестирования WebRTC

Я считаю, что результат неверен, потому что я вижу кандидата srflx выше, а связь через srflx на самом деле работает.

Вот обе стороны от chrome://webrtc-internals. Я не вижу ни одной пары кандидатов.

Клиент А Клиент B

relay кандидаты выглядят так:

sdpMid: 0, sdpMLineIndex: 0, candidate: candidate:3193418391 1 udp 24846335 95.216.16.200 55992 typ relay raddr 0.0.0.0 rport 0 generation 0 ufrag qW0i network-id 1 network-cost 10

У нас заканчиваются идеи, что еще мы могли бы попробовать. Мы даже заменили сервер, чтобы избежать возможных проблем с оборудованием. Мы запускаем это в контейнере Docker на Alpine. Чего мы не пробовали, так это использовать Ubuntu 16.04LTS.

Кто-нибудь может увидеть, что не так, или есть идеи, что еще мы могли бы попробовать?


Дополнительная информация:

Покопавшись дальше, мы обнаружили, что иногда реле работает отлично, иногда нет. Хотя в США это работает нормально, кажется, что проблемы возникают, когда звонят пользователю из ЕС. Я подозреваю, что провайдеры ЕС скрывают кандидатов prflx, форсируя ретрансляционное соединение, которое затем терпит неудачу. Даже там, где он обычно не работает, он работает в редких случаях, и когда я принудительно ретранслирую соединение из своего местоположения в США, потоки ретранслируются просто отлично. Когда это работает, пропускная способность, используемая в котурне, почти одинакова для входа и выхода, но когда это не удается, входящая пропускная способность намного выше, чем исходящая, как видно на этом изображении.

Пропускная способность, используемая при совместном использовании

Я не могу добавить сюда полный дамп, но я разместил его на https://fippo.github.io/webrtc-dump-importer/ и извлек соответствующую часть, показывающую установление соединения и пары кандидатов.

Пары кандидатов


person Oliver Hausler    schedule 27.04.2019    source источник
comment
Все это выглядит нормально. Возможно, вы захотите проверить, могут ли два клиента на одном сервере подключаться друг к другу. Если нет, то, вероятно, это связано с тем, что правила брандмауэра блокируют udp-трафик от ретранслируемых кандидатов.   -  person Philipp Hancke    schedule 27.04.2019
comment
Как упомянул Филипп, это похоже на правила брандмауэра. Не могли бы вы также создать дамп из chrome://webrtc-internals/ и вставить его сюда?   -  person Mariusz Beltowski    schedule 27.04.2019
comment
Это решено. @PhilippHancke указал нам правильное направление. Это был не брандмауэр, но пакеты были заблокированы, потому что мы запускали coturn в контейнере Docker с включенной сетью хоста. У coturn были привилегии суперпользователя внутри контейнера, а у самого контейнера — нет. Порты ‹ 1024 заблокированы без привилегий суперпользователя в Linux, и, по-видимому, Docker управляет этим для REST (почему STUN и административный портал работали), но, по-видимому, это не работает для coturn. Другими словами, контейнер также должен быть привилегированным.   -  person Oliver Hausler    schedule 27.04.2019
comment
@MariuszBeltowski Ну, видимо, здесь было две проблемы. Предложение Филиппа решило одну. Я считаю, что оставшаяся проблема связана с котурном, который я подал здесь github.com/coturn/coturn/issues. /387 - но не совсем уверен, также может быть проблема с конфигурацией, несмотря на то, что мы уже перепробовали почти все. Я не могу легко опубликовать полный дамп здесь, и я думаю, что и не должен, но я создал Gist по адресу gist.github.com/oliverhausler/90013c86a8ff2015b0b394d01ce1e824 на случай, если вам понадобится полный дамп. Второе соединение - это то, которое не удалось.   -  person Oliver Hausler    schedule 10.05.2019
comment
Мы нашли проблему. Это была ошибка в нашем клиенте. После создания ответа одноранговое соединение инициализировалось асинхронно =>, и если это занимало слишком много времени, а поворот был слишком быстрым, он не получал всех кандидатов. Странно, что что-то подобное может привести к потере пакетов на coturn, но это произошло. @PhilippHancke еще раз спасибо за то, что указали мне правильное направление. Напишите ответ, если хотите, чтобы я мог его принять.   -  person Oliver Hausler    schedule 11.05.2019