Wake on Lan
Habe neulich mal nach einer Möglichkeit gesucht meinen PC auf der Arbeit von zu Hause aus über VPN einschalten zu können. Aus jungen Jahren war mir noch bekannt dass man PCs auch übers Netzwerk mittels WoL (Wake on LAN) einschalten kann.
Eines vorweg, über einen VPN Tunnel kann man einen PC nicht direkt einschalten, da man ein Paket an eine MAC Adresse anstatt an eine IP-Adresse schicken muss. Das VPN liegt also schon ein paar Schichten zu weit oben.
Um einen PC per VPN aufwecken zu können benötigt man also einen Rechner der im selben Netz hängt wie der zu startende Rechner. Hat man keinen Server im Netz kann man sich auch mit einem Raspberry Pi behelfen. Dieser benötigt nicht so viel Strom.
WoL am Raspberry
Nur so am Rande bemerkt: Einen Raspberry Pi kann man nicht per WoL aufwecken, da dessen Netzwerkkarte am USB Bus hängt und im ausgeschaltetem Zustand nicht mit Strom versorgt wird.
Etwas Hintergrundwissen
Von früher konnte ich mich noch erinnern dass Netzwerkkarten die WoL konnten immer ein 3-adriges Kabel beiliegen hatten, welches man mit dem Mainboard verbinden musste. Bei meiner Recherche habe ich herausgefunden dass dieses Kabel nur bis zum PCI-Standard 2.1 Verwendung findet. Modernere Mainboards mit einem PCI-Standard ab 2.2 benötigen diese Verbindung nicht mehr. Stattdessen wird ein PME (Power Management Event) verwendet.
Damit eine Netzwerkkarte auf die PME Events reagiert müssen zum einen die Events im Bios erlaubt sein und das gewünschte Verhalten in der Netzwerkkarte aktiviert werden. In meinem Bios musste ich nichts einstellen da die PME Events standardmäßig bereits aktiviert waren. Früher musste man das WoL mit dem 3-adrigen Kabel noch explizit einschalten.
WoL aktivieren
Um den Devicenamen der Netzwerkkarte herauszubekommen benutzt man den Befehl ifconfig. Meisstens ist das eth0, auf neueren Ubuntu Systemen kann das Device aber auch ganz anders heißen.
ifconfig
Hat man seine Netzwerkkarte gefunden kann man jetzt dessen Status abfragen.
$ sudo ethtool eth0
Settings for eth0:
Supported ports: [ TP MII ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Half 1000baseT/Full
Supported pause frame use: No
Supports auto-negotiation: Yes
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Half 1000baseT/Full
Advertised pause frame use: Symmetric Receive-only
Advertised auto-negotiation: Yes
Link partner advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Link partner advertised pause frame use: No
Link partner advertised auto-negotiation: Yes
Speed: 1000Mb/s
Duplex: Full
Port: MII
PHYAD: 0
Transceiver: internal
Auto-negotiation: on
Supports Wake-on: pumbg
Wake-on: d
Current message level: 0x00000033 (51)
drv probe ifdown ifup
Link detected: yes
Unter Supports Wake-on steht eine Liste unterstützter Modi. Diese bedeuten im Einzelnen:
Kürzel | Erklärung |
---|---|
p | Wake on phy activity |
u | Wake on unicast messages |
m | Wake on multicast messages |
b | Wake on broadcast messages |
a | Wake on ARP |
g | Wake on MagicPacket(tm) |
s | Enable SecureOn(tm) password for MagicPacket(tm) |
d | Disable (wake on nothing). This option clears all previous options. |
Unter Wake-on steht der aktuell eingstellte Modus.
Soll der PC nun z.B. mit einem MagicPacket aufgeweckt werden so muss man den entsprechenden Modus für die Netzwerkkarte aktivieren:
sudo ethtool -s enp3s0 wol g
Möchte man WoL wieder deaktivieren macht man das mit:
sudo ethtool -s eth0 wol d
PC aufwecken
Um den PC aufzuwecken, kann man jetzt z.B. das Tool wakeonlan verwenden. Dieses installiert man unter einem debian-basierten Linux mit:
sudo apt-get install wakeonlan
Den PC weckt man dann auf mit:
wakeonlan XX:XX:XX:XX:XX:XX
Wobei XX:XX:XX:XX:XX:XX für die Mac-Adresse der Netzwerkkarte steht. Diese bekommt man auch mittels ifconfig heraus.
Problembehebung - WOL wird ständig deaktiviert
Seltsamerweise deaktiviert sich bei meinem Rechner ständig das Wake On Lan Feature. Deshalb aktiviere ich ihn jetzt jedesmal automatisch wenn der Rechner gestartet wird. Dies erfolgt durch ein systemd script.
Man legt die Datei /etc/systemd/system/wol@.service an. Das @ gehört zum Dateinamen, also nicht löschen, und fügt dann folgenden Inhalt ein:
[Unit]
Description=Enable wake on lan for interface %i
Requires=network.target
After=network.target
[Service]
ExecStart=/sbin/ethtool -s %i wol g
Type=oneshot
[Install]
WantedBy=multi-user.target
Als nächstes sucht man sich mit ifconfig sein Netzwerk-Device raus und fügt den systemd-Job so hinzu:
sudo systemctl enable wol@eth0
Um zu prüfen ob der Service erfolgreich ausgeführt wurde kann man folgenden Befehl ausführen:
systemctl is-enabled wol@eth0
Nach einem Reboot kann man mit dem ethtool wieder prüfen ob Wake on Lan jetzt aktiv ist. Zur Erinnerung es muss so etwas herauskommen:
Wake-on: g