Montag, 31. Januar 2022

OpenWrt upgrade WRT1900ACS (WRT3200ACM) auf DSA network config

 ... das Ende vom Lied: ich habe das Meiste erstmal interaktiv und wenig mit Scripten gemacht - man kann nicht alles theoretisch vordenken. Und ich wollte die Standard Konfiguration erkunden, erweitern und nicht kaputt machen. Nach dem eigentlichen Upgrade habe ich doch ein paar Scripte gemacht die vielleicht nützlich sind.

Das eigentliche Ziel: Update der OpenWrt Firmware mit Reset der Einstellungen, wie es bei manchem Router beim Wechsel von 19.07 auf 21.02 gemacht werden muss. Dabei sollen die Netzwerkkomponenten nicht durcheinander geraten und nach kurzer Zeit alles wieder funktionsfähig sein.

Fast zeitgleich wurde mein DSL Anschluss erneuert - ich habe jetzt vollwertig IPv4 und IPv6. In der default Konfiguration funktioniert ein OpenWrt Router auch nach einer Fritzbox für IPv6. Die Fritzbox muss für einen weiteren Router konfiguriert werden: Dokument von AVM.

Wichtig zur Vorbereitung: Backup und extra ein export der network und wireless Konfiguration sowie der DHCP static leases.

Der grobe Ablauf:

  1. Direktverbindung mit Linux oder Windows Notebook zum LAN Port herstellen
  2. Wifi Netzwerke deaktivieren
  3. Alle anderen Kabelverbindungen entfernen
  4. DHCP Leases, network und wireless export auf Notebook sichern (geht am Linux Notebook etwas eleganter)
  5. Upload Firmware starten, die Warnungen sind kryptisch: Haken aus "Konfiguration behalten" rausnehmen und bei force einen Haken setzen. Noch dem Neustart ist Router unter 192.168.1.1 erreichbar!
  6. Wiederherstellung der Konfiguration manuell und mit script.

Ich habe hier bewusst kein Script was komplett durchläuft. Nach einer Änderung kann man immer alles erst überprüfen, eventuell zurücknehmen und dann bewusst speichern und aktivieren. Sollte was schief gehen: man war eh bei null - also einfach Werksreset und nochmal von vorn.

Netzwerk IP setzen

Es ist nicht unproblematisch die IP Adresse des Netzwerkes im Router zu ändern mit der man gerade verbunden ist. Luci hat ein Fallback für Konfigurationsfehler, man muss die Weboberfläche innerhalb 30 sec wieder verbinden ansonsten wird ein revert ausgeführt. Das ist stressig mit neuer IP und neuem Browserfenster!

In der Konsole funktioniert es zuverlässig - aber nach meiner Erfahrung nur so "isoliert" im Dreizeiler.

uci set network.lan.ipaddr="192.168.56.1"
uci commit network
service network restart

Nach wenigen Sekunden schließt sich die ssh Konsole und man kann sich mit neuer IP neu verbinden.

Anmerkung: Luci löscht bei der Änderung der Lan IP Adresse auch noch den default Wert ra_slaac='1' uci del dhcp.lan.ra_slaac Muss ich noch schauen ob es relevant ist.

Hostname, Zeitzone und Passwort

Das Passwort wird vor dem Neustart der Services (reload_config) interaktiv geändert.

uci batch << EOI
set system.@system[0].zonename='Europe/Berlin'
set system.@system[0].timezone='CET-1CEST,M3.5.0,M10.5.0/3'
set system.@system[0].hostname='wrt3200'
EOI
uci commit
reload_config
passwd

Wifi

Jetzt unbedingt die default Wifi Schnittstellen default_radio sicher konfigurieren. Um etwas weniger Codezeilen zu haben, habe ich eine uci batch Sequenz in eine function setwifi gepackt.

Die default_radio Einträge haben eine macaddr eingetragen, wenn man diese nicht löscht, kann man später keine weiteren Wifi Netzwerke am gleichen Sender starten. Ich glaube das ist ein Bug in der default Konfiguration.

Ein vorhandenes Wifi Netzwerke (default Name OpenWrt) neu konfigurieren.

function setwifi { uci batch << EOI
set wireless.${iface}.ssid="$ssid"
set wireless.${iface}.encryption='psk2'
set wireless.${iface}.key="$key"
set wireless.${iface}.disabled='1'
delete -q wireless.${iface}.macaddr
EOI
}
ssid='MyWlan0'
iface='default_radio0'
key='MySecurePassword0'
setwifi

