WOL Script Wake Up Your Webserver On Internet Traffic - XIYO/asuswrt-merlin.ng-kr GitHub Wiki
์ด ์คํฌ๋ฆฝํธ๋ ์๋ฒ์ ํฌํธ์ ์ก์ธ์คํ๋ ค๋ ์ฌ๋๋ค์ด ์๋ฒ๋ฅผ ๊นจ์ฐ๊ณ ์ ํ๋ ์ฌ๋๋ค์ ์ํ ๊ฒ์ ๋๋ค. ์ด ์คํฌ๋ฆฝํธ๋ ์ฌ์ฉ๋ ํฌํธ์ ์๊ด์์ด ์ด๋ค ์์ฒญ์๋ ์๋ตํ๋ฏ๋ก ํฌํธ ์ค์บ์ด ์น ์๋ฒ๋ฅผ ๋งค๋ฒ ๊นจ์ธ ์ ์์ต๋๋ค.
์คํฌ๋ฆฝํธ๋ฅผ ์กฐ๊ธ ์์ ํ์ฌ ๋ด ํ์์ ๋ง๊ฒ ๋ค์ ์์ฑํ์ต๋๋ค. ์ด ํ์ด์ง ํ๋จ์๋ ์๋ฒ๋ฅผ ํ๋์ ํฌํธ์์๋ง ๊นจ์ฐ๊ณ ์ ํ๋ ์ฌ๋๋ค์ ์ํ ๋ค๋ฅธ ์คํฌ๋ฆฝํธ๊ฐ ์์ต๋๋ค.
๋ณ๊ฒฝ ๋ก๊ทธ:
06/02/2017: /usr/bin/ether-wake ๊ฒฝ๋ก๋ฅผ /usr/sbin/ether-wake๋ก ๋ณ๊ฒฝ [๋ฒ์ 380.65์์ ๋ณ๊ฒฝ]
์ถ๋ ฅ์ ๋ณธ๋ฌธ๋ง ํ์ํฉ๋๋ค.
Wake On Lan ์คํฌ๋ฆฝํธ ์ฌ์ฉ ๊ฐ์ด๋:
1. ๋ผ์ฐํฐ๋ก ์ด๋ํ๊ณ ๋ก๊ทธ์ธํ์ธ์ (192.168.1.1) ์ฌ์ฉ์ ์ด๋ฆ๊ณผ ๋น๋ฐ๋ฒํธ๋ก.
2. ๊ด๋ฆฌ ์ต์
์ผ๋ก ์ด๋ํ๊ณ JFFS ํํฐ์
์ ํ์ฑํํ๊ณ ๋ค์ ๋ถํ
์ JFFS ํํฐ์
์ ํฌ๋งทํ๋๋ก ์ค์ ํ์ธ์.
3. SSH์ Telnet์ ํ์ฑํํ์ธ์.

