WiFi-Grundeinrichtung mit MikroTik CAPsMAN

Die WLAN-Einrichtung mit MikroTik ist nicht wirklich intuitiv. Deshalb habe ich hier mal meine Installation „verewigt“.
Das Schöne bei MikroTik ist ja, dass sehr viel konfiguriert werden kann, und das nicht ganz so Schöne ist, dass auch alles konfiguriert werden muss - z.B. auch die einzelnen Kanal-Frequenzen der Funkbänder, die benutzt werden sollen.

Dieses Kochbuch beruht auf mehr oder weniger großen Fragmenten von folgenden Seiten:
WLAN zentral verwalten mit CAPsMAN - Florian Effenberger
MikroTik Tutorials - jcutrer.com
Mikrotik WiFi Trick: Firmware Upgrade | comphilip

Es sind einige Anleitungen zu finden, allerdings ist meistens nicht die einfache Variante dabei: LAN und WLAN ist ein Netz. In diesem Beispiel sieht die Konfiguration folgendermaßen aus:

 Polarhome (Router)       -->  AP1 (AccessPoint)
 Modell hEX PoE                Modell wAP ac
 eth1  | bridge (eth2-5)  -->  bridge (eth1 PoE)
 dhcp  | 192.168.199.1/24 -->  192.168.199.10/24

Per default ist ein MikroTik-Router unter 192.168.88.1 erreichbar, und der AccessPoint benutzt ebenso einen Standard-RouterOS mit voreingestellter Trennung eth1 (dhcp) + eth2 (interne Brigde). Dies ist für meine Konfiguration sinnlos, weil ich eth1 zur Stromversorgung (PoE) nutzen möchte, der Anschluss im normalen Home-Netz werkeln soll und der AccessPoint nur als solcher betrieben wird - gesteuert durch den „richtigen“ Router.
Sollte das Gerät noch eine alte Konfiguration haben, lässt sich ein Factory-Reset folgendermaßen durchführen:

Stromversorgung trennen
Reset-Taste gedrückt halten
Stromversorgung anschließen
Die Reset-Taste 5 Sekunden halten (usr fängt an zu blinken), dann los lassen und rund 1 Minute warten

Access-Point Konfiguration

Mit Kabel an eth2 verbinden - der Rechner bekommt eine IP-Adresse im 192.168.88.0/24 Netz zugewiesen.

ssh admin@192.168.88.1

Je nach OS-Version, kommt die Aufforderung, das admin-Passwort zu setzen, oder via

[admin@MikroTik] > password
old-password: 
new-password: ****************
confirm-new-password: ****************

Danach hängt ggf. das Terminal - einfach eine neue ssh-session nutzen.
Jetzt die Bridge und IP-Config:

/ip dhcp-client disable [find]    # hier reicht ein simples find, weil es nur einen Eintrag gibt.
/interface bridge port add bridge=bridge interface=ether1
/system identity set name="AP1"
/ip address add address=192.168.199.10/24 comment="static bridge ip" interface=bridge network=192.168.199.0
/ip dns set allow-remote-requests=yes servers=192.168.199.1
/ip dns static remove [find address=192.168.88.1]
/ip route add distance=1 gateway=192.168.199.1
/ip dhcp-server disable [find]
/ip dhcp-server network remove [find address=192.168.88.0/24 ]
/ip address remove [find comment=defconf ]

Spätestens jetzt hängt die Verbindung - falls schon vorher, müssen die fehlenden Kommandos in der nächsten ssh-session nachgeholt werden.
Die IP Adresse für das „richtige“ Netz händisch setzen - unter Linux z.B. (richtigen Device Namen verwenden) mittels

sudo ip address add 192.168.199.99/24 dev eth0

Weitere Firewall- und CAPsMAN-Konfiguration - der AccessPoint verbindet sich mit dem CAPsMAN, der mit dem Zertifikat CAPsMAN aufwartet, und lässt sich von diesem konfigurieren.

/ip firewall filter add action=accept chain=input comment="capsman" in-interface=bridge protocol=udp src-address=192.168.199.1 src-port=5246,5247,5678 place-before=[find comment="defconf: accept to local loopback (for CAPsMAN)"]
/ip firewall filter set disabled=yes [find comment="defconf: accept to local loopback (for CAPsMAN)"]

# diese AccessPoint hat zwei WLAN-Interfaces (2,4 + 5 GHz)
/interface wireless cap set caps-man-certificate-common-names=CAPsMAN certificate=request discovery-interfaces=bridge enabled=yes interfaces=wlan1,wlan2 lock-to-caps-man=yes

Kontrolle mit

export

Nun ist der AccessPoint soweit vorbereitet und kann runter gefahren werden (weil er danach über eth1 mittels PoE am Router betrieben wird):

/system shutdown

