Wake-on-WAN (Unicast)

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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert