BigBlueButton.plNiezależny serwis po polsku

Serwer TURN

Instalacja i konfiguracja serwera pośredniczącego w połączeniach WebRTC.

Tłumaczenie automatyczne 4.0 Stan źródeł:
Ilustracja rozdziału: Serwer TURN
Ilustracja z repozytorium dokumentacji BigBlueButton, tag v4.0.0. Niektóre obrazy źródłowe przedstawiają starszy interfejs. Źródło ilustracji.

BBB 2.6 zawiera teraz coturn dla serwera TURN

Począwszy od wersji BigBlueButton 2.6, domyślny proces instalacji obejmuje coturn, serwer TURN, który umożliwia użytkownikom korzystającym z restrykcyjnych zapór sieciowych łączenie się. Nie potrzebujesz żadnych dodatkowych zmian w konfiguracji, chyba że chcesz zastąpić konfigurację domyślną.

W tym dokumencie opisano, jak skonfigurować serwer TURN dla poprzednich wersji BigBlueButton.

BBB 2.6 zawiera teraz coturn dla serwera TURN

Począwszy od wersji BigBlueButton 2.6, domyślny proces instalacji obejmuje coturn, serwer TURN, który umożliwia użytkownikom korzystającym z restrykcyjnych zapór sieciowych łączenie się. Nie potrzebujesz żadnych dodatkowych zmian w konfiguracji, chyba że chcesz zastąpić konfigurację domyślną.

W tym dokumencie opisano, jak skonfigurować serwer TURN dla poprzednich wersji BigBlueButton.

Skonfiguruj serwer TURN

BigBlueButton zwykle wymaga dostępności szerokiego zakresu portów UDP do komunikacji WebRTC. W niektórych witrynach lub środowiskach programistycznych z ograniczeniami sieciowymi, np. za NAT lub zaporą sieciową ograniczającą wychodzące połączenia UDP, użytkownicy mogą nie być w stanie nawiązywać wychodzących połączeń UDP z serwerem BigBlueButton.

Protokół TURN został zaprojektowany, aby umożliwić przepływom komunikacyjnym opartym na UDP, takim jak WebRTC, omijanie NAT lub zapór ogniowych poprzez połączenie klienta z serwerem TURN, a następnie serwer TURN łączy się z miejscem docelowym w jego imieniu.

Ponadto serwer TURN implementuje również protokół STUN, używany do umożliwiania bezpośrednich połączeń UDP przez określone typy zapór sieciowych, które w innym przypadku mogłyby nie działać.

Korzystanie z serwera TURN pod twoją kontrolą poprawia skuteczność połączeń z BigBlueButton, a także poprawia prywatność użytkowników, ponieważ nie będą oni już wysyłać informacji o adresie IP do publicznego serwera STUN.

Wymagany sprzęt

Protokół TURN nie obciąża procesora ani pamięci. Dodatkowo, ponieważ jest używany tylko podczas konfiguracji połączenia (dla STUN) i jako rozwiązanie awaryjne dla użytkowników, którzy w przeciwnym razie nie mogliby się połączyć, wymagania dotyczące przepustowości nie są szczególnie wysokie. W przypadku umiarkowanej liczby serwerów BigBlueButton zwykle wystarcza jeden mały VPS.

Posiadanie wielu adresów IP może poprawić wyniki podczas używania STUN z niektórymi typami zapór sieciowych, ale zwykle nie jest to konieczne.

Posiadanie serwera za NAT (na przykład na Amazon EC2) jest w porządku, ale wszystkie przychodzące połączenia UDP i TCP na dowolnym porcie muszą być przekazywane, a nie zaporą ogniową.

Wymagane oprogramowanie

Zalecamy użycie minimalnej instalacji serwerowej Ubuntu 24.04. Oprogramowanie coturn wymaga portu 443 do wyłącznego użytku w zalecanej przez nas konfiguracji, co oznacza, że ​​na serwerze nie może być uruchomione żadne oprogramowanie pulpitu nawigacyjnego ani inne aplikacje internetowe.