Entweder die letzten vier Zeilen mehrfach mit geändertem Inhalt wiederholen oder in einer Schleife vorhandenen default_radio Definitionen mit einem gerätespezifischer ssid und einem Zufallspasswort konfigurieren.

# function setwifi needed
ssid=wrt_$(cat /sys/class/net/wlan0/address |awk -F ":" '{print $3""$4""$5""$6 }')
key=$(cat /proc/sys/kernel/random/uuid|tr -d '-')
for r in $(uci show wireless|grep -o default_radio.|uniq)
do 
  iface=${r}
  setwifi
done
echo "alle Wifi gesetzt auf ssid ${ssid} Passwort ${key}"
echo "Wlan Zugang ssid $(uci get wireless.default_radio0.ssid) passwort $(uci get wireless.default_radio0.key)"

Ein neues Wifi anlegen, welches mit einem bestimmten Interface verbunden ist.

# create additional wifi network
lanid='lan'
ssid='MyWlan3'
iface=${ssid}
key='MySecurePassword3'
device='radio2'
uci batch << EOI
set wireless.${iface}=wifi-iface
set wireless.${iface}.device=${device}
set wireless.${iface}.network=${lanid}
set wireless.${iface}.mode='ap'
EOI
setwifi

Die Sender normgerecht konfigurieren und aktivieren, oben habe ich die einzelnen Wifis erstmal deaktiviert. Luci aktiviert die Sender automatisch wenn man ein Wifi aktiviert und deaktiviert die Sender wenn das letzte Wifi für diesen Sender deaktiviert wird.

Die verfügbaren radioX Einträge werden ermittelt

for r in $(uci show wireless|grep -o radio.|sort|uniq)
do 
  uci set wireless.${r}.country='DE'
  uci set wireless.${r}.cell_density='1'
  # uci delete wireless.${r}.disabled
done

Anmerkung: Der Sender radio2 im wrt3200 ist irgendwie "anders".

Die Konfiguration kann nochmal geprüft und abgeschlossen werden.

uci changes
uci revert wireless
####
uci commit wireless
reload_config

 

Alle DHCP Leases übernehmen

Da die Scriptausführung remote per ssh in Windows etwas tricky ist, habe ich es in Anlehnung an meinen Artikel ganz spartanisch gemacht. Einfach den Code in die ssh Konsole kopieren!

DHCP Leases exportieren

# read HereDoc script code to Variable: get static and dynamic leases together
read -r -d '' script <<'EOI'
for i in $(uci show dhcp | grep -oE "host\[\d+\].ip"|grep -oE '\d+'); do
  printf "$(uci get dhcp.@host[$i].name) $(uci get dhcp.@host[$i].ip) $(uci get dhcp.@host[$i].mac)\n"
done
cat /tmp/dhcp.leases| awk '$4 != "*" { print( $4,$3,$2) }'
EOI
# execute Script and format output
echo "$script"|sh -|awk '{ print( $1,$2,toupper($3) ) }'|sort|uniq >wpo.txt

Man sollte die Daten einer kurzen Prüfung unterziehen, siehe meine Anmerkung unten. Danach einfach auf das Notebook kopieren (cmd Konsole - der freie Punkt am Ende ist relevant).

scp root@192.168.56.1:wpo.txt .

DHCP Leases importieren

Die gesicherten Leases einfach auf den Router kopieren

scp wpo.txt root@192.168.1.1:

Und dort in der ssh Konsole wieder importieren.

function rhpl { awk '{ system( "uci add dhcp host\nuci set dhcp.@host[-1].name="$1"\nuci set dhcp.@host[-1].ip="$2"\nuci set dhcp.@host[-1].mac="$3) }'; }
rhpl < wpo.txt
uci commit
reload_config

An dieser Stelle kann man den Router im Netzwerk wieder in Betrieb nehmen, hat man weitere Segmente müssen diese erst noch angelegt werden.

Weitere Konfiguration

IOT oder Gast Wifi mit neuem Interface / Bridge Device konfigurieren. Diesen Schritt habe ich manuell gemacht. Mit Schritt 1-3 erzeugt man zunächst ein neues Bridge Device. Schritt 4 verbindet ein Wifi mit der Bridge. In Schritt 1 kann die Verbindung der Bridge mit bestimmten LAN Ports oder VLANs erfolgen.

Will man weitere LAN Segmente bauen, muss man das Bridge device br-lan zunächst editieren!

LAN/WLAN <-> Bridge device <-> Interface <-> Subnetz / Firewall /DHCP

