habrahabr

Катастрофа в российской зоне проекта NTPPool.org

  • понедельник, 25 ноября 2024 г. в 00:00:07
https://habr.com/ru/articles/860828/

Привет, Хабр!

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

Помогите сохранить точное время в Рунете. Если не мы, то кот?