Обновяване на root hints файла в bind
Файлът с корените на DNS (root hints) казва на рекурсивния сървър откъде да започне, когато не знае нищо за търсената зона. Съдържа имената и адресите на тринайсетте коренни сървъра. Информацията се променя рядко — веднъж на няколко години — но когато някой корен смени адреса си, остарелият файл започва да струва по едно излишно запитване на всяка студена заявка.
Моят файл беше остарял, защото един сървър наскоро промени своя IP адрес. Ето как го обнових.
Обновяване
Първо запазвам стария файл настрани:
sudo mv /etc/bind/db.root /etc/bind/db.root.back
После тегля актуалния. По времето на оригиналната бележка това ставаше по FTP:
sudo wget --user=ftp --password=ftp ftp://ftp.rs.internic.net/domain/db.cache -O /etc/bind/db.root
Днес по-надеждният път е HTTPS — FTP достъпът на InterNIC отдавна не е сигурен вариант:
sudo wget https://www.internic.net/domain/named.root -O /etc/bind/db.root
Другият източник е самият корен, извлечен с dig — полезно на машина без изход към HTTPS:
dig . NS @a.root-servers.net > /etc/bind/db.root
Проверка преди рестарт
Това е стъпката, която спестява неприятности. Ако файлът е свален наполовина или е HTML страница с грешка, bind няма да тръгне:
sudo named-checkconf
grep -c 'NS' /etc/bind/db.root
head -20 /etc/bind/db.root
Трябва да видите коментари, започващи с ;, и записи за a.root-servers.net до m.root-servers.net.
Рестарт
sudo systemctl restart bind9.service
sudo systemctl status bind9.service
Проверка, че работи
dig . NS @localhost +short
dig google.com @localhost
Първата команда трябва да върне тринайсетте коренни сървъра, втората — нормален отговор със status: NOERROR.
Колко често и трябва ли изобщо
Едно уточнение, което си струва: bind носи вградени root hints в самия двоичен файл. Ако външният файл липсва или е остарял, сървърът пак ще работи — ще плати само по едно излишно запитване, докато научи верните адреси. Тоест това не е спешна поддръжка, а хигиена.
Проверката дали файлът е остарял е бърза — сравнява се с това, което корените отговарят в момента:
diff <(grep -oP '^\S+\s+\d+\s+IN\s+A\s+\K\S+' /etc/bind/db.root | sort) \
<(dig . NS +short | while read n; do dig +short "$n" A; done | sort)
Ако решите да го автоматизирате, месечен cron е предостатъчен — но задължително със стъпката за проверка преди рестарта, иначе един провален download оставя DNS сървъра долу до следващата сутрин.