USG Konfiguration am Unifi Controller ablegen

In den letzten Blog-Einträgen habe ich beschrieben, wie man am Unifi USG Einstellungen vornehmen kann, die über den Unifi Controller nicht möglich sind. Diese Änderungen sind jedoch nicht permanent und werden bei der nächsten Provisionierung des USG überschrieben. Damt das nicht passiert, kann man die manuell erzeugten Teile der Konfiguration exportieren und am Unifi Controller ablegen, damit diese beim Provisionieren auch auf das USG geschrieben werden.

Dabei ist jedoch mit extemer Vorsicht vorzugehen, wenn man hier etwas falsch macht und das USG die gesendete Konfiuration nicht verarbeiten kann, wird das unweigerlich zu Problemen führen!

Der Export erfolgt über SSH direkt am USG

admin@usg-irgendwo:~$ mca-ctrl -t dump-cfg > x.txt
admin@usg-irgendwo:~$

Aus dem mehr oder weniger langen JSON-File kopiert man sich den Teil heraus, den man am Controller ablegen möchte, in meinem Fall z.B. die DynDNS-Settings:

"service": {
  "dns": {
    "dynamic": {
      "interface": {
        "eth0": {
          "service": {
            "noip1": {
              "host-name": [ "hostname1.ddns.net" ],
              "login": "[email protected]",
              "password": "[email protected],
              "protocol": "noip",
              "server": "dynupdate.no-ip.com"
            },
            "noip2": {
              "host-name": [ "hostname2.ddns.net" ],
              "login": "[email protected]",
              "password": "[email protected]",
              "protocol": "noip",
              "server": "dynupdate.no-ip.com"
            }
          },
          "web": "dyndns"
        }
      }
    }
  }
}

Die am Controller zu erstellende JSON Datei muss in folgendem Folder abgelegt werden: <unifi_base>/data/sites/site_ID

<unifi-base> ist das Verzeichnis, in dem der Controller installiert wurde, bei meiner Installation unter Windows ist das "C:\Users\<Username>\Ubiquiti UniFi". Der komplette Pfad lautet unter Windows also "C:\Users\<Username>\Ubiquiti UniFi\data\sites\default", sofern man die Default-Site verwendet, andernfalls ist als letzte Ebene der Name der Site zu verwenden. 

Das Verzeichnis einfach anlegen hat bei mir nicht funktioniert, die Konfiguration wurde beim Provisionieren nicht an das USG gesendet. Im Unifi Forum habe ich dann gelesen, dass man einen Floorplan erstellen muss, dann werden alle Verzeichnisse richtig erzeugt. Des geschieht im Unifi-Controller am Reiter Maps:

Ich habe einen neuen Floorplan erstellt und wieder gelöscht, dann waren die Verzeichnisse vorhanden.

Im Verzeichnis "C:\Users\<Username>\Ubiquiti UniFi\data\sites\default" nun eine Datei mit dem Namen "config.gateway.json" mit folgendem Inhalt erstellen:

{
  "service": {
    <hier den aus dem x.txt herauskopierten Inhalt einfügen>
  }
}

Die config.gateway.json sollte dann so aussehen:

{
  "service": {
    "service": {
      "dns": {
        "dynamic": {
          "interface": {
            "eth0": {
              "service": {
                "noip1": {
                  "host-name": [ "hostname1.ddns.net" ],
                  "login": "[email protected]",
                  "password": "[email protected]",
                  "protocol": "noip",
                  "server": "dynupdate.no-ip.com"
                },
                "noip2": {
                  "host-name": [ "hostname2.ddns.net" ],
                  "login": "[email protected]",
                  "password": "[email protected]",
                  "protocol": "noip",
                  "server": "dynupdate.no-ip.com"
                }
              },
              "web": "dyndns"
            }
          }
        }
      }
    }
  }
}

