NTP-сервер на базе TomatoUSB by shibby


Некоторое сетевое оборудование (к примеру, Cisco 7940, о котором была предшествующая статья) требует наличия в локальной сети NTP-сервера для получения текущего времени из доверенного источника. Некоторые роутеры поддерживают работу в режиме NTP-сервера уже из коробки, а некоторые требуют установки специализированных прошивок типа OpenWRT или ddWRT. В моей же сети есть Asus RT-N12VP, который поддерживает только прошивку TomatoUSB by shibby (ну, еще определенными шаманскими методами можно ddWRT загрузить, но поднять WAN на ней мне пока так и не удалось), а она имеет лишь встроенный NTP-клиент.

Стоит отметить принцип работы прошивки на данном роутере: она загружена таким образом, что при перезагрузке роутера просто выгружается в /tmp в полноценном режиме чтения/записи, а затем монтируется уже в режиме чтения в более привычные /etc, /dev и пр. Но, так как выгрузка происходит во временную память, то и все изменения, внесенные в эти файлы, живы лишь до следующей перезагрузки роутера, после чего все снова становится девственно чистым, как будто прошивка только что была загружена.

Для решения этой проблемы существует правильный вариант (который я тоже обязательно когда-нибудь рассмотрю в деталях, но не сегодня, т.к. мне лень) — модификация самого файла прошивки перед ее загрузкой на роутер. Суть такой модификации в нашем случае заключается в том, чтобы распаковать прошивку, добавить в нее нужный нам исполняемый файл и его настройки, после чего запаковать обратно. Стоит отметить, что при работе данным методом следует очень внимательно следить за размером полученного в итоге файла, т.к. иногда лишние 10Кб размера могут привести к невозможности ее работы на роутере из-за недостатка памяти.

Сегодня же мы рассмотрим более простой и ленивый вариант, так сказать, workaround. Для него нам потребуется действующий http-сервер (где угодно, хоть в локальной сети, хоть за ее пределами), на который мы можем загрузить файлы и потом скачать их по прямой ссылке.

1. Сами файлы
Нам нужен исполняемый файл ntpd, который есть вот в этой сборке. Из архива потребуется только сам файл 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-сервера в настройках времени и попробовать также с ним синхронизироваться.


07.11.2018, 12:43
  NTP, ntpd, Asus, TomatoUSB.
Просмотров: 335271.
2