Включение сервера с помощью мобильного телефона из внешнего мира

imageДоброго времени суток хабравчане! Всё началось с того, что работая удалённо в терминале понадобилось перезагрузить сервер. Толи день не задался, толи мысли были о чём-то другом и вместо команды:
sudo shutdown -r now
отправил его отдыхать после нелёгкого рабочего дня, командой:
sudo shutdown now Enter
И всё произошло машинально и так быстро, что даже сам не успел понять. Понимание стало приходить минут через 15-20, после безудержных попыток подключится удалённо к терминалу. И думаю даже не стоит говорить о том как далеко находился сервер, и добраться до него было практически невозможно. После долгих телефонных разговоров и объяснений куда кому пойти, и что где нажать, сервер всё же вернулся в рабочий ритм. После чего и появилась идея о включении сервера удалённо.

И так имеем:
  • сервер с Ethernet интерфейсом с поддержкой Wake-on-LAN (далее WOL)
  • операционная система: Ubuntu Server 12.04.2 LTS
  • маршрутизатор Cisco 85/86/87/88/89x
  • мобильный телефон Nokia N9

a. включем/проверяем в BIOS сервера поддержку WOL
b. включаем/проверяем поддержку WOL в Ubuntu Server
Для этого устанавливаем пакет ethtool
sudo apt-get install ethtool
после чего проверяем поддерку WOL
sudo ethtool <интерфейс> | grep Wake
выввод команды должен быть следующим
Supports Wake-on: g
Wake-on: g
это говорит о том, что сетевая карта поддерживает WOL и он включен. Если же
Supports Wake-on:
буква отличная от g, то сетевая карта не поддерживает WOL. И если он выключен
Wake-on:d
то включим его следующей командой:
sudo ethtool -s <интерфейс> wol g
На многих системах эту команду приходится выполнять после перезагрузки, поэтому сделаем чтобы она выполнялась каждый раз при загрузке системы автоматически. Для этого создадим файл wakeonlan.conf следующими командами:
sudo bash -c "cat > /etc/init/wakeonlan.conf" <<'EOF'
start on started network

script
    for interface in $(cut -d: -f1 /proc/net/dev | tail -n +3); do
        logger -t 'wakeonlan init script' enabling wake on lan for $interface
        ethtool -s $interface wol g
    done
end script

Сделаем файл исполняемым
sudo chmod +x /etc/init/wakeonlan.conf
и запустим службу
sudo service wakeonlan start
c. на маршрутизаторе Cisco настроим пересылку WOL пакета. Для этого добавим следующие команды:
interface X
ip directed-broadcast
!
!
ip nat inside source static udp a.b.c.255 7 interface Y 7
где
interface X — локальный интерфейс (ip nat inside)
interface Y — внешний интерфейс (ip nat outside)
d. на телефон Nokia N9 добавим perl скрипт создающий WOL пакет следующего содержания:
wol.pl
#!/usr/bin/perl -w
 
# wol.pl, written 20031220 by Walter Roberson robe...@ibd.nrc-cnrc.gc.ca
 
