Webserver - Wake on Demand (Anleitung)

moreaner

Cadet 2nd Year
Registriert
Nov. 2007
Beiträge
27
Dieser Beitrag befasst sich, wie im Titel erwähnt, mit dem Einschalten eines Web-, File-Servers, NAS usw. über eine Anfrage aus dem Internet oder lokalen Netzwerk ohne lästiges senden eines "Magic-Packets" (Wake on Lan).

Hintergrund

Ich betreibe nun seit längerem einen Homeserver, auf dem ich OwnCloud und Plex laufen habe.

Der Server ist folgendermassen ausgestattet:

- Asus M5A78L-M/USB3
- AMD FX 6300 (Black Edition)
- 16 GB Kingston RAM
- 4x WD Red 4 TB
- 1x Samsung HDD 1 TB
- 1x Seagate Achive 8 TB
- 1x Samsung EVO 830 256 GB

Und darauf als Betriebssystem läuft Linux Mint 17.2 (64 bit)

Bisher lief der Server 24/7 und man muss kein Genie sein, um zu sehen, dass der Verbrauch enorm ist.
Laut meinem Verbrauchsmessgerät war der Verbrauch im Idle rund 80 Watt und um ab und zu mal eine Datei runterzuladen oder für 3 Stunden einen Film auf Plex zu schauen, war mir dieser Wert für die restliche Zeit einfach zu hoch.

In CHF wären das gerundet ca. 180.-/Jahr (bei 25 Rappen/kWh) welche für das "nicht Verwenden" des Servers benötigt würden.

Ich bin zum Entschluss gekommen, dass ich sicherlich nicht der Einzige bin, der sich über dieses Thema schon mal Gedanken gemacht hat, wesshalb ich nun in diesem Beitrag versuche meine Erfahrungen und Stolpersteine aufzuzeigen und eventuell dem Einen oder Anderen ein wenig weiter zu helfen.

Ich werde hier versuchen Schritt für Schritt aufzuzeigen, wie man seinen Server, oder sonstiges Gerät, welches WoL unterstützt bei Bedarf einzuschalten und ohne grössere Einschränkungen sehr viel Strom und daher auch Geld sparen kann. Diese Anleitung ist ein Zusammenschnitt von mehreren Foren-Beiträgen und ein wenig von meinem eigenen Senf.


Was wird benötigt?

- Ein Netzwerkfähiges Gerät, welches man über WoL aus dem Standby oder ausgeschalteten Zustand aufwecken kann.

- Einen Router, auf dem man Tomato oder DD-WRT installieren kann (ich zeige den Weg über Tomato, bei DD-WRT ist es aber ähnlich)

- Geduld und ein wenig Zeit


Einrichtung des Betriebssystems (Linux Mint)

(Bei einem NAS oder einem Server mit Windows muss man sich im Internet die nötigen Einstellungen raussuchen)

Bei neueren Linux Distributionen, welche auf Debian aufbauen ist ein Paket vorinstalliert, welches einem erlaubt die Netzwerkkarte nach seinem Gusto zu konfigurieren. Ich werde hier nur auf die Funktion von WoL eingehen.
Um ganz sicher zu sein, kann man im Terminal:
Code:
sudo apt-get install ethtool
eingeben und das Paket gegebenenfalls nachinstallieren.

Um zu wissen, unter welcher Bezeichnung die Netzwerkkarte verwaltet wird, öffnet man das Terminal und gibt ein:
Code:
ifconfig

In meinem Fall hat die Netzwerkkarte die Bezeichnung "eth0", weshalb ich auch mit dieser weiter arbeite (bei anderer Bezeichnung einfach jeweils "eth0" durch die Angezeigte ersetzen)

Nun lässt man sich im Terminal mittels
Code:
sudo ethtool eth0
die Eigenschaften der Netzwerkkarte anzeigen.
Interessant hier sind die Punkte
- "Supports Wake-on:" und
- "Wake-on:"

Erster Punkt gibt Informationen darüber, welche Funktionen von für WoL von der Karte unterstützt werden, der zweite zeigt auf, welche Funktion im Moment aktiviert ist.

Eine detaillierte und sehr ausführliche Anleitung für die Weiteren Schritte findet man unter: https://wiki.ubuntuusers.de/Wake_on_LAN

