UniFi Network Controller unter Ubuntu

Der UniFi Network Controller konfiguriert Geräte aus der UniFi-Produktfamile im Netzwerk. Dieser Blog-Artikel zeigt Euch, wie man den UniFi Network Controller unter Ubuntu Server 20.04 LTS installiert und mit Hilfe von nginx im Netzwerk verfügbar macht.

Der UniFi Network Controller

Ubiquiti ist ein amerikanischer Hersteller von Netzwerkkomponenten. Die WLAN-Produktfamilie (AccessPoints etc.) ist unter dem Namen UniFi zusammengefasst.

Zum Konfigurieren der UniFi-Produkte kommt eine Software namens UniFi Network Controller zum Einsatz. Diese webbasierte Java-Applikation kann kostenlos heruntergeladen und beispielsweise unter Windows, Linux oder macOS installiert werden.

Wir werden jetzt folgendes tun:

  1. Die aktuelle Stable-Version des UniFi Network Controller unter Ubuntu Server 20.04 LTS mit all seinen Abhängigkeiten installieren.

  2. Den Web-Server nginx installieren und so konfigurieren, dass er als Reverse-Proxy den UniFi Network Controller unter https://unifi.beispiel.de verfügbar macht.

  3. Die Ubuntu-Firewall aktivieren und so konfigurieren, dass nur noch Aufrufe über unseren neuen Reverse-Proxy möglich sind.

UniFi Network Controller einrichten

Installieren

Wir beginnen zunächst damit, Abhängigkeiten zu installieren:

$ sudo apt update && sudo apt install ca-certificates apt-transport-https openjdk-8-jre-headless

Diese Befehlskette installiert:

  • Eine Liste von Zertifizierungsstellen (certification authority, CA) für die Authentizitätsüberprüfung von TLS-Verbindungen.
  • Unterstützung für apt-Repository-Zugriffe via HTTPS (apt-transport-https).
  • Die Open JDK Laufzeitumgebung in der Version 8 (neuere Versionen werden von UniFi noch nicht unterstützt).

Als nächstes wollen wir das apt-Repository von UniFi in unserem Ubuntu-Server registrieren:

$ echo 'deb https://www.ui.com/downloads/unifi/debian stable ubiquiti' | sudo tee /etc/apt/sources.list.d/100-ubnt-unifi.list

Anschließend wird der UniFi-Signaturschlüssel importiert. Dieser wird für die Überprüfung des Installationspakets aus dem soeben registrierten apt-Repository benötigt.

$ sudo wget -O /etc/apt/trusted.gpg.d/unifi-repo.gpg https://dl.ui.com/unifi/unifi-repo.gpg 

Ist es auch der richtige Signaturschlüssel?

$ sudo apt-key fingerprint 06E85760C0A52C50

Das Ergebnis sollte in etwa so aussehen:

pub   rsa2048 2011-02-01 [SC]
      4A22 8B2D 358A 5094 1782  85BE 06E8 5760 C0A5 2C50
uid           [ unknown] UniFi Developers <unifi-dev@ubnt.com>
sub   rsa2048 2011-02-01 [E]

So, jetzt sind die Vorbereitungen abgeschlossen. Wir können die eigentliche Installation von UniFi starten:

$ sudo apt update && sudo apt install unifi

Das dauert jetzt ein Weilchen. Aber am Ende sollte der UniFi Network Controller erfolgreich gestartet sein.

Testen

Zunächst überprüfen wir den Status des UniFi-Dienstes:

$ sudo systemctl status unifi

Die Antwort sollte folgende Info enthalten:

Starting unifi...
    * Starting Ubiquiti UniFi Controller unifi
    ...done.
Started unifi.

Der UniFi Network Controller ist eine Web-Anwendung mit eingebettetem Web-Server, die standardmäßig unter http://localhost:8080 und unter https://localhost:8443 zu erreichen ist.

Probieren wir es aus:

$ wget -S --spider localhost:8080

Es sollte eine Antwort wie diese erscheinen:

Spider mode enabled. Check if remote file exists.
--2021-09-02 12:22:39--  http://localhost:8080/
Resolving localhost (localhost)... ::1, 127.0.0.1
Connecting to localhost (localhost)|::1|:8080... connected.
HTTP request sent, awaiting response...
  HTTP/1.1 302
  Set-Cookie: unifises=TRZ1MEXrDvdnRAbqKAbVZeV3T5R6khS6; Path=/; Secure; HttpOnly
  Set-Cookie: csrf_token=ptcSrbmLrRT3KecTPFIq3sw8PSfpFSlN; Path=/; Secure
  Location: /setup/
  Transfer-Encoding: chunked
  Date: Thu, 02 Sep 2021 10:22:39 GMT
  Keep-Alive: timeout=5
  Connection: keep-alive
Location: /setup/ [following]
Spider mode enabled. Check if remote file exists.
--2021-09-02 12:22:39--  http://localhost:8080/setup/
Connecting to localhost (localhost)|::1|:8080... connected.
HTTP request sent, awaiting response...
  HTTP/1.1 200
  Set-Cookie: unifises=xjOE0xeiyYrSVJxphKR42gnLOKwgMRVW; Path=/; Secure; HttpOnly
  Set-Cookie: csrf_token=22qGm4MqmSPniqPLCF74hrHqfbzdmaG4; Path=/; Secure
  X-Frame-Options: SAMEORIGIN
  Accept-Ranges: bytes
  ETag: W/"478-1622117545000"
  Last-Modified: Thu, 27 May 2021 12:12:25 GMT
  Content-Type: text/html;charset=ISO-8859-1
  Content-Length: 478
  Date: Thu, 02 Sep 2021 10:22:39 GMT
  Keep-Alive: timeout=5
  Connection: keep-alive
Length: 478 [text/html]
Remote file exists and could contain further links,
but recursion is disabled -- not retrieving.

Für einen externen Test öffne die URL http://unifi.beispiel.de:8080 in Deinen Web-Browser. Das Ergebnis sollte (nach Bestätgung der Sicherheitsabfrage, aufgrund des unsicheren TLS-Zertifikats) wie folgt aussehen:

UniFi Controller Setup

UniFi Controller Setup

Du kannst jetzt beginnen, Deinen UniFi Controller einzurichten und mit Deiner Netzwerkumgebung zu verbinden.

Troubleshooting

Konfiguration anpassen

Die wenigen Einstellungsmöglichkeiten für den eingebetteten Web-Server des UniFi-Controller finden sich hier:

sudo nano /usr/lib/unifi/data/system.properties

Ressourcen-Limits umgehen

Sollte der UniFi-Controller nicht ordnungsgemäß starten, dann erhältst mit Abschluss der Installation vielleicht eine Meldung wie diese hier:

Job for unifi.service failed because a timeout was exceeded.
See "systemctl status unifi.service" and "journalctl -xe" for details.

Es bietet sich ein Blick in die Log-Datei an:

$ sudo nano /usr/lib/unifi/logs/server.log

Finden sich dort Einträge wie diese hier

std::exception::what(): Resource temporarily unavailable

dann hast Du sehr wahrscheinlich Probleme mit Ressourcen-Limits auf Deinem Ubuntu-System. Die Kennzahl hier ist die maximal erlaubte Anzahl von Prozessen (Option TasksMax) für eine Prozessgruppe wie Unifi. Den aktuellen Wert erhältst Du durch folgenden Aufruf:

$ systemctl show unifi.service | grep TasksMax

Unter Ubuntu beträgt dieser Wert standardmäßig 15% der Maximalanzahl aktiver Prozesse im System. Kostengünstige virtuelle Linux-Server in der Cloud haben oft einen sehr kleinen Wert (60 ist bisher der kleinste, der mir begegnet ist).

Du kannst den Wert erhöhen (z.B. auf 1024):

$ sudo systemctl set-property unifi.service TasksMax=1024

Oder Du kannst die Grenze ganz aufheben:

$ sudo systemctl set-property unifi.service TasksMax=infinity

Starte anschließend den UniFi-Dienst neu:

$ sudo systemctl restart unifi

UniFi-Dokumentation

Folgende Artikel aus dem Ubiquiti Support and Help Center sind interessant:

Reverse-Proxy mit nginx einrichten

Der UniFi-Controller ist direkt im Netzwerk erreichbar. Das ist nicht optimal, da wir es hier mit einem eingebetteten Web-Server zu tun haben, dessen Konfigurationsmöglichkeiten doch arg eingeschränkt sind.

Besser ist folgende Strategie:

  • Wir installieren einen Reverse-Proxy, der die Kommunikation mit der Außenwelt übernimmt. Ein Reverse-Proxy nimmt Anfragen aus dem Internet bzw. Netzwerk entgegen und leitet sie an den passenden internen Serverdienst weiter. Der Serverdienst selbst, in unerem Fall der UniFi Network Controller, muss somit nicht direkt im Internet erreichbar sein. Der Reverse-Proxy agiert als sein Stellvertreter und übernimmt die gesamte Komunikation mit externen Clients (z.B. einem Web-Browser).

Das hat folgende Vorteile:

  • Die Kommunikation nach außen kann mit einem dedizierten WebServer wie nginx oder Apache durchgeführt werden, der nach allen Regeln der Kunst konfiguriert und mittels https abgesichert werden kann.

  • Die lokale Kommunikation zwischen Reverse-Proxy und UniFi dagegen erfolgt lokal auf dem Server. Die Konfigurationsanforderungen an den UniFi-Web-Server bleiben somit minimal.

