[OpenWRT] 외부 네트워크로부터 WOL(Wake on LAN) 패킷 보내기

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분 안에 켤 경우에 작동하지 않는다는 단점이 있습니다.

목차

  1. Port Forwarding
  2. Crontab
  3. Android Application

1. Port Forwarding

먼저 WOL Packet을 해당 PC로 전달할 수 있도록 Port forwarding을 진행합니다.

외부 port를 내부 Port 7번으로 forward합니다.

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라고 뜨는 것으로 확인 가능합니다.

저는 두 개를 세팅해서 사용해서, PERMANENT가 두 개로 뜹니다.

3. Android Application

마지막으로 WOL Packet을 쉽게 보내줄 Android application입니다. 다른 어플리케이션이나 PC에서 보내도 문제는 없습니다만, 이 어플리케이션이 가장 간편하고 위젯 형태로 사용 가능해서 활용중입니다.

설정 페이지입니다.
  1. MAC주소: 전원을 켤 PC의 MAC 주소입니다. 상단 스크립트의 LLADDR 과 동일합니다.
  2. 호스트네임 / IP / 브로드캐스트 주소: 라우터의 공용 IP입니다. 라우터에 접속된 PC에서 whatsmyip.com에 접속 하여 간단히 확인할 수 있습니다.
  3. 포트: 포트포워딩 할 때 사용했던 외부 포트입니다.
  4. (선택) 기기 IP, 상태 확인 포트: 켜졌는지 여부를 확인하는 IP와 포트입니다. 저는 동일한 IP와 RDP 포트를 사용했습니다.

이제, Wake On Lan 어플리케이션에서 쉽게 PC 전원을 켤 수 있습니다. 위젯을 만들어 홈 화면에 배치하면 더 쉽게 켤 수도 있습니다!