Катастрофа в российской зоне проекта NTPPool.org
Привет, Хабр!
Своим первым постом на площадке я хочу привлечь внимание к катастрофе, сложившейся на данный момент в RU-зоне проекта NTPPool.org. Я думаю, что проект в представлении не нуждается, тем не менее, для тех, кто никогда о нём не слышал — во многом благодаря ему все ваши компьютеры, смартфоны, серверы и прочие гаджеты имеют точное время.
Из описания проекта:
pool.ntp.org — это огромный кластер серверов точного времени, предоставляющий надежный и простой в использовании NTP‑сервис для миллионов клиентов. В настоящее время услугами пула пользуются десятки миллионов систем по всему миру. Он используется по умолчанию в большинстве дистрибутивов Linux и во многих сетевых устройствах (см. информацию для производителей).
Я являюсь участником проекта довольно давно — лет 5 точно, может быть больше. У меня дома толстый канал 500 Мбит/с, я поднял на домашнем Mikrotik RB4011 NTP-сервер, научил роутер ходить на несколько российских NTP-серверов высшего уровня точности Stratum 1 и добавился в пул на правах Stratum 2. Вкратце о том, что это значит — Stratum это уровень точности времени, чем больше цифра, тем меньше точность (условно). Серверы S1 получают данные о времени напрямую от источников точного времени (атомные часы, GPS, что-нибудь подобное). S2 запрашивает время у S1 и отдаёт его клиентам (серверов S1 на всех не хватает). S3 запрашивает время у S2 и отдаёт своим клиентам, и так далее. По факту для обычной жизни вполне достаточно S3.
На роутере годами висела поднятая служба NTP, которая приносила пользу миру и не мешала жить. Всё изменилось в середине октября, когда в домовой чат стали писать соседи, что шлагбаум, завязанный на мой интернет, стоит открытый (это его стандартное поведение при пропадании связи со шлюзом). Проверив всё у себя и не найдя проблем, я списал на случайность, пока не залез на роутер и не обнаружил 500 Мбит/с и около 500 000 pps входящего трафика, который словно растворялся в роутере (на WAN-интерфейсе дикий IN, но нет никаких сопутствующих OUT). Попинал лобовое стекло, протёр колесо, вышел и вошёл Обновив на роутере прошивку, перезагрузив его и увидев, что проблема не ушла, я полез искать причину и обнаружил, что проблема в службе NTP. Это именно она жрёт на 100% все 4 ядра CPU и всю полосу на приём. Заблокировал фаерволом запросы — и всё сразу же отвисло и заработало. Вскоре мне пришло сообщение от мониторинга NTPPool, что сервер пропал из доступа и исключён из пула (пул непрерывно мониторит серверы на предмет корректности отдаваемого времени и доступности вообще, и присваивает ему рейтинг — от -100 до 20. В пул добавляются серверы с рейтингом больше 10).
В личном кабинете участника проекта есть настроечка Netspeed, она показывает условное количество трафика по отношению к общему объёму твоей зоны, который ты готов принять на себя. У меня Netspeed стоял фактические 500 Mbps, но когда серверов осталось 5 — даже настройка 512 kbps кладёт полностью канал толщиной 500 Mbps.
Я несколько раз пытался открывать краник, втом числе на 512 kbit — мониторинг признавал сервер, добавлял его в пул и домашняя сеть ложилась под нагрузкой. NTP с точки зрения нагрузки мерзкий протокол — много‑много маленьких‑маленьких UDP‑шных пакетиков, попытка шейпить которые фаерволом ни к чему хорошему не приводит и нагрузку не снижает. Единственное, что можно сделать — откинуть.
В процессе изучения проблемы я обнаружил, что что-то случилось в начале-середине октября и из зоны RU за 2 недели вылетело 120 серверов из 140 имеющихся.
Остальные под непропорционально высокой нагрузкой стали вылетать — кто-то, как я, заметил и временно потушил сам, поскольку это сказалось на качестве остальных сервисов, кого-то убил мониторинг за потерю пакетов. Данная ситуация развивается как снежный ком, вылетевшие 10 серверов поднимают нагрузку на оставшиеся, которые тоже начинают вылетать. На данный момент ситуация катастрофическая, поскольку в зоне RU осталось 4 (четыре) сервера, один из которых мой.
Данным постом я хочу привлечь внимание к проблеме и обратиться к сообществу с призывом арендовать по цене двух чашек кофе в месяц VPS на каком-нибудь хостинге и добавить его в пул до стабилизации ситуации.
Решение, которое выбрал я:
— аренда VPS на одном из хостингов за 60 р/мес с Debian 12.
— sudo apt install chrony
и создать в /etc/chrony/conf.d/ файл
root@ntp2:~# cat /etc/chrony/conf.d/settings.conf
pool ntp.msk-ix.ru iburst
pool ntp4.vniiftri.ru iburst
pool ntp5.vniiftri.ru iburst
allow all
ratelimit interval 3 burst 8 leak 4
— перезапустить Chrony: systemctl restart chrony
— добавить сервер в свой кабинет и пройти валидацию (чтобы Unverified превратилось в галочку).
— выбрать скорость соединения (начать с 512kbps и потихоньку поднимать, если нет проблем) и подождать, пока скоринг поднимется до 10.
Если у вас многоядерная виртуалка, то можно собрать NTP-прокси https://github.com/mlichvar/rsntp, (доставив пакеты make и cargo), т.к. chrony однопоточен и в один поток не успевает отвечать. Конфиг для chrony будет немного иным:
root@cv4281075:~# cat /etc/chrony/conf.d/settings.conf
pool ntp.msk-ix.ru iburst
pool ntp4.vniiftri.ru iburst
pool ntp5.vniiftri.ru iburst
cmdport 0
allow
port 11123
bindaddress 127.0.0.1
rsntp (после установки в /usr/bin) запускается командой /usr/bin/rsntp -4 N
, где N — число ядер процессора.
А можно просто запустить несколько процессов chrony с первым конфигом, но разными pid-файлами (так тоже можно, и, кажется, этот способ лучше, чем rsntp)
# chronyd -d -x pidfile /var/run/chrony/server1.pid
# chronyd -d -x pidfile /var/run/chrony/server2.pid
# chronyd -d -x pidfile /var/run/chrony/server3.pid
# chronyd -d -x pidfile /var/run/chrony/server4.pid
До стабилизации ситуации с количеством серверов я настоятельно не рекомендую добавлять в пул ответственные серверы (работа, дом, етц) и предлагаю использовать именно выделенные VPS. Когда ситуация стабилизируется, можно будет поднять службу на роутере, как это было сделано у меня ранее.
Помогите сохранить точное время в Рунете. Если не мы, то кот?