Stabilne wersje coturn są już dostępne w repozytoriach pakietów Ubuntu dla wersji 24.04 i nowszych i można je zainstalować za pomocą apt-get:

$ sudo apt-get update
$ sudo apt-get install coturn

Uwaga: powrót nie rozpocznie się automatycznie, dopóki nie zostanie zastosowana konfiguracja (patrz poniżej).

Korzystanie z pakietu bbb-coturn (BigBlueButton 4.0 i nowsze)

Ubuntu 24.04 dostarcza wersję 4.6.1. Począwszy od wersji BigBlueButton 4.0, opcjonalny pakiet bbb-coturn zapewnia nowszą wersję (4.16.0) zbudowaną w ramach projektu BigBlueButton. Nie jest instalowany domyślnie.

bbb-coturn jest zamiennikiem pakietu dystrybucyjnego coturn — deklaruje Provides/Conflicts/Replaces na coturn, więc apt usuwa pakiet dystrybucyjny podczas jego instalacji i zachowuje tę samą nazwę binarną /usr/bin/turnserver, plik konfiguracyjny /etc/turnserver.conf i nazwę jednostki coturn.service. Wszystko inne na tej stronie obowiązuje bez zmian, w tym poniższe sekcje dotyczące zastąpienia systemu i rotacji dziennika.

Aby go zainstalować, dodaj repozytorium pakietów BigBlueButton dla używanej wersji, a następnie zainstaluj pakiet. Zastąp <version> wersją BigBlueButton (na przykład noble-400):

$ sudo mkdir -p /etc/apt/keyrings
$ sudo wget https://ubuntu.bigbluebutton.org/repo/bigbluebutton.asc -O /etc/apt/keyrings/bigbluebutton.asc
$ echo "deb [signed-by=/etc/apt/keyrings/bigbluebutton.asc] https://ubuntu.bigbluebutton.org/<version> bigbluebutton-noble main" | sudo tee /etc/apt/sources.list.d/bigbluebutton.list
$ sudo apt-get update
$ sudo apt-get install bbb-coturn

Uwaga: podobnie jak pakiet dystrybucyjny w przypadku świeżej instalacji, bbb-coturn nie rozpoczyna powrotu — ani nie włącza usługi. Dostarczany model /etc/turnserver.conf jest standardowym przykładem źródła zasilania z komentarzem dla każdej opcji, a domyślnym ustawieniem jest dostęp anonimowy w tym stanie, co byłoby otwartym przekaźnikiem. Skonfiguruj /etc/turnserver.conf zgodnie z poniższym opisem, następnie włącz i uruchom:

$ sudo systemctl enable --now coturn
Aktualizacja serwera, na którym już działa skonfigurowany zwrot

Instalacja bbb-coturn na serwerze, którego /etc/turnserver.conf jest już skonfigurowany (przez bbb-install.sh lub ręcznie) powoduje wyświetlenie monitu o plik konfiguracyjny dpkg, ponieważ pakiet dostarcza inną (nieskazitelną) kopię tego pliku. Odpowiedz N (domyślnie), aby zachować działającą konfigurację; spakowana kopia jest zapisana jako /etc/turnserver.conf.dpkg-dist w celach informacyjnych.

Zastąpienie pakietu dystrybucyjnego również powoduje zatrzymanie usługi — apt zatrzymuje powrót podczas usuwania starego pakietu, a bbb-coturn nie uruchamia usług podczas instalacji. Uruchom ponownie za pomocą:

$ sudo systemctl enable --now coturn

coturn 4.16.0 nie rozpoznaje już niektórych opcji dostępnych w konfiguracjach z ery 4.6.1 i rejestruje ostrzeżenie dla każdej z nich przy każdym uruchomieniu. Następujące linie można bezpiecznie usunąć z /etc/turnserver.conf:

  • no-tlsv1 i no-tlsv1_1 — obsługa TLS 1.0/1.1 została całkowicie usunięta
  • no-loopback-peers — peery z pętlą zwrotną są teraz domyślnie odrzucona (przeciwna opcja to allow-loopback-peers)
  • no-cli — wycofana na rzecz opcji cli; coturn rejestruje błąd przy starcie