Bei mir gab es ein Problem, dass jedesmal, wenn der Server schlafen ging, das ethtool die Einstellung (g) vergessen hat. Daher war ich gezwungen einen etwas anderen Weg zu gehen, als der in der obigen Anleitung beschriebene.
Sollte ich nicht der Einzige sein, der von diesem Problem betroffen war, ist hier eine mögliche Lösung:

Man öffnet die Datei /usr/lib/pm-utils/power.d/disable_wol mit root-Rechten mit einem beliebigen Editor und ändert Folgende Zeile so,
Code:
enable) ethtool -s "${d##*/}" wol d>/dev/null 2>&1;;
damit sie schlussendlich so aussieht:
Code:
enable) ethtool -s "${d##*/}" wol g>/dev/null 2>&1;;
und speichert die Datei ab.

Nun Testet man am besten das Ganze indem man den Server herunterfahrt oder in den Standby versetzt und versucht ihn mit dem Senden eines Stinknormalen "Magic-Packet" wieder aufzuwecken. (Eventuell muss man noch eine Portweitung von Port 7 und 9 einrichten).
Hat das geklappt, kann man sich dem nächsten Kapitel widmen.

Der Router (Tomato)

Ich besitze einen Netgear R7000 Nighthawk, auf dem ich nach dieser Anleitung: https://youtu.be/w10jLqRmdLM die Tomato-Firmware installiert habe. Nicht vergessen vor der Installation unbedingt ein Backup der momentanen originalen Firmware zu machen, falls es zu Problemen kommt.

Hat man Tomato installiert, sorgt man erst mal dafür, dass alle sich im Netzwerk befindlichen Geräte richtig konfiguriert sind und der aufzuweckende Server/PC eine feste IP bekommt.
Funktioniert alles, kann man zum nächsten Punkt gehen.

Nun der Grund, warum wir Tomoato installiert haben ist, dass diese Firmware eigene Scripts ausführen kann, zu welchen ich jetzt komme.

Man navigiert nun in der linken Leiste über "Administration" zu "Scripts"

Hier gibt man unter "Firewall" folgendes Script ein und speichert dieses:
Code:
 # Überwacht TCP Anfragen vom LAN auf den PLEX server
 iptables -I FORWARD -i br0 -p tcp --dport 32400 -m state --state NEW -j LOG --log-prefix "WOL PLEX LAN Connection "

 # Überwacht TCP Anfragen vom WAN auf den PLEX server
 iptables -I FORWARD -i vlan2 -p tcp --dport 32400 -m state --state NEW -j LOG --log-prefix "WOL PLEX WAN Connection "

 # Überwacht UDP Anfragen vom LAN auf den PLEX server
 iptables -I FORWARD -i br0 -p udp --dport 32400 -m state --state NEW -j LOG --log-prefix "WOL PLEX LAN Connection "

 # Überwacht UDP Anfragen vom WAN auf den PLEX server
 iptables -I FORWARD -i vlan2 -p udp --dport 32400 -m state --state NEW -j LOG --log-prefix "WOL PLEX WAN Connection "

#------------------------------------------------------------------------------------------------------------------

 # Überwacht TCP Anfragen vom LAN auf den webmin server
 iptables -I FORWARD -i br0 -p tcp --dport 10000 -m state --state NEW -j LOG --log-prefix "WOL Webmin LAN Connection "

 # Überwacht TCP Anfragen vom WAN auf den webmin server
 iptables -I FORWARD -i vlan2 -p tcp --dport 10000 -m state --state NEW -j LOG --log-prefix "WOL Webmin WAN Connection "

 # Überwacht UDP Anfragen vom LAN auf den webmin server
 iptables -I FORWARD -i br0 -p udp --dport 10000 -m state --state NEW -j LOG --log-prefix "WOL Webmin LAN Connection "

 # Überwacht UDP Anfragen vom WAN auf den webmin server
 iptables -I FORWARD -i vlan2 -p udp --dport 10000 -m state --state NEW -j LOG --log-prefix "WOL Webmin WAN Connection "

Das sieht jetzt vielleicht ein wenig kompliziert auch, es folgt allerdings einer bestimmten Logik:
Diese Script schreibt für jede Anfrage auf dem angegebenen Port eine Zeile in die Logs von Tomato, welche wir später gezielt auslesen werden.

1. Zeile: LAN-Anfragen, TCP
2. Zeile: WAN-Anfragen, TCP
3. Zeile: LAN-Anfragen, UDP
4. Zeile: WAN-Anfragen, UDP