Routerkonfiguration

eth1 an’s Netzwerk (dhcp) - Rechner an eth2.
Grundkonfiguration:

ssh admin@192.168.88.1
Change your password
new password> ****************
repeat new password> ****************
Password changed
/system identity set name="PolarHome"
/system clock set time-zone-name=Europe/Berlin
/ip address add address=192.168.199.1/24 comment="static bridge ip" interface=bridge network=192.168.199.0
/ip pool add name=dhcp ranges=192.168.199.129-192.168.199.223
/ip dhcp-server add address-pool=dhcp disabled=no interface=bridge name=dhcpd
/ip dhcp-server network add address=192.168.199.0/24 comment=LAN gateway=192.168.199.1 netmask=24
/ip dhcp-server remove [find name=defconf]
/ip dns set allow-remote-requests=yes
/ip dns static add address=192.168.199.1 comment=PolarHome name=polarhome.lan
/ip dns static add address=192.168.199.10 comment=AP1 name=ap1.lan
/ip dns static remove [find address=192.168.88.1]
/ip dhcp-server network remove [find comment=defconf]
/ip address remove [find comment=defconf ]

Wie schon beim AccessPoint, ist spätestens jetzt die ssh-session tot .
Es sollte jetzt eine IP-Adresse aus dem 192.168.199.0/24-Netz per dhcp verteilt werden (sonst IP aus dem Netz händisch setzen und weiter konfigurieren).
Zur Bequemlichkeit hinterlege ich zuerst meinen public ssh-key:

scp ~/.ssh/id_rsa.pub admin@192.168.199.1:mykey.pub
ssh admin@192.168.199.1
/user ssh-keys import public-key-file=mykey.pub user=admin

/user ssh-keys print
Flags: R - RSA, D - DSA 
 #   USER                       BITS KEY-OWNER
 0 R admin                      4096 poladmin

Ab jetzt kann die ssh-Verbindung ohne Passwort-Eingabe erfolgen.
Firewall konfigurieren (Achtung! Die Firewallregeln kontrollieren und ggf. anpassen):

/ip firewall filter add action=accept chain=input comment="accept CAPsMAN->LAN" in-interface=bridge protocol=udp src-port=5246,5247 place-before=[find comment="defconf: accept to local loopback (for CAPsMAN)"]
/ip firewall filter add action=accept chain=input comment="accept LAN->CAPsMAN" dst-port=5246,5247 in-interface=bridge protocol=udp place-before=[find comment="defconf: accept to local loopback (for CAPsMAN)"]

Zertifikate erstellen (10 Jahre gültig - die Erstellung dauert etwas):

/certificate add name="CAPsMAN CA" common-name="CAPsMAN CA" key-usage=key-cert-sign,crl-sign key-size=4096 days-valid=3650
/certificate add name="CAPsMAN" common-name="CAPsMAN" key-size=4096 days-valid=3650
/certificate sign "CAPsMAN CA" name="CAPsMAN CA"
/certificate sign "CAPsMAN" ca="CAPsMAN CA" name="CAPsMAN"
/certificate set "CAPsMAN CA" trusted=yes
/caps-man manager set enabled=yes certificate="CAPsMAN" ca-certificate="CAPsMAN CA"

CAPsMAN Konfiguration (SSID MAD im 2,4 und 5GHz Band):
Achtung! Die Config ist für den Home-Bereich, wo sich die Clients untereinander sehen!

/caps-man manager set enabled=yes upgrade-policy=suggest-same-version
/caps-man channel add band=5ghz-n/ac control-channel-width=20mhz extension-channel=XX frequency=5180,5200,5220,5240,5745,5765,5785,5805,5825 name=5Ghz-Channels skip-dfs-channels=yes
/caps-man channel add band=2ghz-g/n control-channel-width=20mhz extension-channel=disabled frequency=2412,2437,2462 name=2.4Ghz-Channels
/caps-man datapath add bridge=bridge client-to-client-forwarding=yes local-forwarding=yes name=datapath1

/caps-man configuration add channel=5Ghz-Channels country=germany datapath=datapath1 distance=dynamic installation=any mode=ap name=MAD-5G ssid=MAD
/caps-man configuration add channel=2.4Ghz-Channels country=germany datapath=datapath1 distance=dynamic installation=any mode=ap name=MAD-2.4Ghz ssid=MAD

/caps-man configuration add channel=5Ghz-Channels country=germany datapath=datapath1 distance=indoors installation=any mode=ap name=MAD-5Ghz ssid=MAD datapath.client-to-client-forwarding=yes security.authentication-types=wpa2-psk security.encryption=aes-ccm security.group-encryption=aes-ccm security.passphrase="geheimh0ch2"
/caps-man configuration add channel=2.4Ghz-Channels country=germany datapath=datapath1 distance=indoors installation=any mode=ap name=MAD-2.4Ghz ssid=MAD datapath.client-to-client-forwarding=yes security.authentication-types=wpa2-psk security.encryption=aes-ccm security.group-encryption=aes-ccm security.passphrase="geheimh0ch2"

