OpenWRT에서 외부 네트워크로부터 WOL packet을 전달하여 PC나 NAS 기기를 켜는 방법입니다.
OpenWRT의 경우 PC를 종료하면 자동으로 ARP Table이 날라갑니다 (심지어는 Permanent로 지정해주어도 PC를 켰다가 다시 종료하면 또 날라갑니다.) IP주소와 MAC 주소가 ARP Table에 있어야만 WOL packet이 해당 PC에 정상적으로 전달되기 때문에, 여기서는 1분에 한 번씩 ARP cache를 확인하여 없으면 추가해주는 방식으로 진행하도록 하겠습니다. firewall-based 방식도 있을텐데, 건드려야 할 부분이 생각보다 많을것 같아서 포기하고 이 방식을 선택했습니다. 다만, 이 방식은 PC를 종료하자마자 1분 안에 켤 경우에 작동하지 않는다는 단점이 있습니다.
목차
- Port Forwarding
- Crontab
- Android Application
1. Port Forwarding
먼저 WOL Packet을 해당 PC로 전달할 수 있도록 Port forwarding을 진행합니다.
2. Crontab
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
# check static ARP table by every minute
* * * * * /bin/sh -c 'export IPADDR=172.x.x.x; export LLADDR=00:11:22:33:44:55; export DEV=eth0; [ -n "$(ip neigh | grep $IPADDR | grep FAIL)" ] && (echo "Restoring ARP table ..."; ip neigh del $IPADDR dev $DEV || true; ip neigh add $IPADDR lladdr $LLADDR nud permanent dev $DEV)'
위 crontab entry의 IPADDR
, LLADDR
, DEV
변수를 수정해 주시면 됩니다. 정상 작동을 위해 cron
서비스를 재시작해주시면 되며, 잘 적용되었는지 여부는 1분 정도 뒤 ip neigh
를 통해 해당 테이블에 PERMANENT
라고 뜨는 것으로 확인 가능합니다.
3. Android Application
마지막으로 WOL Packet을 쉽게 보내줄 Android application입니다. 다른 어플리케이션이나 PC에서 보내도 문제는 없습니다만, 이 어플리케이션이 가장 간편하고 위젯 형태로 사용 가능해서 활용중입니다.
- MAC주소: 전원을 켤 PC의 MAC 주소입니다. 상단 스크립트의
LLADDR
과 동일합니다. - 호스트네임 / IP / 브로드캐스트 주소: 라우터의 공용 IP입니다. 라우터에 접속된 PC에서
whatsmyip.com
에 접속 하여 간단히 확인할 수 있습니다. - 포트: 포트포워딩 할 때 사용했던 외부 포트입니다.
- (선택) 기기 IP, 상태 확인 포트: 켜졌는지 여부를 확인하는 IP와 포트입니다. 저는 동일한 IP와 RDP 포트를 사용했습니다.
이제, Wake On Lan 어플리케이션에서 쉽게 PC 전원을 켤 수 있습니다. 위젯을 만들어 홈 화면에 배치하면 더 쉽게 켤 수도 있습니다!
리눅스 초짜라 질문 드립니다 ㅠㅠ
crontab -e 치고 들어가서
* * * * * /bin/sh -c ‘export IPADDR=(내부 IP); export LLADDR=(MAC); export DEV=br-lan; [ -n “$(ip neigh | grep $IPADDR | grep FAIL)” ] && (echo “Restoring ARP table …”; ip neigh del $IPADDR dev $DEV || true; ip neigh add $IPADDR lladdr $LLADDR nud permanent dev $DEV)’
적당히 저에게 맞게 수정 후 저장하고 나왔는데 기다려도 ARP table의 지정 내부 IP가 PERMANENT로 바뀌지 않았습니다 ㅠㅠ 혹시나 해서 직접 수동으로 ARP table에 permanent로 추가하니 그제서야 되었고요. 혹시 제가 실수한게 있을까요…ㅠㅠ
Thu Jul 28 16:49:00 2022 cron.err crond[10330]: USER root pid 10434 cmd /bin/sh -c ‘export IPADDR=(내부 IP); export LLADDR=(MAC); export DEV=br-lan; [ -n “$(ip neigh | grep $IPADDR | grep FAIL)” ] && (echo “Restoring ARP table …”; ip neigh del $IPADDR dev $DEV || true; ip neigh add $IPADDR lladdr $LLADDR nud permanent dev $DEV)’
아 아니네요 작동하는거 같습니다…?(아마도? )분명 로그에는 에러라고 뜨는거같은데 정작 수동으로 ARP 테이블에서 제거 후 1분정도 기다리니 이제는 PERMANENT로 정상적으로 바뀝니다. 좋은 세팅 방법 감사합니다 드디어 WOL을 쓸수 있게 되었네요