WakeOnLan на MBL
Внимание! Данный пост был опубликован более года назад и, возможно, уже утратил свою былую актуальность. Но это не точно.

Иногда может потребоваться удаленно включить домашний компьютер. Например, вы находитесь на работе, и надо забрать кое-какие документы с домашнего компьютера - а домашних, кто мог бы тыкнуть на кнопку включения, как на зло, нет дома.

В поисках решения этой задачи было принято решение поставить wakeonlan на MBL, т.к. он всё равно постоянно включен, и на борту у него находится почти полноценный хоть и немного устаревший, но Debian. По идее этот функционал можно просто купить в виде целого комплекса решений под именем fpkmgr, но нам интересно самостоятельно разобраться, и слегка “заточить” под себя. В результате мы получим:

  1. Возможность включать любые компьютеры в локальной сети, к которой подключен MBL, если они поддерживают эту функцию, и она на них, разумеется - включена;
  2. Делать это откуда угодно, только был бы доступ к глобальной сети.

Первое с чем мы будем разбираться - это доступ к MBL из интернета. Нам необходимо иметь некоторый адрес, к которому мы будем обращаться и попадать на роутер, который как раз к интернету то и подключен, и который будет перенаправлять наши запросы к MBL. Существует такая служба - DDNS, позволяющая привязывать серый (динамический) IP адрес (который выделяет провайдер при подключении к глобальной сети) к статичному DNS имени. Таким образом, при даже при изменении IP адреса - DNS имя ссылается на конкретную железку, а в нашем случае - на наш роутер. Данную функцию поддерживают на данный момент большинство роутеров, и заострять на этом внимание мы не будем, считая, что определенное DNS имя уже имеется (далее по тексту - home_router.ddns.com). Проверяем чтоб адрес откликался на echo-пакеты (успешно отвечал на ping; некоторые модели роутеров по умолчанию блокируют icmp трафик; проверять необходимо из другой сети, например, воспользовавшись 3G интернетом; после всей настройки это можно отключить), и переходим к настройке проброса портов. Проброс портов - это функция, которая в нашем случае будет связывать запросы приходящие “извне” — с MBL, который находится “внутри” домашней сети. Все пакеты, который будут приходить на 81 порт home_router.ddns.com - необходимо перенаправлять на адрес нашего MBL, имеющий адрес 192.168.1.2, тоже на 81 порт (на 80 у нас работает веб-интерфейс). Скриншот ниже демонстрирует пример настройки:

screenshot

После всех описанных выше действий мы считаем, что обращаясь по адресу home_router.ddns.com:81 наши запросы успешно перенаправляются на 81 порт MBL, и нам остается научить его их получать, и выполнять необходимые действия. Подключаемся к нему, и создаем VirtualHost на уже установленном Apache, который будет слушать как раз 81 порт. Для этого создадим домашнюю директорию для нашего виртуального хоста /var/wol/, и создадим файл /etc/apache2/sites-available/wol описывающий виртуальный хост:

Listen 81
<VirtualHost *:81>
  ServerAdmin [email protected]
  DocumentRoot /var/wol/
  <Directory />
    Options FollowSymLinks
    AllowOverride None
  </Directory>
  ErrorLog /var/log/apache2/error.log
  LogLevel warn
</VirtualHost>

И после этого этого создадим симлинк на него в директории /etc/apache2/sites-enabled с последующим перезапуском Apache, для чего выполним:

$ ln -s /etc/apache2/sites-available/wol /etc/apache2/sites-enabled/000-wol
$ /etc/init.d/apache2 restart

Теперь создадим файл /var/wol/index.php с избитой фразой “Hello World” и проверим - отображается ли она в браузере при запросе адреса http://home_router.ddns.com:81/. Если так оно и есть - то продолжаем. Ставим необходимым минимум с которым будем работать, и проверяем корректность установки пробным запуском приложения wakeonlan, которое и будет включать необходимые компьютеры в локальной сети:

## putty.exe [email protected] -pw welc0me
$ apt-get update
$ apt-get install nano wakeonlan
$ wakeonlan -v
wakeonlan version 0.41

Остается лишь научить index.php принимать переданные параметры и выполнять необходимые действия. Наполняем его следующим содержимым:

<?php

$ip  = preg_replace('/\[^0-9.\]+/i', '', $_GET['ip']);
$mac = preg_replace('/\[^a-f0-9:\]+/i', '', $_GET['mac']);

echo "<html><head><title>Wake up!</title></head><body><p>".
  "Syntax: script.php?ip=8.8.8.8&mac=aa:bb:cc:dd:ee:ff</p><pre>n";
echo shell_exec('wakeonlan -i '.$ip.' '.$mac);
echo "n</pre><small><i>";
echo shell_exec('wakeonlan -v');
echo "</i></small></body></html>";

Теперь, вместо “Hello World” ты должен увидеть вывод выполнения приложения wakeonlan. Для того, чтоб включить определенную машину необходимо знать её IP и MAC адреса. Вооружившись этими данными мы подставляем их в строку запроса (чтоб получилась строка вида http://home_router.ddns.com:81/?ip=8.8.8.8&mac=aa:bb:cc:dd:ee:ff), и начинаем проверять путем анализа вывода wakeonlan и успешного включения подопечного компьютера. А на этом всё, если будут возникать вопросы - смело спрашивайте в комментариях.