Wymagany wpis DNS

Musisz skonfigurować w pełni kwalifikowaną nazwę domeny, która będzie odpowiadała zewnętrznemu adresowi IP twojego serwera turn. Użyjesz tej nazwy domeny do wygenerowania certyfikatu TLS za pomocą Let's Encrypt (następna sekcja).

Wymagane porty

Na serwerze zwrotnym musisz mieć dostępne następujące porty (oprócz portu 22), aby klienci BigBlueButton mogli się połączyć (porty 3478 i 443) oraz aby zwrot mógł połączyć się z serwerem BigBlueButton (32769 - 65535).

Tabela jest szersza od ekranu. Przewiń ją w poziomie.

Porty Protokół Opis
3478 TCP/UDP wróć do portu nasłuchiwania
443 TCP/UDP Port nasłuchiwania TLS
32769-65535 UDP zakres portów przekaźnikowych

Generowanie certyfikatów TLS

Możesz użyć certbot z Let's Encrypt, aby łatwo wygenerować darmowe certyfikaty TLS. Aby skonfigurować certbot, wprowadź następujące polecenia na serwerze TURN (nie na serwerze BigBlueButton).

$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
$ sudo apt-get install certbot

Możesz następnie uruchomić komendę certbot podobną do poniższej, aby wygenerować certyfikat, zastępując <turn.example.com> nazwą domeny twojego serwera TURN:

$ sudo certbot certonly --standalone --preferred-challenges http \
    -d <turn.example.com>

Należy pamiętać, że protokół TCP 80 musi być tymczasowo otwarty, aby mógł działać.

Aktualne wersje polecenia certbot domyślnie konfigurują automatyczne odnawianie. Aby mieć pewność, że certyfikaty będą czytelne dla coturn, który działa jako użytkownik turnserver, dodaj następujący hak odnawiający do Let's Encrypt. Najpierw utwórz katalog /etc/letsencrypt/renewal-hooks/deploy.

$ sudo mkdir -p /etc/letsencrypt/renewal-hooks/deploy

Następnie utwórz plik /etc/letsencrypt/renewal-hooks/deploy/coturn o następującej zawartości. Zastąp <turn.example.com> nazwą hosta swojego serwera TURN.

#!/bin/bash -e
for certfile in fullchain.pem privkey.pem ; do
	cp -L /etc/letsencrypt/live/<turn.example.com>/"${certfile}" /etc/turnserver/"${certfile}".new
	chown turnserver:turnserver /etc/turnserver/"${certfile}".new
	mv /etc/turnserver/"${certfile}".new /etc/turnserver/"${certfile}"
done
systemctl kill -sUSR2 coturn.service

Ustaw ten plik jako wykonywalny.

$ sudo chmod 0755 /etc/letsencrypt/renewal-hooks/deploy/coturn

Konfiguracja coturn

Konfiguracja coturn zapisana jest w pliku /etc/turnserver.conf. Dostępnych jest wiele opcji, wszystkie udokumentowane w komentarzach w domyślnym pliku konfiguracyjnym. Poniżej załączamy przykładową konfigurację z zalecanymi ustawieniami (więcej informacji na temat ustawień można znaleźć w domyślnym pliku konfiguracyjnym).

Użyj poniższego pliku dla /etc/turnserver.conf i wprowadź następujące zmiany:

  • Zastąp <turn.example.com> nazwą hosta swojego Serwer TURN i
  • Zamień <example.com> na dziedzinę swojego serwera TURN i
  • Zamień <secret_value> na losową wartość dla wspólnego sekretu (możesz go wygenerować uruchamiając openssl rand -hex 16)
  • Zamień <IP> z zewnętrznym adresem IP Twojego serwera TURN

Ten plik konfiguracyjny zakłada, że Twój serwer TURN nie jest za NAT i ma publiczny adres IP.

listening-port=3478
tls-listening-port=443

