In unserer Infrastruktur gibt es Geräte, bei denen ein physischer Zugriff auf die Konsole im Notfall überlebenswichtig ist – Core-Router, Firewalls und Switches. Diese Geräte laufen abgeschottet vom Management-Netzwerk, und ich möchte unter gar keinen Umständen, dass jemand über reguläre IP-Netzwerke oder Protokolle auch nur in deren Nähe kommt.
Natürlich gibt es kommerzielle Out-of-Band-Managementlösungen. Aber:
Mir war klar: Ich brauche etwas Eigenes. Etwas, das ich selbst verstehe, kontrolliere und absichern kann – minimalistisch, stabil und transparent.
Die Antwort: eine Kombination aus Raspberry Pi, WireGuard, WLAN-Isolation und ser2net. Mit dieser Lösung sind meine Netzwerkgeräte über deren seriellen Konsolenports remote erreichbar – aber nur über mein VPN.
Die Lösung musste:
Und natürlich: Es soll auch in meinem Monitoring mit Zabbix auftauchen, aber das soll nicht Inhalt dieses Beitrags sein.
Ich setze ein aktuelles Raspberry Pi OS Lite ein. SSH und WLAN sind initial deaktiviert.
System vorbereiten und absichern
#bash
sudo apt update && sudo apt upgrade -y
#bash
sudo apt install unattended-upgrades -y
sudo dpkg-reconfigure -plow unattended-upgrades
#bash
sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
#CONFIG
country=DE
update_config=1
network={
ssid="deinSSID"
psk="deinPasswort"
key_mgmt=WPA2
}
#bash
sudo apt install wireguard resolvconf -y
#bash
sudo nano /etc/wireguard/wg0.conf
#CONFIG
[Interface]
PrivateKey = <PRIVATE_KEY>
Address = 10.100.100.2/32
DNS = 1.1.1.1
[Peer]
PublicKey = <SERVER_PUBKEY>
Endpoint = your-vpn.example.com:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 10
#bash
sudo chmod 600 /etc/wireguard/wg0.conf
#bash
sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0
#bash
sudo apt install iptables iptables-persistent -y
#bash
sudo nano /etc/iptables/rules.v4
#CONFIG
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
DHCP für WLAN
#CONFIG
-A OUTPUT -o wlan0 -p udp --sport 68 --dport 67 -j ACCEPT
-A INPUT -i wlan0 -p udp --sport 67 --dport 68 -j ACCEPT
Optional - wenn der WG Server keine IP sondern einen DNS Namen hat, auch DNS erlauben
#CONFIG
-A OUTPUT -o wlan0 -p udp --sport 53 --dport 53 -j ACCEPT
-A INPUT -i wlan0 -p udp --sport 53 --dport 53 -j ACCEPT
WireGuard Verbindung erlauben
#CONFIG
-A OUTPUT -o wlan0 -p udp -d <VPN_SERVER_IP> --dport 51820 -j ACCEPT
-A INPUT -i wlan0 -p udp -s <VPN_SERVER_IP> --sport 51820 -j ACCEPT
-A INPUT -i wlan0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Nur VPN-Traffic über WireGuard Interface erlauben
#CONFIG
-A INPUT -i wg0 -j ACCEPT
-A OUTPUT -o wg0 -j ACCEPT
COMMIT
#bash
sudo iptables-restore < /etc/iptables/rules.v4
sudo netfilter-persistent save
#bash
sudo nano /etc/ssh/sshd_config
#CONFIG
ListenAddress 10.100.100.2
PasswordAuthentication no
PermitRootLogin no
UseDNS no
PubkeyAuthentication yes
AllowUsers pi
Wichtig!
SSH darf erst starten, wenn WireGuard Online ist, sonst schlägt der Start fehl, da sich SSH nicht an die WireGuard IP binden kann.
#bash
sudo systemctl edit ssh
#CONFIG
[Unit]
After=wg-quick@wg0.service
Requires=wg-quick@wg0.service
#bash
sudo nano /home/pi/.ssh/authorized_keys
chmod 600 /home/pi/.ssh/authorized_keys
chown pi:pi /home/pi/.ssh/authorized_keys
System Deamon neuladen & SSH neustarten:
#bash
sudo systemctl daemon-reload
sudo systemctl restart ssh
#bash
sudo nano /etc/udev/rules.d/99-usb-serial.rules
#CONFIG
SUBSYSTEM=="tty", ATTRS{serial}=="A12345B", SYMLINK+="console-router1"
SUBSYSTEM=="tty", ATTRS{serial}=="A12345C", SYMLINK+="console-fw1"
#bash
sudo udevadm control --reload
sudo udevadm trigger
#bash
sudo apt install ser2net -y
#bash
sudo nano /etc/ser2net.conf
#CONFIG
BANNER:banner:\r\nKonsolenzugriff über Raspberry Pi [\B]\r\n\r\n
2001:telnet:0:/dev/console-router1:115200 8DATABITS NONE 1STOPBIT banner kickolduser telnet-brk-on-sync
2002:telnet:0:/dev/console-fw1:115200 8DATABITS NONE 1STOPBIT banner kickolduser telnet-brk-on-sync
Nicht optimal, ich mag es aber einfach mit schlichten Config-Files, bei denen ich nicht die Anzahl der Leerzeichen zählen muss.
Hier im Service die Config Datei angeben.
#bash
sudo nano /lib/systemd/system/ser2net.service
#CONFIG
[Unit]
Description=ser2net.service - Serial port to network proxy
After=network.target
[Service]
ExecStart=/usr/sbin/ser2net -c /etc/ser2net.conf -n
Restart=always
[Install]
WantedBy=multi-user.target
System Deamon neuladen & SSH neustarten:
#bash
sudo systemctl daemon-reload
sudo systemctl restart ser2net
sudo systemctl status ser2net
#bash
sudo reboot
Diese Lösung ist klein, stabil, sicher und vollständig nachvollziehbar. Keine versteckten Dienste, keine Abhängigkeiten von Drittherstellern. Und vor allem: Sie schützt den Zugang zu meinen kritischsten Systemen – selbst, wenn mein Management-Netz kompromittiert wäre.
Mir persönlich gefällt die Lösung inzwischen so gut, dass ich an einer LTE-Version arbeite, die ich an bestimmte Kunden in besonders kritischen Standorten, zusammen mit unseren Secure-Link SD-WAN Routern ausrolle.
Ich hoffe, dieser etwas andere Blogbeitrag in Form eines Erfahrungsberichts samt DIY-Anleitung hat euch gefallen.
- Cheers, Jens