# this program constructs a WOL (Wake on Lan) packet suitable for
# sending locally or over a net. The MAC of the system to be woken
# is required.
#
# The IP address the user supplies should NOT be
# the IP address of the system to be woken: instead it should be the
# subnet directed broadcast IP (e.g., 192.168.1.255) of any subnet
# known to be present on the segment of the target system. This
# would usually be the directed broadcast IP of the target system itself,
# but need not be in cases of multiple subnets that aren't carefully
# VLAN'd away from each other.
#
# To repeat: do NOT use the IP address of the target system. Not unless
# you are on the same subnet and you are using a static ARP entry.
# The target system is asleep, so it isn't going to answer an ARP
# from a router trying to find that particular address. Use a
# broadcast address, or some other packet forwarding trick.
 
     use strict;
     require 5.002;
     use Socket;
     use Sys::Hostname;
 
     my ( $hisiaddr, $hispaddr, $hisMACtext,
          $hisaddr, $hisport, $proto,
          @MACbytes, $hisMACbin, $magicbody );
 
     die "Syntax: $0 MAC ipaddr [port]" if @ARGV < 2;
 
     $hisMACtext = shift @ARGV;
     $hisaddr = shift @ARGV;
     $hisport = shift @ARGV || 22357;    # default 'WU', no significance
 
     $magicbody = "\xff" x 6;
     @MACbytes = split /[:-]/, $hisMACtext;
     die "MAC wrong size" unless @MACbytes == 6;
 
     $hisMACbin = pack "H*H*H*H*H*H*", @MACbytes;
     $magicbody .= $hisMACbin x 16;
 
     $proto = getprotobyname('udp');
     socket(SOCKET, PF_INET, SOCK_DGRAM, $proto)   || die "socket: $!";
 
     $| = 1;
     print "WOL packet being sent to udp port $hisport of ip $hisaddr\n";
     $hisiaddr = inet_aton($hisaddr)    || die "unknown host $hisaddr";
     $hispaddr = sockaddr_in($hisport, $hisiaddr);
 
     defined(send(SOCKET, $magicbody, 0, $hispaddr))    ||
         die "send $hisaddr: $!"; 

сделаем скрипт исполняемым в терминале телефона
chmod +x wol.pl
запускается скрипт в терминале со следующими параметрами
./wol.pl <MAC адрес интерфейса сервера воткнутого в машрутизатор в формате XX-XX-XX-XX-XX-XX> <внешний IP адрес или доменное имя> <номер udp порта (в нашем случае 7)>

Самое удивительное, с момента той нелепой ошибки, так и не приходилось использовать это, разве что только в период тесто-наладки.

Использованная литература:
Поделиться публикацией
Похожие публикации
Ой, у вас баннер убежал!

