Portál AbcLinuxu, 30. dubna 2025 12:45
Ako zobudit server pomocou routra, ked ho potrebuje klient bez potreby konfiguracie klientov.
Doma mam server, ktory nepotrebujem mat pusteny 24h denne. Pozadujem, aby sa server zobudil automaticky, vtedy, ked ho niekto bude potrebovat.
Ked niekto ziada nieco od servera cez IP protokol, pozaduje jeho MAC adresu pomocou ARP paketu. Tento sa posiela broadkastovo (mac adresa), takze pride aj do routera, ktory bezi stale (DHCP server, ...). Po prijati ARP paketu vysle WOL packet, na zobudenie servera. Na klientoch netreba nic konfigurovat, akurat musia mat IP v povolenej casti: 192.168.1.0/28 [192.168.1.1-31]
pozn.: mal som dost velky problem odchytavat tcpdump vystup a vykonat nan prikaz.
Tu je skript, ktory to zabezpeci (odskusany : ASUS WL500gl-v2 + DD-WRT v24-sp2).
#!/bin/sh WOL_MAC=00:0E:A6:24:8A:7E # MAC adresa PC, ktore chceme zapnut WOL_DSTIP=192.168.1.2 # IP adresa PC, ktore chceme zapnut WOL_SRCNET=192.168.1.0/24 # NET z ktorej je dovolene zapnut PC. treba pozriet tcpdump tcpdump -n -p -t -l -q -i br0 "arp and dst ${WOL_DSTIP} and src net ${WOL_SRCNET}" | while read line; do /usr/sbin/wol -i 192.168.1.255 -p 12233 ${WOL_MAC} done $0 & #spusti znova, ak spadne
pre router s DD-WRT funguje po povoleni jffs filesystemu tam vytvorit subor "/jffs/etc/config/wol.startup"
a nastavit execute bit. To zabezpeci spustenie pri starte. Je mozne vyuzit priamo nastavenie z nvram pre WOL.
Zoznam vypiseme "nvram show | grep wol"
.
Popis: kontroluje sa kazdych 10s, ci sa pouzila nejaka IP pomocou stavu ARP tabulky. Ak sa nejaka pouzila nastavi sa aktualny cas do premennej time_last. Kontroluje sa ci aktualny cas nepresiahol posledny cas o nastavene maximum. Ak ano, vykona sa v tomto pripade poweroff
.
Tu je skript, ktory vypne PC, ked neprebieha urcity cas ziadna IP komunikacia cez siet.
#!/bin/sh time_off=600 #10min (10x60sec) time_last=`date '+%s'` while sleep 10; do active=`ip neigh show | grep -i reachable` [ -z "$active" ] || time_last=`date '+%s'` curr=`date '+%s'` elapsed=`expr $curr - $time_last` [ "$elapsed" -gt "$time_off" ] && poweroff done $0 &
Ak mate napady ako nieco vylepsit a doplnit toho viac, budem rad a doplnim postup, aby z toho vzniklo nieco uzitocne.
Tiskni
Sdílej:
while true
za while sleep 1
ať to tolik ten router nezatěžuje. Ono stejně něco zabere probuzení, takže ta vteřina zas tolik vadit nebude. Ještě bych se zkusil kouknot po implementacích pro port nocking (nebo vůbec na moduly pro iptables, možná tam něco bude), dělá to něco dost podobného, ale otázka, jestli by to fungovalo v rámci jednoho subnetu. Jinak hezký, kdysi mě něco podobného napadlo, ale zůstalo jen u myšlenky. Krom toho já jsem plánoval spíš zapínání při požadavku zvenčí (doma každý může zvednout zadek a zajít ten čudlík zmáčknout), takže by ten port nocking moh fungovat.
Ten while true
tam nie je moc dolezity, lebo normalne sa to tam nedostane a caka to stale v tcpdump na pakety. Je tam len pre pripad padnutia tcpdumu-u. Na skusanie ten while
netreba.
Priklad na zobudenie servera zvonku som videl. Bolo to riesene parsovanim logu, ktore vznikly pri prichode paketov zvonku. Bolo to niekde na http://www.dd-wrt.com/wiki/
To nie je zly napad cez iptables. Musim sa na to pozriet a vyskusat. Bolo by to elegantne riesenie.
Pozn. Ak to ma bezat na routry treba zmenit interface u mna eth0 na br0.
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.