지난 3일 동안 내 문제에 대한 해결책을 찾고 있었지만 아직 아무 것도 효과가 없었습니다.
목표
원격으로 집에 있는 컴퓨터를 깨울 수 있어야 합니다. 이제 로컬에서 WOL을 작동하게 되었습니다. Android 휴대폰에서 컴퓨터를 켤 수 있습니다. 집에서 멀리 떨어져 있어도 작동해야 합니다.
내 네트워크 설정
두 개의 라우터가 있는데 기본 라우터는 ISP에 연결되어 있고 포트 전달을 지원하지만 WOL 기능이 없는 독점 소프트웨어를 실행합니다. 보조 라우터는 이더넷 케이블을 통해 첫 번째 라우터에 연결되고 dd-wrt를 실행합니다. 내 집 컴퓨터는 이더넷 케이블을 통해 보조 라우터에 연결되어 있으며 고정 IP 주소를 가지고 있습니다. 또한 no-ip 덕분에 기본 라우터에 연결되는 동적 DNS를 구성했습니다.
내가 시도한 솔루션
제가 시도한 첫 번째 해결책은 기본 라우터의 포트 7에서 들어오는 UDP 트래픽을 보조 라우터의 포트 7로 전달하는 것이었습니다. 그런 다음 보조 라우터의 포트 7에서 들어오는 UDP를 내 집 컴퓨터로 전달하십시오. 그것은 효과가 없었습니다. 집에 있는 컴퓨터의 arp 테이블에 고정 입구를 설정해도 작동하지 않았습니다.
내가 보기에 가장 안전한 두 번째 해결책은 dd-wrt가 내 집 컴퓨터에 대한 요청에 대한 로그 파일을 확인하도록 하는 것으로 구성되며, 이를 발견하면 dd-wrt는 wol 명령을 실행하여 컴퓨터를 깨웁니다. 이 스크립트를 찾았습니다.
#!/bin/sh
#Enable JFFS2 and place script in /jffs/ then run on startup in web interface.
#You can check the log from http://192.168.2.1/user/wol.html
INTERVAL=1
PINGTIME=1
OLD=""
PORT=32400
WOLPORT=9
TARGET=192.168.2.4
BROADCAST=192.168.2.255
MAC=00:1f:5b:32:c6:0c
WOL=/usr/sbin/wol
LOGFILE="/tmp/www/wol.html"
echo "<meta http-equiv=\"refresh\" content=\"10\">" > $LOGFILE
echo "AUTO WOL Script started at" `date` "<br>" >> $LOGFILE
while sleep $INTERVAL;do
NEW=`dmesg | awk '/ACCEPT/ && /DST='"$TARGET"'/ && /DPT='"$PORT"'/ {print }' | tail -1`
SRC=`dmesg | awk -F'[=| ]' '/ACCEPT/ && /DST='"$TARGET"'/ && /DPT='"$PORT"'/ {print $7}' | tail -1`
LINE=`dmesg | awk '/ACCEPT/ && /DST='"$TARGET"'/ && /DPT='"$PORT"'/'`
if [ "$NEW" != "" -a "$NEW" != "$OLD" ]; then
if ping -qw $PINGTIME $TARGET >/dev/null; then
echo "NOWAKE $TARGET was accessed by $SRC and is already alive at" `date` "<br>">> $LOGFILE
else
echo "WAKE $SRC causes wake on lan at" `date` "<br>">> $LOGFILE
$WOL -i $BROADCAST -p $WOLPORT $MAC >> $LOGFILE
echo "<br>" >> $LOGFILE
sleep 1
fi
OLD=$NEW
fi
done
스크립트를 구성했는데, 저장된 로그에는 /tmp/www/wol.html
스크립트의 while 루프 이전에 두 개의 echo 명령의 출력이 포함되어 있습니다.
dd-wrt 로그에 문제가 있는 것 같습니다. 검사해 보니 IP 주소나 포트에 대한 정보가 전혀 포함되어 있지 않은 것 같습니다.
Sep 1 16:58:00 DD-WRT user.info : dhcpfwd : dhcp forwarder daemon successfully started
Sep 1 17:00:00 DD-WRT user.info : dhcpfwd : dhcp forwarder daemon successfully started
Sep 1 17:02:01 DD-WRT user.info : dhcpfwd : dhcp forwarder daemon successfully started
Sep 1 17:04:00 DD-WRT user.info : dhcpfwd : dhcp forwarder daemon successfully started
Sep 1 17:06:00 DD-WRT user.info : dhcpfwd : dhcp forwarder daemon successfully started
Sep 1 17:06:39 DD-WRT daemon.info hostapd: ath0: STA ac:cf:85:a1:f0:1b IEEE 802.11: disassociated due to inactivity
Sep 1 17:06:40 DD-WRT daemon.info hostapd: ath0: STA ac:cf:85:a1:f0:1b IEEE 802.11: deauthenticated due to inactivity (timer DEAUTH/REMOVE)
Sep 1 17:06:45 DD-WRT daemon.info hostapd: ath0: STA fc:3f:7c:8b:0c:71 IEEE 802.11: disassociated due to inactivity
Sep 1 17:06:46 DD-WRT daemon.info hostapd: ath0: STA fc:3f:7c:8b:0c:71 IEEE 802.11: deauthenticated due to inactivity (timer DEAUTH/REMOVE)
Sep 1 17:07:08 DD-WRT auth.info login[1874]: root login on 'pts/0'
스크립트가 작동하지 않는 이유를 아는 사람이 있습니까? 대체 솔루션이 있나요?
답변1
좋아, 마침내 해결책을 찾았습니다.
기본 라우터에서는 포트 9로 들어오는 UDP 트래픽을 보조 라우터로 전달합니다.
두 번째 라우터에 대해 dd-wrt에서 syslogd 및 방화벽 로그인을 활성화했으며 해당 로그는 /proc/net/ip_conntrack 파일에 저장됩니다.
dd-wrt에 다음 시작 스크립트를 추가했습니다.
#! /bin/sh
WOL=/usr/sbin/wol
MAC_VMC=cd:6e:a2:32:87:6v
BCAST=192.168.2.255
LOGFILE="/tmp/www/wol.html"
echo "AUTO WOL Script started at" `date` "<br>" >> $LOGFILE
while sleep 5 ; do
if [ `egrep -c udp.+dport=9 /proc/net/ip_conntrack` -gt 0 ] ; then
echo "Sending Magic Packet at" `date` >> $LOGFILE
$WOL -i $BCAST -p 7 $MAC_VMC
sleep 120
fi
done
트래픽 로그 파일을 감시하고 포트 9에서 UDP 트래픽을 발견하면 dd-wrt wol 명령을 사용하여 내 집 컴퓨터를 깨웁니다.
원격으로도 완벽하게 작동합니다. 유일한 관심사는 보안입니다.