суббота, 11 июля 2015 г.

systemd и перезапись стандартных конфигов, в частности bind

Пишу чисто для себя, что бы не забыть, но если ещё кому пригодится - буду рад. ;)

У меня стоит ubuntu, а bind9 в качестве кеширующего DNS прокси. Перегружаю я комп очень редко, даже при дальних переездах просто отправляю в сон и всё. Поэтому проблему заметил не сразу: "вдруг" после очередного обновления ядра перестал резолвится habrahabr. :(
Причина выяснилась довольно быстро: bind слушает на ipv6 интерфейсах, а так как ipv6 гуляет только по локалке, он получает отлуп на некоторые сайты. Ну, думаю, делов то на 5 копеек: запретить бинду ipv6 и всё, оно мне вроде пока и не надо. Сказано - сделано:
vim /etc/default/bind9
и меняем OPTIONS="-u bind" на OPTIONS="-4 -u bind", далее systemctl restart bind9 и... ничего не поменялось. :( Копаем и выясняем, что после замены upstart на systemd файл из default просто игнорится!

cat /lib/systemd/system/bind9.service
[Unit]
Description=BIND Domain Name Server
Documentation=man:named(8)
After=network.target

[Service]
ExecStart=/usr/sbin/named -f -u bind
ExecReload=/usr/sbin/rndc reload
ExecStop=/usr/sbin/rndc stop

[Install]
WantedBy=multi-user.target

Как видимо опции прописаны жестко, что ни есть правильно. В багтреккере дебиана действительно обнаруживаем, что такая проблема есть. Там же есть и "воркэраунд": переписать строчки на новые:

[Service]
EnvironmentFile=-/etc/default/bind9
ExecStart=/usr/sbin/named $OPTIONS

Но править стандартные файлы как бы тоже не хорошо. Поэтому используем стандартный механизм перезаписи в systemd, благо он есть. Для чего создаем /etc/systemd/system/bind9.service.d/override.conf с измененными строками. Делаем systemctl daemon-reload и... получаем жопу. :)))) Бинд не стартует, ругаясь на то, что такая конфигурация доступна только для oneshot. Пришлось рыть доки. Оказалось всё не совсем тривиально. При таком подходе, то есть при использовании override нужно ОБЯЗАТЕЛЬНО очистить строку ExecStart перед использованием! Чем это обусловлено - разбираться не стал, как говорится "это не баг, это фича". В результате рабочий конфиг принял вид:

cat /etc/systemd/system/bind9.service.d/override.conf 
[Unit]
Description=BIND Domain Name Server
Documentation=man:named(8)
After=network.target

[Service]
EnvironmentFile=-/etc/default/bind9
ExecStart=
ExecStart=/usr/sbin/named $OPTIONS
ExecReload=/usr/sbin/rndc reload
ExecStop=/usr/sbin/rndc stop

[Install]
WantedBy=multi-user.target

Ну и в /etc/default/bind9 пришлось ещё добавить параметр -f:

cat /etc/default/bind9                                    
# run resolvconf?
RESOLVCONF=yes

# startup options for the server
OPTIONS="-f -4 -u bind"

Почему возникает проблема с ipv6, как его поднять нормально в домашней сети и прочие вопросы буду решать, когда нормально запущу его у себя, сейчас он как бы особо мне и не нужен. ;)