Wenn man damit fertig ist, am Besten die Syntax mit einem JSON Formatter (z.B. https://jsonformatter.curiousconcept.com/) überprüfen, bevor das USG mit der neuen Konfiguration provisioniert wird. Bei zukünftigen Konfigurationsänderungen über den Unifi Controller werden diese Settings nun berücksichtigt.

Unifi USG: mehrere DynDNS Einträge beim selben Provider

Der Unifi Controller ist ein umfangreiches Tool zum Konfigurieren aller Unifi-Komponenten im Netz, aber wie jede Software hat auch er seine Schwächen. Es sind zum Beispiel nicht alle Funktionen die das USG bietet, via Controller konfigurierbar. Oder sie sind nur eingeschränkt konfigurierbar.

Zum Beispiel kann für Dynamic DNS pro Provider nur ein Hostname im Controller eingerichtet werden. Natürlich habe ich zwei Hostnamen beim gleichen Provider. Jetzt wäre eine Möglichkeit gewesen, mit einen der beiden Hostnamen zu einem andern Provider zu wechseln - wollte ich aber nicht und so habe zu suchen begonnen ob es nicht doch eine Möglichkeit gibt, am Unifi USG mehrere Hostnamen beim selben DynDNS-Provider upzudaten. Und ich wurde fündig.

Dazu muss man via SSH direkt am USG einsteigen und das Konfigurations-Tool starten:

admin@usg-irgendwo:~$ configure
[edit]

Nun folgende Zeile eingeben und am Ende 2x Tab drücken, dann bekommt man alle definierbaren Settings angezeigt (hier anhand des Providers NOIP, will man einen anderen Provider, dann einfach nach "service" 2x Tab und man bekommt alle im USG vorhandenen Provider angezeigt):

admin@usg-irgendwo# set service dns dynamic interface eth0 service noip
Possible completions:
  host-name     Hostname registered with DDNS service [REQUIRED]
  login         Login for DDNS service [REQUIRED]
  options       Additional options for ddclient. You must use the ddclient
                configuration syntax as the text is added directly to ddclient
                configuration file without any syntax checking.
  password      Password for DDNS service [REQUIRED]
  protocol      ddclient protocol used for DDNS service [REQUIRED FOR CUSTOM]
  server        Server to send DDNS update to [REQUIRED FOR CUSTOM]

Nun konnte ich den ersten DynDNS-Hostnamen konfigurieren:

admin@usg-irgendwo# set service dns dynamic interface eth0 service noip1 host-name hostname1.ddns.net
[edit]
admin@usg-irgendwo# set service dns dynamic interface eth0 service noip1 login [email protected]
[edit]
admin@usg-irgendwo# set service dns dynamic interface eth0 service noip1 password [email protected]
[edit]
admin@usg-irgendwo# set service dns dynamic interface eth0 service noip1 protocol noip
[edit]
admin@usg-irgendwo# set service dns dynamic interface eth0 service noip1 server dynupdate.no-ip.com
[edit]

Für den zweiten Hostnamen vergibt man nach "service" einfach einen anderen Namen:

admin@usg-irgendwo# set service dns dynamic interface eth0 service noip2 host-name hostname2.ddns.net
[edit]
admin@usg-irgendwo# set service dns dynamic interface eth0 service noip2 login [email protected]
[edit]
admin@usg-irgendwo# set service dns dynamic interface eth0 service noip2 password [email protected]
[edit]
admin@usg-irgendwo# set service dns dynamic interface eth0 service noip2 protocol noip
[edit]
admin@usg-irgendwo# set service dns dynamic interface eth0 service noip2 server dynupdate.no-ip.com
[edit]

Um sicher zu stellen, dass das USG nicht seine eigene WAN-Adresse registriert sondern die tatsächliche öffentliche Adresse eines vorgelagerten Modems, kann man ihn dazu zwingen die eigene öffentliche Adresse via Web-Abfrage zu ermitteln:

admin@usg-irgendwo# set service dns dynamic interface eth0 web dyndns
[edit]

Die konfigurierten Einstellungen können wie folgt angezeigt und kontrolliert werden:

admin@usg-irgendwo# show service dns dynamic interface eth0
+service noip1 {
+    host-name hostname1.ddns.net
+    login [email protected]
+    password [email protected]
+    protocol noip
+    server dynupdate.no-ip.com
+}
+service noip2 {
+    host-name hostname2.ddns.net
+    login [email protected]
+    password [email protected]
+    protocol noip
+    server dynupdate.no-ip.com
+}
+web dyndns
[edit]

Die Settings müssen gespeichert werden:

admin@usg-irgendwo# commit
[edit]
admin@usg-irgendwo# save
Saving configuration to '/config/config.boot'...
Done
[edit]
admin@usg-irgendwo# exit
admin@usg-irgendwo:~$

Das Schöne dabei ist: wenn man WAN-Failover konfiguriert hat, werden bei einem Failover die DynDNS Hostnamen automatisch aktualisiert (was lustiger Weise genau während dem Schreiben dieses Artikels passiert ist).

Damit die DynDNS-Einstellungen beim nächsten Provisionieren des USG via Unifi-Controller nicht verloren gehen, müssen die diese exportiert und am Unifi-Controller abgelegt werden. Dazu folgt demnächst ein eigener Blog-Eintrag.

Unifi USG WAN Failover

Das Unifi USG ist beim WAN Failover aus meiner bescheidenen Sicht etwas übereifrig beim Umschalten. So kommt es mehr oder weniger täglich vor, dass binnen einer Minute ein Failover von WAN auf WAN2 erfolgt und in der selben Minute wieder von WAN2 auf WAN zurück geschaltet wid: 

WAN iface [eth0] transition to state [inactive]	19:36	01-02-2021
WAN iface [eth2] transition to state [active]	19:36	01-02-2021
WAN iface [eth0] transition to state [active]	19:36	01-02-2021
WAN iface [eth2] transition to state [failover]	19:36	01-02-2021

Im Unifi-Controller kann man da gar nichts konfigurieren, dies geht nur über SSH direkt am USG. Die LoadBalancer-Konfiguration bzw. den Status kann man mit folgenden Befehlen anzeigen lassen:

admin@usg-irgendwo:~$ show load-balance watchdog
Group wan_failover
  eth0
  status: Running
  pings: 353
  fails: 4
  run fails: 0/3
  route drops: 11
  ping gateway: ping.ubnt.com - REACHABLE
  last route drop   : Mon Feb  1 20:21:12 2021
  last route recover: Mon Feb  1 20:21:49 2021

  eth2
  status: Running
  failover-only mode
  pings: 230
  fails: 11
  run fails: 0/3
  route drops: 6
  ping gateway: ping.ubnt.com - REACHABLE
  last route drop   : Mon Feb  1 20:41:24 2021
  last route recover: Mon Feb  1 20:41:48 2021

 

admin@usg-irgendwo:~$ show load-balance status
Group wan_failover
  interface   : eth0
  carrier     : up
  status      : active
  gateway     : 192.168.0.1
  route table : 201
  weight      : 100%
  flows
      WAN Out : 795000
      WAN In  : 174000
    Local Out : 6466

  interface   : eth2
  carrier     : up
  status      : failover
  gateway     : 192.168.1.1
  route table : 202
  weight      : 0%
  flows
      WAN Out : 7339
      WAN In  : 0
    Local Out : 70

Zur Prüfung der WAN-Verbindung wird also "ping.ubnt.com" angepingt. Geht das 3 Mal schief (run fails) wird umgeschaltet. Hier kann man die Konfiguration natürlich auch ändern, aber man sollte zumindest ungefähr wissen was man da gerade macht, sonst steht man vielleicht schnell ohne funktionierende WAN-Verbindung da ;-)