Wichtig hier zu beachten ist, das bei mehreren Ports beim "prefix" das erste Wort überall exakt dasselbe ist!


Nun klickt man auf den Reiter "WAN Up" und fügt folgendes ein:

Code:
 #!/bin/sh

 TARGET=<IP-Adresse>
 MAC=<MAC-Adresse>
 PORT1=<Portnummer>
 PORT2=<Portnummer>

 INTERVAL=2
 NUMP=1

 OLD_LC=`wc -l /var/log/messages | awk '{print $1}'`
     while sleep $INTERVAL
     do
       LC=`wc -l /var/log/messages | awk '{print $1}'`
       NEWLINES=`expr $LC - $OLD_LC`
      if [ "$LC" -ne "$OLD_LC" ];  then
# Diese Zeile beschreibt hinter "egrep" nach welchen Parametern gesucht werden soll
        LINE=`tail -$NEWLINES /var/log/messages | egrep "WOL .* DST=$TARGET .* DPT=$PORT1|$PORT2" | tail -1`
        SRC=`echo $LINE | awk '{print $10}' | sed -e "s/SRC=//g"`
      if [ "$SRC" != "" ]; then
# Wenn das Gerät gefunden wurde, versuche es anzupingen
        RET=`ping -c $NUMP -W 1 $TARGET 2> /dev/null | awk '/packets received/ {print $4}'`
      if [ "$RET" -ne "$NUMP" ];  then
# Sieht aus, als ist es ausgeschaltet, also sende WOL
        echo "[`date -Iseconds`] $SRC causes WOL. Line was $LINE"  >> /var/log/wol
        /usr/sbin/ether-wake $MAC

        sleep 10

             fi
         fi
     fi
     OLD_LC=`wc -l /var/log/messages | awk '{print $1}'`
done

Als kleine Erläuterung:
Diese Script öffnet die Log-Datei und sucht in der untersten Zeile nach hier definierten Angaben. Hat es eine Zeile gefunden, versucht es das Gerät anzupingen. Schlägt der Ping fehl, sendet es ein Magic-Packet und der Server wächt auf (eigentlich ganz einfach).

Von "TARGET" bis "PORT2" gibt man nun seine Angaben ohne <> ein. Hat man nun in dem Firewall-Script mehr als zwei Ports definiert, über die der Server aufwachen soll, gibt man unter "PORT2" einfach "PORT3" usw. ein und füllt diese entsprechend aus. Nun muss man allerdings das Script anpassen.
In der Zeile:
Code:
        LINE=`tail -$NEWLINES /var/log/messages | egrep "WOL .* DST=$TARGET .* DPT=$PORT1|$PORT2" | tail -1`
sieht man nach "DPT=" schon die vorhandenen Ports. Weitere Ports fügt man mit einem "|"dazwischen hinzu (bedeutet: "oder") z.B. so:
Code:
        LINE=`tail -$NEWLINES /var/log/messages | egrep "WOL .* DST=$TARGET .* DPT=$PORT1|$PORT2|$PORT3" | tail -1`

Nun speichert man das Skript und startet den Router neu (oben rechts, über "System")

Hat man eine Portweiterleitung eingerichtet, bei der der externe Port nicht dem internen Port entspricht, muss man bei beiden Scripts unbedingt immer den internen Port angeben!

Ist der Router neugestartet, kann man seinen Server ausschalten oder in den Standby versetzen und das ganze testen, indem man Plex oder sonst einen Dienst aufruft, der über einen oben definierten Port aufgerufen wird.

Ich empfehle den Server in den "Bereitschafts-Modus", "S3" oder auch "suspend to ram-Modus" genannt zu versetzen, da man so nur wenige Sekunden warten muss, bis der Dienst verfügbar ist. Für diesen setzt man jetzt noch einen Timer und voilà funktioniert alles voll automatisch ohne irgendwelches Gebastel mit Tools, die Magic-Packets über das Internet senden usw.

Ich für meinen Teil bin überglücklich, habe ich nach langem Zusammentragen eine funktionierende Lösung erarbeitet und hoffe, ich konnte sonst noch jemandem damit helfen.

PS.: Tomato hat meinen R7000 ziemlich ausgebremst, weshalb ich ihn übertaktet habe. Einen Anleitung dazu findet man unter: http://www.howtogeek.com/67943/5-tips-for-getting-the-most-out-of-your-tomato-router/ allerdings mit den hier beschriebenen Befehlen:
http://www.dd-wrt.com/phpBB2/viewtopic.php?t=177443&postdays=0&postorder=asc&start=161