listening-ip=<IP>
relay-ip=<IP>

# 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=172.17.19.120
# 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

min-port=32769
max-port=65535
verbose

fingerprint
lt-cred-mech
use-auth-secret
static-auth-secret=<secret_value>
realm=<example.com>

cert=/etc/turnserver/fullchain.pem
pkey=/etc/turnserver/privkey.pem
# From https://ssl-config.mozilla.org/ Intermediate, openssl 1.1.0g, 2020-01
cipher-list="ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384"
dh-file=/etc/turnserver/dhp.pem

keep-address-family
no-cli
no-tlsv1
no-tlsv1_1

# Block connections to IP ranges which shouldn't be reachable
no-loopback-peers
no-multicast-peers
# CVE-2020-26262
# If running coturn version older than 4.5.2, uncomment these rules and ensure
# that you have listening-ip set to ipv4 addresses only.
#denied-peer-ip=0.0.0.0-0.255.255.255
#denied-peer-ip=127.0.0.0-127.255.255.255
#denied-peer-ip=::1
# Private (LAN) addresses
# If you are running BigBlueButton within a LAN, you might need to add an "allow" rule for your address range.
# IPv4 Private-Use
denied-peer-ip=10.0.0.0-10.255.255.255
denied-peer-ip=172.16.0.0-172.31.255.255
denied-peer-ip=192.168.0.0-192.168.255.255
# Other IPv4 Special-Purpose addresses
denied-peer-ip=100.64.0.0-100.127.255.255
denied-peer-ip=169.254.0.0-169.254.255.255
denied-peer-ip=192.0.0.0-192.0.0.255
denied-peer-ip=192.0.2.0-192.0.2.255
denied-peer-ip=198.18.0.0-198.19.255.255
denied-peer-ip=198.51.100.0-198.51.100.255
denied-peer-ip=203.0.113.0-203.0.113.255
# IPv6 Unique-Local
denied-peer-ip=fc00::-fdff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
# IPv6 Link-Local Unicast
denied-peer-ip=fe80::-febf:ffff:ffff:ffff:ffff:ffff:ffff:ffff
# Other IPv6 Special-Purpose assignments
denied-peer-ip=::ffff:0:0-::ffff:ffff:ffff
denied-peer-ip=64:ff9b::-64:ff9b::ffff:ffff
denied-peer-ip=64:ff9b:1::-64:ff9b:1:ffff:ffff:ffff:ffff:ffff
denied-peer-ip=2001::-2001:1ff:ffff:ffff:ffff:ffff:ffff:ffff
denied-peer-ip=2001:db8::-2001:db8:ffff:ffff:ffff:ffff:ffff:ffff
denied-peer-ip=2002::-2002:ffff:ffff:ffff:ffff:ffff:ffff:ffff

Musimy utworzyć plik dph.pem,

$ sudo mkdir -p /etc/turnserver
$ sudo openssl dhparam -dsaparam  -out /etc/turnserver/dhp.pem 2048

Aby zwiększyć limit obsługi plików dla serwera TURN i umożliwić mu łączenie się z portem 443, dodaj następujący plik przesłonięcia systemowego. Najpierw utwórz katalog.

$ sudo mkdir -p /etc/systemd/system/coturn.service.d

, a następnie utwórz /etc/systemd/system/coturn.service.d/override.conf z następującą zawartością

[Service]
LimitNOFILE=1048576
AmbientCapabilities=CAP_NET_BIND_SERVICE
ExecStart=
ExecStart=/usr/bin/turnserver --daemon -c /etc/turnserver.conf --pidfile /run/turnserver/turnserver.pid --no-stdout-log --simple-log --log-file /var/log/turnserver/turnserver.log
Restart=always

Konfiguruj rotację dziennika

Aby obrócić logi dla coturn, zainstaluj następujący plik konfiguracyjny w /etc/logrotate.d/coturn