Als Reverse-Proxy nutzen wir nginx. Der nginx Web-Server ist ein Open Source-Projekt und wird besonders gern als Reverse Proxy eingesetzt.

Zunächst führen wir eine Installation von nginx durch, legen eine Standardwebseite für die Domäne unifi.beispiel.de unter /etc/nginx/conf.d/de.beispiel.unifi.conf an und sichern den Zugriff per Cerbot/HTTPS ab. Dieser Workflow ist ausführlich im Artikel HTTPS unter nginx/Ubuntu beschrieben.

Anschließend öffnen wir unsere soeben angelegte Konfigurationsdatei erneut:

$ sudo nano /etc/nginx/conf.d/de.beispiel.unifi.conf

Wir ersetzen den Inhalt wie folgt:

server {
   server_name  unifi.beispiel.de;

   # UniFi Websockets Support
   location /wss/ {
	   proxy_pass https://localhost:8442;
	   proxy_http_version 1.1;
	   proxy_set_header Host $host;
	   proxy_set_header Upgrade $http_upgrade;
	   proxy_set_header Connection "Upgrade";
   }

   # UniFi Reverse Proxy
   location / {
	   proxy_pass https://localhost:8442/;
       proxy_set_header Host $host;
       proxy_set_header X-Forwarded-Proto $scheme;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
       proxy_buffering off;   
   }
   
   listen 443 ssl http2; # managed by Certbot
   ssl_certificate /etc/letsencrypt/live/unifi.beispiel.de/fullchain.pem; # managed by Certbot
   ssl_certificate_key /etc/letsencrypt/live/unifi.beispiel.de/privkey.pem; # managed by Certbot
   include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
   ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
   if ($host = unifi.beispiel.de) {
	   return 301 https://$host$request_uri;
   } # managed by Certbot

   listen       80;
   server_name  unifi.beispiel.de;
   return 404; # managed by Certbot
}

Speichere Deine Änderung und starte nginx neu:

$ sudo systemctl reload nginx

Was haben wir gemacht?

Wir haben den ersten Server-Block unter nginx so umkonfiguriert, dass er auf https://unifi.beispiel.de horcht und alle Anfragen lokal an https://localhost:8433 weiterleitet. Dies umfasst auch die Kommunikation via Web-Sockets. Mehr Infos zum Thema NGINX als WebSocket-Proxy findest Du in diesem Blog-Artikel auf der nginx-Webseite.

Firewall

Als letzte Maßnahme wollen wir die Ubuntu-Firewall konfigurieren, um die direkten Aufrufe http://unifi.beispiel.de:8080 und https://unifi.beispiel.de:8443 zu unterbinden.

Die Installation erfolgt wie folgt:

$ sudo apt install ufw

Standardmäßig ist die Firewall deaktiviert. Wir konfigurieren sie (beispielhaft) wie folgt und aktivieren sie anschließend.

$ sudo ufw default deny incoming
$ sudo ufw allow ssh
$ sudo ufw allow http
$ sudo ufw allow https
$ sudo ufw allow 3478/udp
$ sudo ufw allow 8080/tcp
$ sudo ufw allow 6789/tcp
$ sudo ufw enable

Was haben wir gemacht?

Wir haben zunächst alle einkommenden Anfragen geblockt. Anschließend haben wir die Protokolle ssh (Port 22), http (Port 80) und https (Port 443) wieder geöffnet. Die weiteren Ports ergeben sich aus der UniFi-Dokumentation und können zum Teil auch weggelassen werden. Zu guter Letzt haben wir die Firewall aktiviert.

Noch ein paar Tipps:

  • Status der Firewall abfragen:

    $ sudo ufw status
    
  • Die Firewall wieder deaktivieren:

    $ sudo ufw disable
    

Abschließende Diskussion

In der Regel ist der UniFi-Controller in einem lokalen Netzwerk installiert, nämlich dort, wo sich auch die WLAN-Geräte befinden.

Um den UniFi-Controller im Web verfügbar zu machen, muss im lokalen Netzwerk ein Gateway vorhanden sein. Dieses Gateway muss eine öffentliche IP-Adresse intern so auflösen, dass sie bei unserem Ubuntu Server ankommt. Ist dies nicht der Fall, können wir keine TLS-Zertifikate von Let’s Encrypt nutzen.

Alternativen in diesem Fall wären:

  • Nutzung eines selbstsignierten Zertifikats. Kann z.B. mittels OpenSSL ausgestellt werden.

  • Nutzung eines von einer eigenen privaten Zertifizierungsstelle ausgestellten TLS-Zertifikats. Dies setzt eine passende PKI (Public-Key-Infrastruktur) voraus.

Das könnte dich auch interessieren:
  1. HTTPS unter Apache/Ubuntu
  2. Ubuntu Server 18.04 installieren
Teile diesen Artikel
comments powered by Disqus