Ну. И что?
Реклама
Комментарии 45
    +23
    Всегда удивляли люди, использующие shutdown -r now, когда reboot короче и интуитивнее
      –12
      Короче не всегда значит лучше)
        +12
        Аргументируйте точней, пожалуйста.
          +5
          Настоящие герои не ищут легких путей!
            +10
            shutdown -r now «тут удобно писать комментарий, за чем перегружаешь сервер», потом в логах видно
          +10
          Фразе «shutdown -r now» можно интонацию предать, а вот слову «reboot» сложно.

          для подтверждения своих слов привожу примеры:

          shutdown -r NOW
          или
          shutdown -r NOW!!!

          в первом случае система быстрой уйдет в ребут без лишних вопросов, а во втором от греха подальше нажмет физический Reset
            +4
            shudown
            — да ну…
            sudo shutdown
            — okaaaaaaaaay…
            sudo shutdown now
            — x_x
            –1
            Фразе «shutdown -r now» можно интонацию предать, а вот слову «reboot» сложно.

            для подтверждения своих слов привожу примеры:

            shutdown -r NOW
            или
            shutdown -r NOW!!!

            в первом случае система быстрой уйдет в ребут без лишних вопросов, а во втором от греха подальше нажмет физический Reset
              0
              Перезагружаюсь командой
              init 6
              
                +13
                Слабо.

                Единственный гарантированный метод ребута в линуксах (даже если залипло IO и всё плохо), это

                echo b >/proc/sysrq-trigger.
                


                Работает вне зависимости от мнения драйверов и приложений.
                  +3
                  Он может размонтировать файловые системы забыть, не надо так перезагружаться.
                    0
                    Когда рейд втупливает или драйвер какой повис более никак удаленно не ребутнешь, слава богу SSH обычно доступен в таких ситуациях. Так что еще как «надо» =)
                    +6
                    Вернее:

                    echo 1 >/proc/sys/kernel/sysrq
                    echo b >/proc/sysrq-trigger
                  0
                  Удален, не прочел комментарий выше.
                  –1
                  Заводил WoL под виндами: для успешной работы системы необходимо, чтобы операционка корректно завершила работу. Иначе пакеты тупо не ловятся. То есть после выключения света сервак таким образом не включить.
                    +2
                    Для данного случае поможет только «включаться после пропадания питания».
                    Не видел еще ни одного сервера за 13 лет стажа, где бы эта опция не была активирована
                      0
                      Ха! Наблюдал несколько компов, которые в процессе эксплуатации внезапно переставали обращать внимание на эту опцию.
                        0
                        У меня домашний десктоп с некоторых пор тоже включаться перестал, но по расписанию в биосе пока еще заводится
                        0
                        Вы не поверите, но 99% хостеров, что я знаю, держат серверы с опцией «быть выключенным при подаче питания после пропадания».
                          0
                          На хостинге это оправданно — если весь этот зоопарк после реального пропадания включится одновременно, ДГУ может не хватить мощности для запуска, обычно после пропадания сервера включаются группами, поэтапно
                          0
                          Лучше уж «восстанавливать состояние после появления питания».

                          Потому что не все сервера могут быть все время включены. Хотя это, конечно, от специфики зависит. Но, как вариант, стоят у Вас в стойке два машины, старый сервер и новый сервер. Старый выключен, сервисы на новом. Дергаем питание, и с «включаться после пропадания питания» имеем две включенные машины с одинаковыми IP.

                          Потому и рекомендую «восстанавливать состояние». А для кирдык-случаев — в серверах настроить IPMI, и сделать независимая подсеть + сетевую инфраструктуру для этих портов. От греха.

                          Плюс, в идеале, дежурная смена на площадке )
                            0
                            У меня гипервизоры, и они таки по IPMI/iLO могут быть в любом состоянии. для iLO в идеале действительно отдельная сеть.
                            А виртуалки уже ручками, если надо.
                            Но про ЦОДы я выше высказался, про аккуратное последовательное включение после даунтайма, иначе ДГУ не выдержит
                        +1
                        Лично я для себя сделал в роутере m0nowall — планировщик, и каждое утро, не зависимо от меня, в 6 часов — посылаем моим серверам WOL. На случай как раз такой)))
                          0
                          Ещё в некоторых BIOS'ах есть Wake up by Alarm, в качестве алярма можно выбрать время, в которое компьютер включится, если он выключен.
                            +1
                            А ещё в линуксах можно поменять настроки этой микрухи даже без участия биоса, и даже если в биосе настройки нет.
                              +6
                              Не знал. А можно с этого места поподробнее?
                              0
                              сутки дауна — наверное как-то не очень для сервера )
                            +5
                            Давным давно, когда деревья были большими, был у нас в цеху, что 700 метров по сугробам некий комп, который выполнял функции роутера, который в принципе тоже можно назвать сервером. Все хорошо, только вот любил этот роутер жестко подвисать по непонятным мне тогда причинам, не часто, но раз в неделю стабильно. Дык вот однажды в студеную зимнюю пору в очередной раз ползя по сугробу я подумал, да ну его нафиг, и приташил мобилу старую. Да да, именно нокию 3310. Полажил я ее заботливо приложив задней крышкой к материнке внутри компа. Позвонил на нее и комп перегрузился, прицепил я блок питания к мобиле, завинтил системник и больше в этот цех по этой причине не ходил.
                              +2
                              Не совсем понял, зачем такие костыли, если честно.

                              У HP, например, есть iLO. У других производителей есть аналогичные средства. А если сервер виртуальный, тогда еще проще.

                              Или речь об обычной персоналке, волей судеб и бюджетов исполняющей такую роль?
                                0
                                Угу… а ещё у HP есть приложение под android, которое работает с ILO (включая KVM). Очень удобно!
                                  0
                                  бывает такое явление, как интересно самому сделать :)
                                    0
                                    iLO бывает разный. На моих HP ProLiant DL140 G3 стоит LO100i (со всеми последними обновлениями), и надо отметить, что сам iLO виснет намертво после примерно месяца работы. Серверу это работать не мешает, просто перестаёт работать веб- и telnet/ssh-интерфейс iLO.

                                    Более того, когда приходится перегружать сервер из-за обновления ядра, сервера часто виснут при перезагрузке намертво, и не перегружаются даже физическими кнопками power/reset — единственное, что помогает, это выдёргивание шнура питания на минуту чтобы перегрузить не только сервер, но и повисший iLO.
                                      0
                                      Странно что у iLO нет какого нибудь WatchDog на этот случай. Да и как то странно что такое вообще происходит

                                      p.s. сам юзал только Dell DRAC
                                        0
                                        ipmitool bmc reset cold из ОС
                                          0
                                          Можно и на iLO залогиниться издали (там же не только веб) и руками из консоли ребутнуть BMC (команду не помню, но гуглится).

                                          Но, конечно, 300-я (и выше) серия серверов во многих случаях куда предпочтительнее.
                                            0
                                            telnet/ssh перестают отвечать вместе с веб, так что если один из интерфейсов повис то другие уже не помогут.
                                            0
                                            Только что проверил — не помогает. Эта команда после запуска подвисла, ждал пять минут — эффекта нет. Ни веб- ни telnet- интерфейсы спустя эти 5 минут отвечать не начали.
                                          0
                                          могу и ошибаться, но вроде на самых слабых DL с минимальным индексом, кажется, НР iLO нет — политика HP.
                                          И помнится на демонстрации G8 в МУКе инструктор говорил что это у них такая политика — хочешь на слабом сервер iLO — покупай недешевую плату отдельно.
                                          +3
                                          Всего четыре буквы: ipmi
                                            0
                                            EG-PMS-LAN
                                            У D-link по моему тоже что-то подобное есть для стоек. Ну и APC тоже вроде умеет включать-выключать.

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

                                            Куплен был этот девайс правда не для серверов, а для сетевого оборудования\АТС\ и пр.
                                            Планировщик также есть.

                                            Из примеров из мануалов есть, вариант включать принтер когда что-то появилось в очереди печати.

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

                                              или такой
                                              image

                                              Недорогие и удобные аппаратные watchdog-и.
                                                +2
                                                Как то был у нас сервер, стоял он уж очень далеко. Переодически он зависал, и очень не хотелось ездить туда тыкать restart. Так вот, поставили рядышком, на против него системник. Он пинговал этот самый сервак и при пропадании IP достижимости, системник открывал CD-ROM, и тем самым нажимал на кнопку restart на серваке. Вот такая вот история.
                                                  0
                                                  Я домашний ПК бужу вот таким «ярлыком» на рабочем столе:

                                                  sshpass -p MyPa$$w0rd ssh root@19.211.13.47 '/usr/sbin/wol -i 192.168.1.255 -p 9 30:82:A4:A1:06:68'

                                                  sshpass тут используется, потому что домашний роутер на dd-wrt не умеет хранить ключи ssh.
                                                    0
                                                    проверяем поддерку WOL
                                                    sudo ethtool <интерфейс> | grep Wake
                                                    выввод команды должен быть следующим

                                                    Supports Wake-on: g
                                                    Wake-on: g


                                                    А сиё должно что означать:

                                                    $sudo ethtool eth1 | grep Wake
                                                    Supports Wake-on: pumbg
                                                    Wake-on: g

                                                    ?
                                                      0

                                                      Set Wake-on-LAN options. Not all devices support this. The
                                                      argument to this option is a string of characters specifying
                                                      which options to enable.
                                                      p Wake on phy activity
                                                      u Wake on unicast messages
                                                      m Wake on multicast messages
                                                      b Wake on broadcast messages
                                                      a Wake on ARP
                                                      g Wake on MagicPacket(tm)
                                                      s Enable SecureOn(tm) password for MagicPacket(tm)
                                                      d Disable (wake on nothing). This option clears all previous
                                                      options.

                                                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                    Самое читаемое