/caps-man provisioning add action=create-dynamic-enabled hw-supported-modes=ac master-configuration=MAD-5Ghz
/caps-man provisioning add action=create-dynamic-enabled hw-supported-modes=gn master-configuration=MAD-2.4Ghz

Damit gibt es die Konfigurationen, die aber noch nicht dem jeweiligen cap-Interfaces zugewiesen sind. Somit ist auch noch kein Funknetzwerk vom AccessPoint sichtbar.
Konfigurationswerte können auch mehrfach vorkommen. Zuweisungen vom Channel überschreiben die gleichen Parameter in der Config. Die Parameter, die einem Interface zugeordnet sind, überschreiben wiederum die vorher definierten Parameter.

In der GUI vom Router sollten die zwei caps-Interfaces angezeigt werden (jeweils eins für die 2,4-GHz- und für die 5GHz-Schnittstelle):

caps-Interfaces

In der GUI des AccessPoints ist unter Wireless -> WiFi Interfaces zu sehen, welche Mac-Adresse welchem Frequenzband entspricht (vergleiche mit den Einträgen unter CAPsMAN -> Radio beim Router).

2.4-GHz zuweisen (ist das Interface cap1 bei mir):

/caps-man interface set [find name=cap1] configuration=MAD-2.4Ghz comment="AP1 2.4GHz"

Bei Fehlern lässt sich die Zuweisung übrigens löschen mit:

/caps-man interface unset [find name=cap1] configuration 

Jetzt ist das WLAN-Netz im 2.4GHz Bereich sichtbar.
In der Web-GUI vom AccessPoint wird die SSID nun auch angezeigt:

WiFi Interfaces

Das gleiche mit dem 5GHz Band:

/caps-man interface set [find name=cap2] configuration=MAD-5Ghz comment="AP1 5GHz"

Damit ist das WLAN funktional!
Änderungen an der Config werden z.B. so gesetzt (hier Distance von indoor auf dynamic umstellen):

/caps-man configuration set [find name=MAD-5Ghz] distance=dynamic

Updates für AccessPoints

Durch „upgrade-policy=suggest-same-version“ sollte der AP ja die gleiche RouterOS-Version bekommen wie der Router, auf dem CAPsMAN läuft.
Allerdings läuft der hEX PoE mit einer Mips-CPU und der AccessPoint mit einer Arm-CPU, dadurch werden für das Auto-Update extra Arm-Pakete und Platz dafür auf dem Router benötigt.
CPU-Architektur usw. anzeigen mit:

/system resource print

Einen USB-Stick mit MBR + fat32 formatieren und am Router einstecken (Achtung - unbedingt das richtige Device nehmen - sonst „Grande Malheur de Kack“ ) - z.B.

sudo fdisk /dev/sdb
# new primary partition type 0b W95 FAT32

sudo mkfs.vfat -F 32 -n UPDATES /dev/sdb1

Mit dem file-Befehl ist zu sehen, worunter der USB-Stick gemounted wird (z.B. disk1).

/file print 
 # NAME                             TYPE                                  SIZE CREATION-TIME       
 0 disk1                            disk                                       jan/01/1970 02:00:00
 1 flash                            disk                                       jan/01/1970 02:00:07
...

Update-Verzeichnis anlegen:

lftp admin@192.168.199.1:/disk1
Passwort: 
Verzeichniswechsel OK, cwd=/disk1                           
lftp admin@192.168.199.1:/disk1> mkdir updates
mkdir OK, »updates« erzeugt

In diesem Fall ist der Router auf Version 6.49 und der AP auf 6.46.8 - also die Arm-Version runterladen und auf dem USB-Stick kopieren:

wget https://download.mikrotik.com/routeros/6.49/routeros-arm-6.49.npk

lftp -e "put routeros-arm-6.49.npk" admin@192.168.199.1:/disk1/updates/ 
Passwort: 
Verzeichniswechsel OK, cwd=/disk1/updates                            
12637396 Bytes übertragen in 2 Sekunden (6.09 MiB/s)

Auf dem Router jetzt noch das Update-Verzeichnis konfigurieren:

/caps-man manager set package-path="/disk1/updates"

/caps-man manager print
                   enabled: yes
               certificate: CAPsMAN
            ca-certificate: CAPsMAN CA
              package-path: /disk1/updates
            upgrade-policy: suggest-same-version
  require-peer-certificate: no

Und voilà, der AccessPoint wird sofort geupdated, was etwas dauert, und danach ist er mit Version 6.49 am Start!