Vorwort
Vorweg, ein Gerät in einem LAN per Wake-on-WAN (Unicast Wake-on-LAN) – über das Internet – aufzuwecken ist aufgrund der fehlenden Authentisierung KEINE gute Idee! Man sollte das Ganze zumindest minimal absichern, z. B. mittels Port-Knocking. Schöner wäre es, gleich ein VPN zu nutzen! Ich füge unten ein PowerShell-Script bei, welches ein Unicast-WoL-Paket erzeugt, was z. B. auch über ein VPN funktioniert. Wichtig ist nur, dass der Router es erlaubt einen statischen ARP-Eintrag anzulegen.
Die Schwierigkeit bei dem Ganzen ist, dass WoL normalerweise als Layer2-Broadcast funktioniert. Das ist aber über das Internet und bei VPN-Verbindungen nicht möglich, da nur Unicast geroutet wird. Es wird also zum einen ein WoL-Paketgenerator gebraucht der ein Unicast-WoL-Paket erzeugen kann und auf der Seite des Routers ein DNAT und ein statischer ARP-Eintrag.
Das DNAT leitet das eingehende WoL-Paket an die darin definierte IP weiter. Der Router muss dazu die IP in eine MAC-Adresse auflösen (ARP). Da der Rechner aber aus ist, gelingt dies nicht. Dafür wird ein statischer ARP-Eintrag benötigt (ARP-Einträge habe eine Gültigkeitsdauer, die bei Linux aber nicht wirklich vorhersehbar ist).
Wenn der Rechner zwei MAC-Adressen nutzt, ist es noch etwas schwieriger. Z. B. bekommen Windows-Geräte die einen SET-Switch nutzen (Hyper-V) eine generische MAC-Adresse auf der NIC. Allerdings „hört“ im ausgeschalteten(!) Zustand die NIC nur auf die „echte“, native MAC-Adresse. Man müsste also zwei statische ARP-Einträge für die gleiche IP anlegen, was nicht geht. Es würde sich anbieten in dem Fall einen Layer2-Broadcast auszulösen. Allerdings darf man hier nicht einfach die Broadcast-IP des Netzes im DNAT hinterlegen und als ARP-Eintrag die Broadcast-IP mit der Layer-2-Broadcast-MAC „FF:FF:FF:FF:FF:FF“. Das wäre zwar prinzipiell möglich, aber solche Pakete gehen im Router direkt auf die Input-Chain und werden dann nicht erneut weitergeleitet (Output-Chain)! Hier muss man eine freie, ungenutzte „Dummy“-IP nehmen, die dann die MAC „FF:FF:FF:FF:FF:FF“ bekommt und einen L2-Broadcast auslöst.
Zum Testen
Hier kann man ein Unicast-WoL-Paket erzeugen: https://ifatwww.et.uni-magdeburg.de/wol/
Als Port sollte man 9 nutzen und als MAC-Adresse die echte, native MAC der NIC angeben, die aufgeweckt werden soll.
Im folgenden Beispiel ist:
- 10.88.10.1 = echte IP des zu weckenden Hosts
- 10.88.88.88 = Dummy-IP für Layer2-Broadcast
- AA:BB:CC:DD:EE:FF = echte/native MAC des zu weckenden Hosts
- FF:FF:FF:FF:FF:FF = Layer2-Broadcast-MAC
DNAT-Regel (Unicast):
/ip firewall nat action=dst-nat chain=dstnat dst-port=9 in-interface-list=WAN protocol=udp to-addresses=10.88.10.1
DNAT-Regel (Layer2-Broadcast):
/ip firewall nat action=dst-nat chain=dstnat dst-port=9 in-interface-list=WAN protocol=udp to-addresses=10.88.88.88
Statischer ARP-Eintrag (an NIC):
/ip arp add address=10.88.10.1 interface=VLAN1 mac-address=AA:BB:CC:DD:EE:FF
Statischer ARP-Eintrag (Layer2-Broadcast):
/ip arp add address=10.88.88.88 interface=VLAN1 mac-address=FF:FF:FF:FF:FF:FF
In der Firewall (Filter) muss natürlich erlaubt sein, dass ein entsprechendes Paket ins LAN weitergeleitet wird!
Beispiel aus Lab:
Das eingehende WoL-Frame (Unicast im L2-Segment):
Das eingehende WoL-Frame (Broadcast im L2-Segment):
PowerShell-Script (Unicast-WoL):
function Send-WOL { param ( [Parameter(Mandatory=$true)] [string]$mac, [string]$ip = "255.255.255.255", [int]$port = 9 ) $macByteArray = $mac -split "[:-]" | ForEach-Object { [byte] "0x$_" } $magicPacket = (,[byte]255 * 6) + ($macByteArray * 16) $client = New-Object System.Net.Sockets.UdpClient $client.Connect($ip, $port) $client.Send($magicPacket, $magicPacket.Length) $client.Close() } # Verwenden Sie die Funktion Send-WOL -mac "00:11:22:33:44:55" -ip "Ziel-IP-Adresse"
Es müssen zwei Einträge bearbeitet werden:
- -mac „00:11:22:33:44:55“ = Ziel-MAC des zu weckenden Geräts
- -ip „Ziel-IP-Adresse“ = IP-Adresse des Routers
System- und Netzwerkadministrator
Informationstechnik – Netzwerktechnik – Consulting
MCSA+M | MCSE | MTCNA