Konfiguration starten:

admin@usg-irgendwo:~$ configure
[edit]

Ändern des Pingziels:

admin@usg-irgendwo# set load-balance group wan_failover interface eth0 route-test type ping target
Possible completions:
  <x.x.x.x>     IPv4 address to ping
  <h:h:h:h:h:h:h:h>
                Ipv6 address to ping

Beispiel anhand des CloudFlare DNS als Pingziel: 

admin@usg-irgendwo# set load-balance group wan_failover interface eth0 route-test type ping target 1.1.1.1

Das Ping-Intervall kann wie folgt konfiguriert werden:

admin@usg-irgendwo# set load-balance group wan_failover interface eth0 route-test interval
Possible completions:
  <1-65535>     Ping interval in seconds (default 10)

Befehl zum festlegen der Anzahl an Ping-Fehlversuchen bis ein WAN-Failover eingeleitet wird:

admin@usg-irgendwo# set load-balance group wan_failover interface eth0 route-test count failure
Possible completions:
  <1-65535>     Number of failures before link is down (default 3)

Einstellen der Anzahl an erfolgreichen Pings bis wieder zurück geschaltet wird:

admin@usg-irgendwo# set load-balance group wan_failover interface eth0 route-test count success
Possible completions:
  <1-65535>     Number of successful pings for link up (default 3)

Die oben angeführten Einstellungen kann man für beide WAN Adapter (eth0 und eth2) getrennt vornehmen.

Hat man alle Settings bereit müssen sie abgesegnet werden:

admin@usg-irgendwo# commit
[edit]
admin@usg-irgendwo# save
Saving configuration to '/config/config.boot'...
Done
[edit]

Damit die Konfiguration beim nächsten Provisioning nicht überschrieben wird, muss diese noch exportiert und am Unifi-Controller abgelegt werden. Wie das genau funktioniert soll aber Inhalt eines der nächsten Beiträge sein.