Wlan mit eigenem IP Segment erzeugen (1 2 3 4 jeweils mit dem grünen Button quittieren)

  1. Interfaces / Devices / Add device configuration
    • Device type: Bridge device 
    • Device Name: br-OpenWrt
    • Bridge ports: unspecified (hier könnte man LAN Ports /VLAN einbinden)
  2. Interfaces / Add new interface
    • Name: OpenWrt
    • Protocol: Static address
    • Device: br-OpenWrt
  3. Interfaces / Create interface (IPv6 wird nicht aktiviert!)
    • IPv4 address: 192.168.55.1 
    • IPv4 netmask: 255.255.255.0
    • Firewall / assign Zone lan
    • DHCP Server / setup dhcp server
  4. Wireless Network / Edit / General setup / network von lan auf br-OpenWrt ändern
  5. Save & Apply 

Als Zwischennotiz: uci macht dabei folgende Schritte - muss ich noch genau ansehen.

# /etc/config/dhcp
uci set dhcp.OpenWrt=dhcp
uci set dhcp.OpenWrt.interface='OpenWrt'
uci set dhcp.OpenWrt.start='100'
uci set dhcp.OpenWrt.limit='150'
uci set dhcp.OpenWrt.leasetime='12h'
uci add_list dhcp.OpenWrt.ra_flags='none'
uci del dhcp.OpenWrt.ra_flags
uci add_list dhcp.OpenWrt.ra_flags='none'
# /etc/config/firewall
uci del firewall.cfg02dc81.network
uci add_list firewall.cfg02dc81.network='lan'
uci add_list firewall.cfg02dc81.network='OpenWrt'
# /etc/config/network
uci add network device # =cfg080f15
uci set network.@device[-1].type='bridge'
uci set network.@device[-1].name='br-OpenWrt'
uci set network.OpenWrt=interface
uci set network.OpenWrt.proto='static'
uci set network.OpenWrt.device='br-OpenWrt'
uci set network.OpenWrt.ipaddr='192.168.55.1'
uci set network.OpenWrt.netmask='255.255.255.0'
# /etc/config/network - step 4
uci set network.OpenWrt.type='bridge'
# /etc/config/wireless
uci set wireless.default_radio0.network='OpenWrt'

Da fehlt noch commit und reload.

SSH Zugang wiederherstellen

Hat man einige Zugänge zum Router mit public key müsste man diese neu einrichten, oder die dropbear (ssh) Konfiguration des Routers wieder herstellen. Gute Zeit um ein Backup vom alten und neuen Router zu machen!

Original Key der aktuellen Installation sichern 

mv /etc/dropbear/dropbear_rsa_host_key /etc/dropbear/dropbear_rsa_host_key.sav

Aus dem backup die Dateien in etc/dropbear auspacken und wieder herstellen. Achtung: tar in busyBox / OpenWrt ist sensibler im Syntax als in debian! 

Anschauen was im tarball ist 

tar -tzvf backup-wrt1900-2022-01-26.tar.gz etc/dropbear/*

danach direkt die beiden relevanten Dateien auspacken

tar -xzvf backup-wrt1900-2022-01-26.tar.gz -C / etc/dropbear/authorized_keys etc/dropbear/dropbear_rsa_host_key

ssh Dienst neu starten

service dropbear restart

Anmerkungen 

zu IPv6

Ich hatte an einem anderen Router etwas rumprobiert und kam nicht zu einer funktionierenden Konfiguration. Diese Korrektur hat geholfen - man muss danach die PCs neu mit dem Netzwerk verbinden!

uci del dhcp.lan.ndp
uci set dhcp.lan.ra='server'
uci set dhcp.lan.dhcpv6='server'
uci del dhcp.lan.ra_flags
uci add_list dhcp.lan.ra_flags='managed-config'
uci add_list dhcp.lan.ra_flags='other-config'

Import der DHCP Leases

Aufpassen wie die Daten aussehen! Ich habe es eventuell mit gemischten (MAC groß/klein), Windows cr lf und/oder doppelt und dreifachen Einträgen geschafft den Router in einen Absturz / nicht mehr Boot Zustand zu bringen!

Fest eingetragene Hostnamen wieder eintragen, Beispiel:

uci add dhcp domain # =cfg2cf37duci set dhcp.@domain[-1].name='hauptfhem'uci set dhcp.@domain[-1].ip='192.168.56.83'

Portfreigaben wieder aktivieren

Firewallregel für Portfreigabe erstellen

Werksreset des Routers

Entweder 10 sec den Reset Knopf drücken oder

firstboot && reboot now

ToDo?

qrencode qrencode2

Code Block


Keine Kommentare:

Kommentar veröffentlichen