Eine Möglichkeit, den Traffic zu beschleunigen wäre "FastNAT", welches in Tomato allerdings seit einiger Zeit leider nicht mehr verfügbar ist.

Das Problem mit FastNAT hat sich erledigt: Prüft unter "Advanced Settings" -> "Miscellaneous" ob die Funktion CTF (=FastNAT...) aktiviert ist. So hat man wieder die volle Geschwindigkeit, ohne den Router übertakten zu müssen.

Bereitschafts-Modus

Bei der vordefinierten Zeit für den automatischen Bereitschafts-Modus habe ich ein Problem festgestellt, wobei während dem Streamen eines Filmes der Server nach eben genau dieser Zeit abschaltet und der Stream auf dem Client abbricht. Nun habe ich eine Lösung gefunden, welche genau dies verhindert.

Als erstes navigiert man in den Ordner:
Code:
/etc/pm/sleep.d/
und fügt eine Datei mit dem Namen:
Code:
05_plexkeepawake
ein.

In diese Datei wird nun folgender Code eingegeben:
Code:
#!/bin/bash 
case "$1" in     suspend)
         s=$(curl localhost:32400/status/sessions 2>/dev/null | sed -n "s/.*MediaContainer size=\"\(.*\)\".*/\1/p" )
     if [ $s -gt 0 ]
     then
         echo "Plex session active, cancel suspend"

         exit 1;
     fi
esac

abspeichern und die Datei mit folgendem Befehl ausführbar machen:
Code:
sudo chmod +x /etc/pm/sleep.d/05_plexkeepawake

Es kann vorkommen, dass das Script nicht ausgeführt werden kann, weil ein Paket auf dem System fehlt. Um dem vorzubeugen kann man zur Sicherheit mit folgendem Befehl "curl" installieren bzw. überprüfen ob es installiert ist:
Code:
sudo apt-get install curl

Erläuterung:
Alle Scripte im Ordner "sleep.d" werden kurz vor dem Ruhe- bzw. Bereitschafts-Modus ausgeführt. Gibt nun eines dieser Scripte einen anderen Wert als "0" aus, wird der Ruhe- bzw. Bereitschafts-Modus abgebrochen. Hier wird nun auf einer lokalen, von Plex gehosteten Webseite geprüft, wie viele Sitzungen bzw. Streams aktiv sind.
Sind keine Streams aktiv, läuft der Timer für den Ruhe- bzw. Bereitschafts-Modus ganz normal, wie eingestellt runter.
 
Zuletzt bearbeitet: (Änderung beim Abschnitt "Router übertakten" (FastNAT))
moreaner schrieb:
Bisher lief der Server 24/7 und man muss kein Genie sein, um zu sehen, dass der Verbrauch enorm ist.
Laut meinem Verbrauchsmessgerät war der Verbrauch im Idle rund 80 Watt und um ab und zu mal eine Datei runterzuladen oder für 3 Stunden einen Film auf Plex zu schauen, war mir dieser Wert für die restliche Zeit einfach zu hoch.

Wenn das Teil wirklich 80W verbrauchen soll klingt das einfach nach schlechter Konfiguration. Daher: Das Problem an der Wurzel beheben.
 
80 watt?

mein esxi server mit 2 Firewalls Aktiv/Passiv, NAS und 3 VMs verbraucht im IDLE ca 40 Watt. Da hast du eindeutig schlechte Konfiguration ausgesucht
 
80 Watt klingt doch total normal. Vielleicht guckt ihr erstmal, was an Hardware drin steckt... Eine HDD im Idle "verbraucht" bereits ca. acht bis elf Watt, davon sind sechs Stück drin. Macht summa summarum bereits 48 bis 66 Watt, nur dass die HDDs laufen.
 
moreaner schrieb:
... und hoffe, ich konnte sonst noch jemandem damit helfen.
Vielen Dank für die Mühe, die du dir gemacht und gegeben hast. Für Anfänger in diesem Bereich (wie mich :) ) sind solche Schritt-für-Schritt-Anleitungen Gold wert. Daumen hoch !
 