4. ์ ์ฉ ๋ฒํผ์ ๋๋ฅด๊ณ ๋ผ์ฐํฐ๋ฅผ ๋ค์ ์์ํ์ธ์!
5. WINSCP๋ฅผ ๋ค์ด๋ก๋ํ์ธ์. [๋ค์ด๋ก๋](http://winscp.net/download/winscp439setup.exe)
6. WINSCP๋ฅผ ์์ํ๊ณ ๋ก๊ทธ์ธํ์ธ์.

7. SCP ํ๋กํ ์ฝ์ ์ ํํ๊ณ ์ฌ์ฉ์ ์ด๋ฆ๊ณผ ๋น๋ฐ๋ฒํธ๋ ๋ผ์ฐํฐ ์ค์ ์ ์ฌ์ฉํ ๊ฒ๊ณผ ๋์ผํด์ผ ํฉ๋๋ค.
(WINSCP๋ ์ผ๋ถ ๊ทธ๋ฃน์ด ๋๋ฝ๋์๋ค๋ ๊ฒฝ๊ณ ๋ฅผ ํ์ํ ๊ฒ์ด์ง๋ง ์ด๊ฒ์ ๊ด์ฐฎ์ต๋๋ค. ์์
์ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค.)
8. ๋ฃจํธ ํด๋๋ก ์ด๋ํ๊ณ JFFS ํด๋๋ฅผ ํด๋ฆญํ์ธ์.

9. 'scripts'๋ผ๋ ํด๋๊ฐ ์์ด์ผ ํฉ๋๋ค (์๋ค๋ฉด ๋ง๋์ธ์!).
10. 'JFFS' ํด๋ ์์์ ๋ง์ฐ์ค ์ค๋ฅธ์ชฝ ๋ฒํผ์ ํด๋ฆญํ๊ณ ์๋ก ๋ง๋ค๊ธฐ > ํ์ผ์ ์ ํํ์ธ์. ํ์ผ ์ด๋ฆ์ 'services-start'๋ก ์ง์ ํ์ธ์.
๋ด์ฉ์ ๋ถ์ฌ๋ฃ์ผ์ธ์.
#!/bin/sh
sh /jffs/scripts/wake.sh&

11. ๋ค๋ฅธ ํ์ผ์ ๋ง๋ค๊ณ ์ด๋ฆ์ 'wake.sh'๋ก ์ง์ ํ๊ณ ์๋ ๋ด์ฉ์ ๋ถ์ฌ๋ฃ์ผ์ธ์.
```shell
#!/bin/sh
# ์คํฌ๋ฆฝํธ ์ค์
INTERVAL=5
NUMP=1
OLD=""
TARGET="๊นจ์ฐ๊ณ ์ ํ๋ ๋์์ IP ์ฃผ์"
IFACE=br0
MAC="๊นจ์ฐ๊ณ ์ ํ๋ ๋์์ MAC ์ฃผ์"
WOL="/usr/sbin/ether-wake"
LOGFILE="/var/log/ether-wake.log"
while sleep $INTERVAL; do
NEW=$(dmesg | awk '/ACCEPT/ && /DST='"$TARGET"'/ {print }' | tail -1)
SRC=$(echo $NEW | awk -F'[=| ]' '/SRC/{for(i=1;i<=NF;i++) if($i ~ /SRC/) print $(i+1)}')
DPORT=$(echo $NEW | awk -F'[=| ]' '/DPT/{for(i=1;i<=NF;i++) if($i ~ /DPT/) print $(i+1)}')
PROTO=$(echo $NEW | awk -F'[=| ]' '/PROTO/{for(i=1;i<=NF;i++) if($i ~ /PROTO/) print $(i+1)}')
if [ "$NEW" != "" -a "$NEW" != "$OLD" ]; then
if ! ping -qc $NUMP $TARGET >/dev/null; then
# echo "$TARGET๋ $SRC์ ์ํด $DPORT ํฌํธ, ํ๋กํ ์ฝ $PROTO๋ก ์ ๊ทผ๋์์ผ๋ฉฐ ์ด๋ฏธ ํ์ฑํ๋์ด ์์ต๋๋ค." `date`>> $LOGFILE
# else
echo "$SRC์ ์ํด $DPORT ํฌํธ, ํ๋กํ ์ฝ $PROTO๋ก $TARGET์ ๊นจ์ฐ๊ธฐ ์์ฒญ๋ฐ์์ผ๋ฉฐ ์๊ฐ์" `date`>> $LOGFILE
$WOL -i $IFACE $MAC
sleep 5
fi
OLD=$NEW
fi
done
- ์คํฌ๋ฆฝํธ์ IP์ MAC์ ์ ๋ ฅํ์ธ์.
์ด์ ์ด๋ ๊ฒ ๋ณด์ฌ์ผ ํฉ๋๋ค.
์ด์ ๋ช ๊ฐ์ง Telnet SSH ๋ช ๋ น์ ์คํํด์ผ ํฉ๋๋ค.
PUTTY๋ฅผ ๋ค์ด๋ก๋ํ์ธ์. ๋ค์ด๋ก๋
- PUTTY๋ฅผ ์ฌ์ฉํ์ฌ ๋ก๊ทธ์ธํ์ธ์ (192.168.1.1).
- ๋ผ์ฐํฐ ์ฌ์ฉ์ ์ด๋ฆ๊ณผ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํ์ธ์.
์ด์ PUTTY์ ๋ณต์ฌํ์ฌ ๋ถ์ฌ๋ฃ์ผ์ธ์.
chmod +x /jffs/scripts/wake.sh
chmod +x /jffs/scripts/services-start
์ด ๋ช ๋ น์ผ๋ก ํ์ผ์ ์คํ ๊ฐ๋ฅํ๊ฒ ๋ง๋ญ๋๋ค.
๋ง์ง๋ง ๋จ๊ณ๊ฐ ํ๋ ๋ ํ์ํฉ๋๋ค!
- ๋ผ์ฐํฐ ์น ํ์ด์ง (192.168.1.1)์ ๋ก๊ทธ์ธํ์ธ์. ๋ฐฉํ๋ฒฝ๋ก ์ด๋ํ๊ณ ๋ก๊น ๋ ํจํท์ ACCEPTED๋ก ์ค์ ํ์ธ์.
- ์ ์ฉ ๋ฒํผ์ ๋๋ฅด์ธ์. ์ด์ ๋ผ์ฐํฐ๋ฅผ ๋ค์ ์์ํ์ธ์. ํ ์คํธํ ์๊ฐ์ ๋๋ค.
๋์ฒด ๋ฐฉ๋ฒ
์๋ฒ๋ฅผ ๊นจ์ฐ๊ธฐ ์ํด ํ๋์ ํฌํธ๋ฅผ ์ง์ ํ๋ ค๋ฉด ์ด ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ธ์.
#!/bin/sh
# ์คํฌ๋ฆฝํธ ์ค์
INTERVAL=5
NUMP=3
OLD=""
TARGET="๋ด๋ถ IP ์ฃผ์๋ฅผ ์ฌ๊ธฐ์ ์
๋ ฅํ์ธ์!"
PORT="ํฌํธ๋ฅผ ์ฌ๊ธฐ์ ์ง์ ํ์ธ์!"
IFACE=br0
MAC="MAC ์ฃผ์๋ฅผ ์ฌ๊ธฐ์ ์
๋ ฅํ์ธ์!"
WOL="/usr/sbin/ether-wake"
LOGFILE="/var/log/ether-wake.log"
while sleep $INTERVAL; do
NEW=$(dmesg | awk '/ACCEPT/ && /DST='"$TARGET"'/ && /DPT='"$PORT"'/ {print }' | tail -1)
SRC=$(echo $NEW | awk -F'[=| ]' '/SRC/{for(i=1;i<=NF;i++) if($i ~ /SRC/) print $(i+1)}')
DPORT=$(echo $NEW | awk -F'[=| ]' '/DPT/{for(i=1;i<=NF;i++) if($i ~ /DPT/) print $(i+1)}')
PROTO=$(echo $NEW | awk -F'[=| ]' '/PROTO/{for(i=1;i<=NF;i++) if($i ~ /PROTO/) print $(i+1)}')
if [ "$NEW" != "" -a "$NEW" != "$OLD" ]; then
if ! ping -qc $NUMP $TARGET >/dev/null; then
# echo "$TARGET๋ $SRC์ ์ํด $DPORT ํฌํธ, ํ๋กํ ์ฝ $PROTO๋ก ์ ๊ทผ๋์์ผ๋ฉฐ ์ด๋ฏธ ํ์ฑํ๋์ด ์์ต๋๋ค." `date`>> $LOGFILE
# else
echo "$SRC์ ์ํด $DPORT ํฌํธ, ํ๋กํ ์ฝ $PROTO๋ก $TARGET์ ๊นจ์ฐ๊ธฐ ์์ฒญ๋ฐ์์ผ๋ฉฐ ์๊ฐ์" `date`>> $LOGFILE
$WOL -i $IFACE $MAC
sleep 5
fi
OLD=$NEW
fi
done
๋์ฒด ๋ฐฉ๋ฒ 2 - ๋ชจ๋ ACCEPT ๋ก๊ทธ๋ฅผ ๊ธฐ๋กํ์ง ์๊ณ ์ฌ๋ฌ ๋์์ ๊นจ์ฐ๊ธฐ
๋ชจ๋ ๋ก๊ทธ๋ฅผ ๊ธฐ๋กํ๊ณ ์ถ์ง ์๋ค๋ฉด ๋ฐฉํ๋ฒฝ ๋ก๊ทธ๋ ํจํท์ "none"์ผ๋ก ์ค์ ํ ์ํ์์ "nat-start" ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
#!/bin/sh
iptables -I FORWARD -d <๋์ IP> -p tcp --dport <๋์ ํฌํธ> -j LOG --log-prefix "[2WAKE] <๊นจ์ธ MAC ์ฃผ์> "
๊ทธ๋ฆฌ๊ณ "wake.sh" ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ญ๋๋ค.
#!/bin/sh
INTERVAL=3
NUMP=1
OLD=""
IFACE=br0
WOL="/usr/sbin/ether-wake"
logger "์๋ WOL ์คํฌ๋ฆฝํธ๊ฐ ์์๋์์ต๋๋ค." `date`
while sleep $INTERVAL; do
NEW=$(dmesg | awk '/2WAKE/ {print }' | tail -1)
if [ "$NEW" != "" -a "$NEW" != "$OLD" ]; then
MAC=$(dmesg | awk -F'[=| ]' '/2WAKE/ {print $2}' | tail -1)
TARGET=$(dmesg | awk -F'[=| ]' '/2WAKE/ {print $10}' | tail -1)
SRC=$(dmesg | awk -F'[=| ]' '/2WAKE/ {print $8}' | tail -1)
if ping -qc $NUMP $TARGET >/dev/null; then
logger "NOWAKE $TARGET was accessed by $SRC and is already alive at" `date`
sleep 500
else
logger "WAKE $SRC causes WOL of $TARGET using $MAC at" `date`
$WOL -i $IFACE $MAC | logger
sleep 5
fi
OLD=$NEW
fi
done
์ด ๋ฐฉ๋ฒ์ ๋ชจ๋ ACCEPT ๋ก๊ทธ๋ฅผ ๊ธฐ๋กํ์ง ์๊ณ ์ฌ๋ฌ ๋์์ ๊นจ์ธ ๋ ์ฌ์ฉํ ์ ์๋ ๋์ ๋ฐฉ๋ฒ์ ๋๋ค.