Raspberry Pi: Watchdog für Netzwerk-Verbindung
Wie im vorherigen Artikel beschrieben, habe ich auf einen Raspberry Pi 2 den lokalen DNS-Server Pi-hole installiert. Im Betrieb ist mir allerdings aufgefallen, dass der Pi zwischendurch die Netzwerkverbindung verloren hat und danach nicht mehr erreichbar war. Bei der Auswertung der Log-Dateien (/var/log/syslog
) fällt auf, dass der Kernel korrekt meldet wenn der Link der Ethernet-Schnittstelle verloren geht (z.B. wenn das Kabel gezogen wird):
Jul 18 13:10:35 pi-hole kernel: [53057.296447] smsc95xx 1-1.1:1.0 eth0: Link is Down
Jul 18 13:10:35 pi-hole dhcpcd[436]: eth0: fe80::a:b:c:d is unreachable
Jul 18 13:10:35 pi-hole dhcpcd[436]: eth0: carrier lost
Jul 18 13:10:35 pi-hole dhcpcd[436]: eth0: deleting address 2003:1:2:3::4/128
Jul 18 13:10:35 pi-hole dhcpcd[436]: eth0: deleting address 2003:1:2:3:4:5:6:7/64
Jul 18 13:10:35 pi-hole dhcpcd[436]: eth0: deleting address fd00:0:0:0:1:2:3:4/64
Jul 18 13:10:35 pi-hole dhcpcd[436]: eth0: deleting route to 2003:1:2:3::/64
Jul 18 13:10:35 pi-hole dhcpcd[436]: eth0: deleting default route via fe80::a:b:c:d
Jul 18 13:10:35 pi-hole dhcpcd[436]: eth0: deleting address fe80::1:2:3:4
Jul 18 13:10:35 pi-hole dhcpcd[436]: eth0: deleting address fd00:0:0:0:1:2:3:5/64
Jul 18 13:10:35 pi-hole dhcpcd[436]: eth0: deleting route to fd00:1:0:5::/64
Jul 18 13:10:35 pi-hole dhcpcd[436]: eth0: deleting route to 192.168.178.0/24
Jul 18 13:10:35 pi-hole dhcpcd[436]: eth0: deleting default route via 192.168.178.1
Allerdings wird vom Kernelmodul scheinbar nicht korrekt signalisiert, wenn dass Kabel wieder eingesteckt wird und der Link wieder vorhanden ist. Daher kann die Netzwerkkarten vom Netzwerkmanager auch nicht mehr richtig initialisiert werden, wenn der Link wieder zurück kommt. Gerade bei einem DNS Server, sollte die Netzwerkverbindung aber möglichst stabil sein - schließlich möchte ich nicht dauernd die DNS-Auflösung verlieren, nur weil zwischendurch der Router neu gebootet wurde.
Damit die Netzwerkverbindung trotzdem wiederhergestellt wird, hilft ein kleines Script das per systemd
beim Systemstart ausgeführt wird und alle 30 Sekunden folgendes überprüft:
- Ist dem Interface
eth0
noch eine IP-Adresse zugeordnet? - Ist das Default Gateway noch per Ping erreichbar?
Falls eine dieser Checks fehlschlägt wird per ip link set eth0 down
und up
das interface herunter und wieder hoch gefahren, so dass der Netzwerkmanager (bei Raspberry OS standardmäßig dhcpcd
) eine neue IP-Adresse bezieht.
Installation
# 1. Install script in /opt
cd /opt
# 2. Clone project from git
git clone https://github.com/nerdiges/eth0_watchdog.git
# 3. Copy service file for systemd
cp eth0_watchdog.service /etc/systemd/system/eth0_watchdog.service
# 4. Reload systemd to integrate script
systemctl daemon-reload
# 5. Start service
systemctl start eth0_watchdog.service
# 6. Check if service is running
systemctl status eth0_watchdog.service
# 7. Autostart service on boot
systemctl enable eth0_watchdog.service
Weiterführende Links
[01] https://github.com/nerdiges/eth0_watchdog/
Kommentare