Kategorie:Coturn
Konfigurieren Sie TURN
In diesem Dokument wird beschrieben, wie Sie einen TURN-Server für BigBlueButton einrichten, damit Benutzer hinter restriktiven Firewalls eine Verbindung herstellen können.
Sie können auch bbb-install.sh verwenden, um die Schritte in diesem Dokument zu automatisieren.
Richten Sie einen TURN-Server ein
Für BigBlueButton muss normalerweise eine Vielzahl von UDP-Ports für die WebRTC-Kommunikation verfügbar sein. In einigen netzwerkbeschränkten Sites oder Entwicklungsumgebungen, z. B. hinter NAT oder einer Firewall, die ausgehende UDP-Verbindungen einschränkt, können Benutzer möglicherweise keine ausgehenden UDP-Verbindungen zu Ihrem BigBlueButton-Server herstellen.
Das TURN-Protokoll ermöglicht es UDP-basierten Kommunikationsflüssen wie WebRTC, NAT oder Firewalls zu umgehen, indem der Client eine Verbindung zum TURN-Server herstellt und der TURN-Server dann in seinem Namen eine Verbindung zum Ziel herstellt.
Darüber hinaus implementiert der TURN-Server auch das STUN-Protokoll, mit dem direkte UDP-Verbindungen über bestimmte Arten von Firewalls ermöglicht werden, die andernfalls möglicherweise nicht funktionieren.
Die Verwendung eines von Ihnen kontrollierten TURN-Servers verbessert den Erfolg von Verbindungen zu BigBlueButton und verbessert auch die Privatsphäre der Benutzer, da diese keine IP-Adressinformationen mehr an einen öffentlichen STUN-Server senden.
Erforderliche Hardware
- Das TURN-Protokoll ist nicht CPU- oder speicherintensiv.
- Da es nur während des Verbindungsaufbaus (für STUN) und als Ersatz für Benutzer verwendet wird, die sonst keine Verbindung herstellen könnten, sind die Bandbreitenanforderungen nicht besonders hoch.
- Für eine moderate Anzahl von BigBlueButton-Servern ist normalerweise ein einziger kleiner VPS ausreichend.
- Das Vorhandensein mehrerer IP-Adressen kann die Ergebnisse verbessern, wenn STUN mit bestimmten Arten von Firewalls verwendet wird, ist jedoch normalerweise nicht erforderlich.
- Der Server hinter NAT (z. B. unter Amazon EC2) ist in Ordnung, aber alle eingehenden UDP- und TCP-Verbindungen an einem beliebigen Port müssen weitergeleitet und nicht durch eine Firewall geschützt werden.
Erforderliche Software
Wir empfehlen die Verwendung einer minimalen Serverinstallation von Ubuntu 20.04. Die coturn- Dies Software benötigt Port 443 für die ausschließliche Verwendung in unserer empfohlenen Konfiguration. bedeutet, dass auf dem Server keine Dashboard-Software oder andere Webanwendungen ausgeführt werden können.
Stabile Versionen von coturn sind bereits in den Ubuntu-Paketrepositorys für Version 20.04 und höher verfügbar und können mit apt-get installiert werden:
$ sudo apt-get update $ sudo apt-get install coturn
Hinweis: coturn startet nicht automatisch, bis die Konfiguration angewendet wird (siehe unten).
Erforderlicher DNS-Eintrag
Sie müssen einen vollständig qualifizierten Domänennamen einrichten, der in die externe IP-Adresse Ihres Turn-Servers aufgelöst wird. Mit diesem Domänennamen generieren Sie ein TLS-Zertifikat mit Let's Encrypt (nächster Abschnitt).
Erforderliche Ports
Auf dem Coturn-Server müssen die folgenden Ports (zusätzlich zu Port 22) verfügbar sein, damit BigBlueButton-Clients eine Verbindung herstellen können (Port 3478 und 443) und Coturn eine Verbindung zu Ihrem BigBlueButton-Server herstellen kann (32768 - 65535).
Häfen | Protokoll | Beschreibung |
---|---|---|
3478 | TCP / UDP | Coturn Listening Port |
443 | TCP / UDP | TLS-Abhörport |
32768-65535 | UDP | Relaisanschlussbereich |
Generieren von TLS-Zertifikaten
Sie können verwenden certbotvon Let's Encrypt, um auf einfache Weise kostenlose TLS-Zertifikate zu generieren. Zum Einrichten certbot Geben Sie die folgenden Befehle auf Ihrem TURN-Server ein (nicht auf Ihrem BigBlueButton-Server).
$ sudo add-apt-repository ppa:certbot/certbot $ sudo apt-get update $ sudo apt-get install certbot
Sie können dann eine ausführen certbot Befehl wie folgt, um das Zertifikat zu generieren und zu ersetzen <turn.example.com> mit dem Domainnamen Ihres TURN-Servers:
$ sudo certbot certonly --standalone --preferred-challenges http \ -d <turn.example.com>
- Aktuelle Versionen des Befehls certbot richten standardmäßig die automatische Verlängerung ein.
- Um sicherzustellen, dass die Zertifikate von lesbar sind coturn, die als läuft turnserverBenutzer, fügen Sie den folgenden Erneuerungs-Hook zu Let's Encrypt hinzu.
- Erstellen Sie zunächst das Verzeichnis /etc/letsencrypt/renewal-hooks/deploy.
$ sudo mkdir -p /etc/letsencrypt/renewal-hooks/deploy
Erstellen Sie als Nächstes die Datei /etc/letsencrypt/renewal-hooks/deploy/coturnmit folgenden Inhalten. Ersetzen
#!/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
Machen Sie diese Datei ausführbar.
$ sudo chmod 0755 /etc/letsencrypt/renewal-hooks/deploy/coturn
Konfigurieren Sie coturn
- coturn Konfiguration wird in der Datei gespeichert /etc/turnserver.conf.
- Es stehen viele Optionen zur Verfügung, die alle in Kommentaren in der Standardkonfigurationsdatei dokumentiert sind.
- Im Folgenden finden Sie eine Beispielkonfiguration mit den empfohlenen Einstellungen (weitere Informationen zu den Einstellungen finden Sie in der Standardkonfigurationsdatei).
Verwenden Sie die folgende Datei für /etc/turnserver.conf und nehmen Sie folgende Änderungen vor:
- Ersetzen <turn.example.com> mit dem Hostnamen Ihres TURN-Servers und
- Ersetzen <example.com> mit dem Bereich Ihres TURN-Servers und
- Ersetzen <secret_value> auf einen zufälligen Wert für ein gemeinsames Geheimnis (Sie können einen durch Ausführen generieren openssl rand -hex 16)
- Ersetzen <IP> mit der externen IP Ihres TURN-Servers
Diese Konfigurationsdatei setzt voraus, dass sich Ihr TURN-Server nicht hinter NAT befindet und eine öffentliche IP-Adresse hat.
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
Wir müssen schaffen dph.pem Datei,
$ sudo mkdir -p /etc/turnserver $ sudo openssl dhparam -dsaparam -out /etc/turnserver/dhp.pem 2048
Fügen Sie die folgende systemd-Override-Datei hinzu, um das Dateihandle-Limit für den TURN-Server zu erhöhen und ihm die Möglichkeit zu geben, an Port 443 zu binden. Erstellen Sie zunächst das Verzeichnis.
$ sudo mkdir -p /etc/systemd/system/coturn.service.d
und dann dann erstellen /etc/systemd/system/coturn.service.d/override.conf mit folgenden Inhalten
[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
Konfigurieren Sie die Protokollrotation
So drehen Sie die Protokolle für coturnInstallieren Sie die folgende Konfigurationsdatei in /etc/logrotate.d/coturn
/var/log/turnserver/*.log { rotate 7 daily missingok notifempty compress postrotate /bin/systemctl kill -s HUP coturn.service endscript }
Und erstellen Sie das zugehörige Protokollverzeichnis
$ sudo mkdir -p /var/log/turnserver $ sudo chown turnserver:turnserver /var/log/turnserver
Coturn neu starten
Starten Sie den TURN-Server nach Abschluss der obigen Schritte neu
$ 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
- Stellen Sie sicher, dass die coturn hat an Port 443 mit gebunden netstat -antp | grep 443.
- Starten Sie auch Ihren TURN-Server neu und stellen Sie dies sicher coturn wird ausgeführt (und nach dem Neustart an Port 443 gebunden).
Konfigurieren Sie BigBlueButton für die Verwendung Ihres TURN-Servers
- Sie müssen bbb-web so konfigurieren, dass es die Liste der Turn-Server für den Webbrowser bereitstellt.
- Bearbeiten Sie die Datei /usr/share/bbb-web/WEB-INF/classes/spring/turn-stun-servers.xml Verwenden Sie den folgenden Inhalt und nehmen Sie Änderungen vor:
- Ersetzen Sie beide Instanzen von <turn.example.com> mit dem Hostnamen des TURN-Servers und ersetzen <secret_value> mit dem Geheimnis, in dem Sie konfiguriert haben 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>
Starten Sie Ihren BigBlueButton-Server neu, um die Änderungen zu übernehmen.
Wenn Benutzer hinter einer restriktiven Firewall eine Verbindung herstellen, die ausgehende UDP-Verbindungen verhindert, ermöglicht der TURN-Server BigBlueButton künftig, über den TURN-Server über Port 443 ihrer Firewall eine Verbindung zu FreeSWITCH und Kurento herzustellen.
Testen Sie Ihren TURN-Server
- Standardmäßig versucht Ihr Browser, über WebRTC eine direkte Verbindung zu Kurento oder FreeSWITCH herzustellen.
- Wenn keine direkte Verbindung hergestellt werden kann, wird der TURN-Server als einer der ICE-Kandidaten (Interconnectivity Connectivity Exchange) zum Weiterleiten der Medien verwendet.
- Verwenden Sie FireFox, um Ihren TURN-Server zu testen.
- Mit FireFox können Sie direkte Verbindungen deaktivieren und einen Fallback zu Ihrem TURN-Server benötigen.
- Starten Sie FireFox und öffnen Sie es about:config und suchen Sie nach 'Relais . You should see a parameter media.peerconnection.ice.relay_only . Set this value to wahr`.
- Wenn FireFox so konfiguriert ist, dass nur ein TURN-Server verwendet wird, öffnen Sie eine neue Registerkarte, nehmen Sie an einer BigBlueButton-Sitzung teil und geben Sie Ihre Webcam frei.
- Wenn Ihre Webcam angezeigt wird, können Sie überprüfen, ob FireFox Ihren TURN-Server verwendet, indem Sie eine neue Registerkarte öffnen und auswählen about:webrtc.
- Klicken show detailsund Sie sehen eine Tabelle für ICE-Statistiken.
- Die erfolgreiche Verbindung, die oben in der Tabelle angezeigt wird, sollte haben (relay-tcp)in der Spalte Lokaler Kandidat.
- Dies bedeutet, dass die Videoverbindung erfolgreich über Ihren TURN-Server weitergeleitet wurde.
- Wenn Sie jedoch beim Freigeben einer Webcam eine 1020 erhalten haben (Verbindung kann nicht hergestellt werden), kann der Browser möglicherweise keine Verbindung zum TURN-Server herstellen oder der TURN-Server wird nicht ordnungsgemäß ausgeführt oder konfiguriert.
- Überprüfen Sie die Browserkonsole in FireFox.
Wenn du siehst
WebRTC: ICE failed, your TURN server appears to be broken, see about:webrtc for more details
- Dann konnte FireFox nicht mit Ihrem TURN-Server kommunizieren oder Ihr TURN-Server wurde nicht ordnungsgemäß ausgeführt oder konfiguriert.
- Um sicherzustellen, dass Ihre Firewall keine UDP-Verbindungen über Port 443 blockiert, öffnen Sie einen neuen Tad-Besuch unter https://test.bigbluebutton.org/ , starten Sie eine Testsitzung und versuchen Sie, Ihre Webcam freizugeben.
- Der Browser kann möglicherweise keine Verbindung zum TURN-Server herstellen, oder der TURN-Server wird nicht ordnungsgemäß ausgeführt oder konfiguriert.
- Der TURN-Server fungiert auch als STUN-Server, sodass Sie zunächst überprüfen können, ob der STUN-Teil mit dem funktioniert stunclient.
- Führen Sie die folgenden Befehle aus und ersetzen Sie sie <youor-turn-server-host> mit dem Hostnamen Ihres TURN-Servers.
# apt-get install -y stuntman-client stunclient --mode full --localport 30000 <your-turn-server-host> 3478
Bei Erfolg sollte die Ausgabe für angezeigt werden stunclient sollte ähnlich wie folgt sein.
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
- Wenn Sie eine Fehlermeldung erhalten, überprüfen Sie dies coturn wird auf dem TURN-Server mit ausgeführt systemctl status coturn.service.
- Überprüfen Sie die Protokolle, indem Sie dies tun tail -f /var/log/turnserver/coturn.log.
- Sie können ausführliche Protokolle erhalten, indem Sie hinzufügen verbose zu /etc/turnserver.conf und Neustart des TURN-Servers systemctl restart coturn.service
- Sie können Ihren TURN-Server mithilfe der testen Trickle-ICE- Seite.
- Auf diese Weise erhalten Sie ein Protokoll der Relaiskandidaten, wenn diese von der ICE-Sammlung zurückgegeben werden.
- Um auf dieser Seite zu testen, müssen Sie einige Testanmeldeinformationen generieren.
- Führen Sie das folgende BASH-Skript aus und ersetzen Sie es <turn.example.com> mit dem Hostnamen Ihres TURN-Servers und <secret_value> mit dem Passwort für Ihren TURN-Server.
#!/bin/bash HOST=<turn.example.com> SECRET=<secret_value> 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
- Geben Sie die Werte in URI, Benutzername und Passwort auf der Trickle ICE-Seite ein und klicken Sie auf "Kandidaten sammeln".
- Sie sollten eine Liste der Staffelkandidaten sehen.
- Wenn Sie dies nicht tun, überprüfen Sie erneut, ob Ihr TURN-Server ausgeführt wird, und beenden Sie die Protokolle, über die der TURN-Server protokolliert tail -f /var/log/turnserver/coturn.log oder journalctl -f -u coturn.service.
Sie können ausführliche Protokolle erhalten, indem Sie hinzufügen verbose zu /etc/turnserver.conf und dann den TURN-Server neu starten systemctl restart coturn.serviceund versuchen Sie es erneut mit FireFox oder der obigen Tricke ICE-Seite.