Vielen Dank für die Rückmeldungen! Es geht hier nich darum, wieviel Strom mein Homeserver im Vergleich zu anderen verbraucht...man kann mit dieser Methode auch andere Geräte, wie ein stromsparenderes NAS konfigurieren, da auch hier jedes eingesparte Watt pures Geld wert ist.
 
Sehr interessantes Thema, leider scheitert diese Anleitung an meinem Router, da kann ich kein Tomato o.Ä. installieren. Gibt es evtl eine Möglichkeit so etwas mit einem Raspberry Pi o.Ä. umzusetzen?
 
Ich hatte die selbe Idee wie du, allerdings konnte ich auch nach stundenlanger Suche im Internet keine zufriedenstellende Anleitung finden. Ich würde dir empfehlen einen mit Tomato kompatiblen Router zuzulegen und deinen bestehenden (evtl. den vom Internetanbieter) als Bridge einzurichten. Falls du eine Lösung mit dem Raspberry Pi finden würdest, wäre ich sehr interessiert davon zu hören :-)
 
Nur der Vollständigkeit halber, bei ner FritzBox kann man einfach nen Häkchen bei den Geräteeinstellungen setzen und dann wird bei Zugriff nen Magic Packet an das betroffene Gerät gesendet.

Sofern man Dienste auf Standardports laufen hat, wird das ziemlich häufig passieren...
 
Soweit ich weiß geht das bei der Fritzbox aber auch nur übers Internet mit Portforwarding oder VPN. Lokal im LAN geht das nicht soweit ich weiß.
 
Ich verstehe deinen Einwurf nicht. Im lokalen LAN wird seltenst über den Router auf lokale Adressen zugegriffen. Der kriegt das schlicht nicht mit und kann daher auch Magic Packet losschicken.

Häufig benötigen Netzwerkkarten gar kein Magic Packet mehr um den PC aufzuwecken. Einfacher Netzwerkzugrrff genügt. Führt aber natürlich zu noch mehr "ungewolltem" Wecken.
 
@aranax - wenn du ein NAS hast, auf dem deine ganzen Daten, wie Filme, Musik usw. gespeichert sind und diese nun auf deinem HTPC abspielen möchtest, wirst du keinen anderen Weg finden als über einen Router oder Switch darauf zuzugreifen.

Du kannst einen PC mittels einem empfangenen Paket über Broadcast, Multicast oder Unicast aufwecken...nun wacht so dein PC jedesmal auf, wenn sich ein neues Gerät in dein Netzwerk einwählt oder der Router die Aktualität der IP-Tabelle überprüft....also kannst du so deinen PC gleich laufen lassen (aber das hast du ja erwähnt)

Soweit ich weiss, bietet Apple mit ihren Air Port -Modellen eine ähnliche Möglichkeit den PC über eine beliebige Anfrage aufzuwecken, allerdings haben diese nur 3x RJ45-Ports und wie sich das in der Praxis schlägt, kann ich leider nicht sagen.

Wie ist denn das bei der FritzBox, wird hier der gesamte Verkehr zum angeschlossenen Gerät überwacht oder kann man auch einzelne Ports definieren?
 
Ich habe in der Tat nicht realisiert, dass du auch das lokale Interface überwachst. Setzt aber vorraus, dass der Traffic wirklich über den Router läuft. Da bei mir alles an nem Switch hinter der FritzBox hängt, wäre obiges Szenario bei mir sowieso nicht praktikabel.

Die FritzBox weckt nur bei Anfragen aus dem Internet, auf allen an das Gerät weitergeleiteten Ports. Port 443 führte also zu praktischem Dauerbetrieb.

Schafft der Netgear eigentlich noch volles Gbit, wenn du die Firewall auch auf dem LAN Interface aktivierst?

-aranax
 
Hmmm...Auch bei deiner Konfiguration müsste meine Lösung funktionieren, da Anfragen über Broadcast oder Multicast alle Geräte im internen Netz gesendet werden...ich weiss jetzt nicht, was für eine Konfiguration du bei dir hast, ob du einen "managed switch" dein Eigen nennst und die Geräte über ein VLAN betreibst, oder einfach alles über einen "normalen" switch...?

Intern habe ich ein volles Gbit/s, ins Internet komme ich allerdings leider "nur" mit 600-700 Mbit/s D und U (Glasfaser) aber das liegt an Tomato, da es kein "FastNAT" unterstützt...mit IPv6 dürfte es schneller sein. Vor dem Übertakten waren es gerade mal 300-400 Mbit/s.
 
Zurück
Oben