Firewall Traversal Streaming демо рабочее?

alexanderY

Member
Добрый день.

Хотим сейчас плотно потестировать фичу с обходом фаервола. Для начала, решил проверить, как она работает на вашем сервере. Я запретил исходящие TCP подключения к порту 8443 на своём десктопе (через стандартный брандмауэр Win 10). И вот это демо перестало подключаться.

Это у вас что-то сбилось, или я неправильно понял назначение этой фичи? Я понимаю так: если фаерволом перекрыты все порты, кроме 80 и 443, то всё равно можно пробиться, если настроить HA Proxy и использовать TURN-сервер.
 

Max

Administrator
Staff member
Да, должно работать.
Поменяйте порт подключения с 8443 на 443
Code:
wss://wcs5-eu.flashphoner.com:8443
на
Code:
wss://wcs5-eu.flashphoner.com:443
webrtc-firewall-tranersal-443-https.jpg
 

alexanderY

Member
А, ну да, логично вроде бы.
Получается, если у нас и так запроксированы запросы к Flashphoner через 443 порт с помощью nginx, то настраивать HA Proxy по инструкции нет необходимости?
Остаётся только указать параметры TURN-сервера?
 

Max

Administrator
Staff member
Да, нужно только указать параметры TURN сервера.
При этом TURN сервер должен быть также настроен на работу по порту 443 и подключаться к нему нужно так:
Code:
Flashphoner.createSession({urlServer: url, mediaOptions: {"iceServers": [ { 'url': 'turn:192.168.0.1:443?transport=tcp', 'credential': 'password1', 'username': 'username1' } ], "iceTransportPolicy": "relay"}})
Настройки TURN на этой странице:
https://flashphoner.com/docs/wcs5/w...nd_testing-firewall_traversal-turn_server.htm
 

alexanderY

Member
А если мы используем для подключения метод Flashphoner.roomApi.connect? Можно ли туда передать объект mediaOptions?
И другой вопрос, как убедиться, что подключение идет через TURN-сервер и работает корректно?
 

Max

Administrator
Staff member
А если мы используем для подключения метод Flashphoner.roomApi.connect? Можно ли туда передать объект mediaOptions?
В последней сборке Web SDK 06481e1efb8f813ebebb25b920990bc7a0e49a7d должен быть такой фикс:
https://github.com/flashphoner/flashphoner_client/commit/06481e1efb8f813ebebb25b920990bc7a0e49a7d
С ним должно работать:
Code:
connection = Flashphoner.roomApi.connect({urlServer: url, username: username,
mediaOptions: {"iceServers": [ { 'url': 'turn:192.168.0.1:443?transport=tcp', 'credential': 'password1', 'username': 'username1' } ], "iceTransportPolicy": "relay"}
});
И другой вопрос, как убедиться, что подключение идет через TURN-сервер и работает корректно?
Отключить все порты кроме TCP 443 и UDP 53 (DNS) на клиенте.
Убедиться что аудио и видео работает.
 

Max

Administrator
Staff member
По этой ссылке фикса вроде пока нет.
По этой ссылке:
https://flashphoner.com/downloads/b...481e1efb8f813ebebb25b920990bc7a0e49a7d.tar.gz
Нужно просто склонировать репозиторий и выполнить build.sh для сборки?
Нет, он собирается с помощью grunt и требует npm.
Клонировать нужно отсюда:
https://github.com/flashphoner/flashphoner_client/tree/wcs_api-2.0
Code:
grunt install
 

alexanderY

Member
Хмм, похоже, что не могу опубликовать стрим с использованием iceServers.
Я пока что даже не закрывал порты, вообще.
Я пробовал использовать "Flashphoner.createSession", как в вашем первом примере.
Срабатывает ESTABLISHED событие, а дальше тишина. Ни ошибок, ни других событий. Только warning в консоли: "RTCIceServer.url is deprecated! Use urls instead.", а точнее 7 повторяющихся ворнингов.

В качестве TURN-серверов я использую Xirsys API. В списке, который мне отдаёт Xirsys, один STUN-сервер и шесть TURN. В панели управления Xirsys я вижу успешные STUN-подключения.

Xirsys отдаёт массив серверов, выглядящий так:
Code:
[
{url: "stun:turn03.uswest.xirsys.com"},
{username: "xxx", credential: "yyy", url: "zzz"},
// ещё 5 turn серверов в таком же формате
]
Клиентская сборка последняя. Если не использовать iceServers, то всё ок.
 

alexanderY

Member
В продакшене не воспроизводится. Так что, кажется, всё в порядке. Сейчас буду призывать проблемных корпоративных юзеров, проверять, пробьют фаервол или нет.
 

alexanderY

Member
Вопрос: как вообще работает фича с TURN-серверами?
Я имею в виду следующее. У меня проблем с фаерволами нет. Я спокойно подключался и подключаюсь к нашему серверу без помощи TURN. Сейчас я эту фичу включил, и вижу, что мой трафик пошел через сервера Xirsys'а, хотя в этом нет необходимости. Отсюда добавилась задержка в полторы-две секунды. Это приемлемо, если юзер по-другому не может подключиться. Но неприемлемо для остальных.

Я по описанию технологии на разных ресурсах (в том числе на сайте Xirsys) понял так, что большая часть юзеров не будет гонять трафик через них, потому что у них и так все нормально. Т.е. не заметит изменений. А тут получается не так. Мы должны сами определять, кого из юзеров подключать через TURN, а кого напрямую? Если да, то как это рекомендуется делать?
 

Max

Administrator
Staff member
У нас не так.
В этой демке https://wcs5-eu.flashphoner.com/demo2/firewall-traversal-streaming
все идет напрямую, если не выключены UDP потры.
Если выключены, то идет через TURN.

Попробуйте с нашим TURN-сервером.
На странице демки есть параметры подключения.

Еще вопрос, как создаете подклчение.
Если так
Code:
connection = Flashphoner.roomApi.connect({urlServer: url, username: username,
mediaOptions: {"iceServers": [ { 'url': 'turn:192.168.0.1:443?transport=tcp', 'credential': 'password1', 'username': 'username1' } ], "iceTransportPolicy": "relay"}
});
То трафик должен идти TURN по порту 443.

Как установить приоритет, пока не разбирались, т.к. у нас заработало сразу нормально: напрямую, если UDP доступен и через TURN если нет.
Code:
{url: "stun:turn03.uswest.xirsys.com"}
Здесь указывается STUN, а не TURN. Возможно поэтому трафик и пошел через этот сервер.
Попробуйте так:
Code:
{"iceServers": [ { 'url': 'turn:turn03.uswest.xirsys.com:443?transport=tcp', 'credential': 'password1', 'username': 'username1' } ], "iceTransportPolicy": "relay"}
 

alexanderY

Member
Попробуйте с нашим TURN-сервером.
На странице демки есть параметры подключения.
Попробовал, оставил только ваш сервер, другие не указывал. Судя по задержке, подключаюсь через него. Это, кстати, единственное, что помогает понять куда пошёл трафик. В devTools, если я не ошибаюсь, этой информации нет. Если надо, могу в личку / на почту скинуть ссылку, где можно попробовать подключиться.

Еще вопрос, как создаете подклчение.
Пробовал и "Flashphoner.roomApi.connect" и "Flashphoner.createSession". В обоих случаях поведение одинаковое. Кстати, во втором случае я не указываю username (который относится к комнате, а не к TURN). Но вроде бы это не должно влиять?

Попробуйте так:
Попробовать оставить один сервер xirsys слегка проблематично — они выдают адреса и данные для доступа динамически, и через 10 секунд они уже устаревают. Думаю, что завтра я это попробую, но, судя по всему, результат будет такой же, как при указании вашего сервера.
 

Max

Administrator
Staff member
Судя по задержке, подключаюсь через него. Это, кстати, единственное, что помогает понять куда пошёл трафик.
Можно посмотреть в chrome://webrtc-internals
googRemoteAddress

webrtc-internals-remote-video-peer.jpg
 

alexanderY

Member
Посмотрел, только не googRemoteAddress, а googLocalAddress.
googRemoteAddress — всегда адрес нашего Flashphoner-сервера.

googLocalAddress меняется, в зависимости от установки разных TURN-серверов. При установке вашего TURN-сервера, googLocalAddress указывается как 139.59.132.28:52987 (порт только всегда разный). При установке серверов Xirsys, соответственно, там прописывается их адрес. Без использования TURN - мой IP-адрес.

Хотя, в вашем демо, при использовании TURN, googLocalAddress равен моему IP-адресу. Странно.
 
Top