Некоторое сетевое оборудование (к примеру, Cisco 7940, о котором была предшествующая статья) требует наличия в локальной сети NTP-сервера для получения текущего времени из доверенного источника. Некоторые роутеры поддерживают работу в режиме NTP-сервера уже из коробки, а некоторые требуют установки специализированных прошивок типа OpenWRT или ddWRT. В моей же сети есть Asus RT-N12VP, который поддерживает только прошивку TomatoUSB by shibby (ну, еще определенными шаманскими методами можно ddWRT загрузить, но поднять WAN на ней мне пока так и не удалось), а она имеет лишь встроенный NTP-клиент.
Стоит отметить принцип работы прошивки на данном роутере: она загружена таким образом, что при перезагрузке роутера просто выгружается в /tmp в полноценном режиме чтения/записи, а затем монтируется уже в режиме чтения в более привычные /etc, /dev и пр. Но, так как выгрузка происходит во временную память, то и все изменения, внесенные в эти файлы, живы лишь до следующей перезагрузки роутера, после чего все снова становится девственно чистым, как будто прошивка только что была загружена.
Для решения этой проблемы существует правильный вариант (который я тоже обязательно когда-нибудь рассмотрю в деталях, но не сегодня, т.к. мне лень) — модификация самого файла прошивки перед ее загрузкой на роутер. Суть такой модификации в нашем случае заключается в том, чтобы распаковать прошивку, добавить в нее нужный нам исполняемый файл и его настройки, после чего запаковать обратно. Стоит отметить, что при работе данным методом следует очень внимательно следить за размером полученного в итоге файла, т.к. иногда лишние 10Кб размера могут привести к невозможности ее работы на роутере из-за недостатка памяти.
Сегодня же мы рассмотрим более простой и ленивый вариант, так сказать, workaround. Для него нам потребуется действующий http-сервер (где угодно, хоть в локальной сети, хоть за ее пределами), на который мы можем загрузить файлы и потом скачать их по прямой ссылке.
1. Сами файлы
Нам нужен исполняемый файл ntpd, который есть
Кроме этого, нам потребуется файл с конфигурацией ntpd, его можно взять отсюда:
driftfile "/tmp/etc/ntpd/ntpd_drift"
# logfile
logfile "/tmp/etc/ntpd/ntpd.log"
logconfig -allinfo -allevents -allstatistics -allstatus -clockinfo -clockevents -clockstatistics -clockstatus -clockall +syncinfo +syncevents +syncstatistics +syncstatus +syncall -sysinfo +sysevents -sysstatistics -sysstatus -sysall
# interfaces
broadcast 192.168.1.255
broadcastclient
interface drop ipv6
interface listen 192.168.1.1
# ntp servers to get time from
server 216.239.35.0 prefer true
server 131.188.3.220
server 194.25.134.196
server 71.40.128.146
# default access settings
restrict default kod nomodify notrap noquery nopeer
restrict 127.0.0.1 mask 255.255.255.255
restrict 192.168.1.1 mask 255.255.255.0 nomodify
В данном файле предполагается, что вы используете сеть 192.168.1.0/24 с широковещательным адресом 192.168.1.255 и роутером по адресу 192.168.1.1, на котором и будет работать NTP-сервер. Если что не так, то измените соответствующие адреса. Само время будет получаться приоритетно с сервера Google Time, а если он не ответит, то с других бесплатных сетевых NTP-серверов. Блок «restrict» ограничивает доступ к NTP-серверу адресом 127.0.0.1 (для собственных обращений роутера) и внутренней сетью 192.168.1.0/24.
Теперь пришло время загрузить полученные файлы на наш http-сервер. В статье будет использоваться сервер 192.168.1.215, на котором создана папка ntpd, в которой все это будет храниться. Обратите внимание, что для того, чтобы не менять никакие настройки сервера и без лишних вопросов отдавать файлы при запросе, я сохранил исполняемый файл ntpd как ntpd.txt, а файл конфигурации — ntpd_conf.txt.
2. Скрипт для TomatoUSB
Заходим в панель управления роутером, далее в Administration -> Scripts -> WAN Up. Почему не Init? Потому что при инициализации сеть еще не поднята и связи у роутера еще нет, в то же время при поднятии WAN она уже есть однозначно.
Вставляем в текстовое поле сделующий скрипт:
killall ntpd
sleep 1
rm /tmp/etc/ntpd -Rf
mkdir /tmp/etc/ntpd
wget http://192.168.1.215/ntpd/ntpd.txt -O /tmp/etc/ntpd/ntpd
chmod +x /tmp/etc/ntpd/ntpd
wget http://192.168.1.215/ntpd/ntpd_conf.txt -O /tmp/etc/ntpd/ntpd.conf
/tmp/etc/ntpd/ntpd -c /tmp/etc/ntpd/ntpd.conf
В данном скрипте, мы сначала убиваем всех запущенных демонов ntpd (не забывайте, что у роутера есть собственный, но без функций сервера), затем устраняем папку, в которой должен быть наш NTP-сервер (на случай, если произошло переподключение WAN, а не поднятие при загрузке) и создаем ее заново. В папку скачиваем сам ntpd и сразу даем ему права на исполнение, после чего скачиваем настройки и запускаем.
3. Проверка
В среде Linux я осуществлял проверку работы NTP-сервера следующим образом:
ntpq -p 192.168.1.1
Если эта команда возвращает Connection refused — сервер не работает, если некоторое время не отвечает, а потом сообщает «Connection timed out» — значит все нормально работает и можно попробовать синхронизировать время с этим сервером. В Windows, кстати, скорее всего, можно ввести 192.168.1.1 в качестве NTP-сервера в настройках времени и попробовать также с ним синхронизироваться.