/var/log/turnserver/*.log
{
	rotate 7
	daily
	missingok
	notifempty
	compress
	postrotate
		/bin/systemctl kill -s HUP coturn.service
	endscript
}

I utwórz powiązany katalog dzienników

$ sudo mkdir -p /var/log/turnserver
$ sudo chown turnserver:turnserver /var/log/turnserver

Uruchom ponownie powrót

Po wykonaniu powyższych kroków zrestartuj serwer TURN

$ sudo /etc/letsencrypt/renewal-hooks/deploy/coturn    # Initial copy of certificates
$ sudo systemctl daemon-reload                         # Ensure the override file is loaded
$ sudo systemctl restart coturn                        # Restart

Upewnij się, że coturn został powiązany z portem 443 za pomocą netstat -antp | grep 443. Zrestartuj także serwer TURN i upewnij się, że coturn działa (i powiązał się z portem 443 po ponownym uruchomieniu).

Skonfiguruj BigBlueButton do korzystania z serwera TURN

Musisz skonfigurować bbb-web tak, aby dostarczał przeglądarce listę serwerów turn. Edytuj plik /etc/bigbluebutton/turn-stun-servers.xml, korzystając z poniższej zawartości i wprowadź zmiany:

  • zamień oba wystąpienia <turn.example.com> na nazwę hosta serwera TURN i
  • zamień <secret_value> na klucz tajny, który skonfigurowałeś w turnserver.conf.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

    <bean id="stun0" class="org.bigbluebutton.web.services.turn.StunServer">
        <constructor-arg index="0" value="stun:<turn.example.com>"/>
    </bean>


    <bean id="turn0" class="org.bigbluebutton.web.services.turn.TurnServer">
        <constructor-arg index="0" value="<secret_value>"/>
        <constructor-arg index="1" value="turns:<turn.example.com>:443?transport=tcp"/>
        <constructor-arg index="2" value="86400"/>
    </bean>

    <bean id="turn1" class="org.bigbluebutton.web.services.turn.TurnServer">
        <constructor-arg index="0" value="<secret_value>"/>
        <constructor-arg index="1" value="turn:<turn.example.com>:443?transport=tcp"/>
        <constructor-arg index="2" value="86400"/>
    </bean>

    <bean id="stunTurnService"
            class="org.bigbluebutton.web.services.turn.StunTurnService">
        <property name="stunServers">
            <set>
                <ref bean="stun0"/>
            </set>
        </property>
        <property name="turnServers">
            <set>
                <ref bean="turn0"/>
                <ref bean="turn1"/>
            </set>
        </property>
    </bean>
</beans>

Zrestartuj serwer BigBlueButton, aby zastosować zmiany.

W przyszłości, gdy użytkownicy będą łączyć się za restrykcyjną zaporą sieciową, która uniemożliwia wychodzące połączenia UDP, serwer TURN umożliwi BigBlueButton połączenie z FreeSWITCH i mediasoup poprzez serwer TURN poprzez port 443 na ich zaporze ogniowej.

Przetestuj swój serwer TURN

Domyślnie Twoja przeglądarka będzie próbowała połączyć się bezpośrednio z mediasoup lub FreeSWITCH przy użyciu WebRTC. Jeśli nie będzie w stanie nawiązać bezpośredniego połączenia, powróci do wykorzystania serwera TURN jako jednego z kandydatów do wymiany łączności międzyoperatorskiej (ICE) do przekazywania multimediów.

Użyj FireFox do przetestowania serwera TURN. FireFox pozwala wyłączyć bezpośrednie połączenia i wymagać powrotu do serwera TURN. Uruchom FireFox, otwórz about:config i wyszukaj „relay. You should see a parameter media.peerconnection.ice.relay_only. Set this value to true”.

Gdy FireFox jest skonfigurowany tylko do korzystania z serwera TURN, otwórz nową kartę i dołącz do sesji BigBlueButton oraz udostępnij swoją kamerę internetową. Jeśli pojawi się Twoja kamera internetowa, możesz sprawdzić, czy FireFox korzysta z Twojego serwera TURN, otwierając nową kartę i wybierając about:webrtc. Kliknij show details, a zobaczysz tabelę ze statystykami ICE. Pomyślne połączenie, pokazane na górze tabeli, powinno mieć wartość (relay-tcp) w kolumnie Local Candidate. Oznacza to, że połączenie wideo zostało pomyślnie przekazane przez serwer TURN.

Jeśli jednak podczas udostępniania kamery internetowej otrzymałeś komunikat 1020 (nie można nawiązać połączenia), przeglądarka może nie być w stanie połączyć się z serwerem TURN lub serwer TURN nie działa lub jest poprawnie skonfigurowany. Sprawdź konsolę przeglądarki w FireFox. Jeśli widzisz

WebRTC: ICE failed, your TURN server appears to be broken, see about:webrtc for more details

, FireFox nie był w stanie komunikować się z Twoim serwerem TURN lub Twój serwer TURN nie działał lub był poprawnie skonfigurowany.

Aby mieć pewność, że zapora sieciowa nie blokuje połączeń UDP na porcie 443, otwórz nową kartę i odwiedź https://demo.bigbluebutton.org/, uruchom sesję testową i spróbuj udostępnić swoją kamerę internetową. przeglądarka może nie być w stanie połączyć się z serwerem TURN lub serwer TURN nie działa lub jest poprawnie skonfigurowany.

Serwer TURN działa również jako serwer STUN, więc możesz najpierw sprawdzić, czy część STUN działa, używając stunclient. Uruchom poniższe polecenia i zastąp <youor-turn-server-host> nazwą hosta swojego serwera TURN.

sudo apt-get install -y stuntman-client
stunclient --mode full --localport 30000 <your-turn-server-host> 3478

Jeśli się powiedzie, powinieneś zobaczyć wynik stunclient powinien być podobny do poniższego.

Binding test: success
Local address: xxx.xxx.xxx.xxx:30000
Mapped address: xxx.xxx.xxx.xxx:30000
Behavior test: success
Nat behavior: Direct Mapping
Filtering test: success
Nat filtering: Endpoint Independent Filtering

Jeśli pojawi się błąd, sprawdź, czy coturn działa na serwerze TURN, używając systemctl status coturn.service. Sprawdź logi, wykonując tail -f /var/log/turnserver/coturn.log. Możesz uzyskać pełne logi, dodając verbose do /etc/turnserver.conf i ponownie uruchamiając serwer TURN systemctl restart coturn.service

Możesz przetestować swój serwer TURN za pomocą strony trickle ICE. Dzięki temu uzyskasz rejestr kandydatów do sztafet, którzy wracają ze zbiórki ICE. Aby przetestować korzystanie z tej strony, musisz wygenerować dane testowe. Poniższy skrypt BASH generuje je, czytając plik /etc/turnserver.conf. Alternatywnie ustaw HOST=<HOSTNAME> i SECRET=<SECRET> na poświadczenia serwerów TURN.

#!/bin/bash

HOST=$(cat /etc/turnserver.conf | grep realm | sed 's/realm=//')
SECRET=$(cat /etc/turnserver.conf | grep static-auth-secret | sed 's/static-auth-secret=//')

time=$(date +%s)
expiry=8400
username=$(( $time + $expiry ))

echo
echo "          https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/"
echo
echo      URI : turn:$HOST:443
echo username : $username
echo password : $(echo -n $username | openssl dgst -binary -sha1 -hmac $SECRET | openssl base64)
echo

Wprowadź wartości w URI, nazwę użytkownika i hasło na stronie ICE i kliknij „Zbierz kandydatów”. Powinieneś zobaczyć listę kandydatów do sztafety. Jeśli tego nie zrobisz, sprawdź ponownie, czy serwer TURN działa i prześledź logi serwera TURN za pomocą tail -f /var/log/turnserver/coturn.log lub journalctl -f -u coturn.service.

Możesz uzyskać szczegółowe logi, dodając verbose do /etc/turnserver.conf, a następnie ponownie uruchamiając serwer TURN systemctl restart coturn.service i spróbuj ponownie przetestować z FireFox lub powyższej strony Tricke ICE.