в My book live

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

В поисках решения этой задачи было принято решение поставить 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 у нас работает веб-интерфейс). Скриншот ниже демонстрирует пример настройки:

После всех описанных выше действий мы считаем, что обращаясь по адресу 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 = $_GET['ip'];
$mac = $_GET['mac'];

$ip = preg_replace('/[^0-9.]+/i', '', $ip);
$mac = preg_replace('/[^a-f0-9:]+/i', '', $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 и успешного включения подопечного компьютера.

А на этом всё, если будут возникать вопросы — смело спрашивайте в комментариях.

Бабахнуть комментарий

Комментарии