Debian: история одного обновления

Расскажу об одной, на первый взгляд, странной проблеме. Основная проблема: после обновления с 10 на 11 через некоторое время интерфейс теряет адрес, полученный через DHCP. Откатываешься (это виртуальная машина, поэтому через snapshot’ы такое легко провернуть) обратно на 10-ку – всё работает. Важный момент: такое наблюдается только с серверами у которых DHCP. Так же, на всех серверах (как статических, так и с DHCP) присутствует и другая проблема: после перезагрузки, сервер отвечает на icmp, но ровно 5 минут недоступны вообще никакие сервисы: ssh, http,…

Смотрим первым делом в логи и видим такое:


Mar 31 20:17:42 gw systemd[1]: networking.service: start operation timed out. Terminating.
Mar 31 20:17:42 gw systemd[1]: networking.service: Main process exited, code=exited, status=1/FAILURE
Mar 31 20:17:42 gw systemd[1]: networking.service: Failed with result 'timeout'.

Что-то не так с сервисом, который отвечает за сеть. Лезем смотреть в /etc/network/interfaces:

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto ens32
iface ens32 inet dhcp

auto vlan89
iface vlan89 inet static
        address 10.89.0.1
        netmask 255.255.255.0
        vlan-raw-device ens33

post-up /opt/scripts/boot.sh

Лезем ещё в логи, теперь уже целенаправленно в логи сервиса networking.service:

journalctl -u networking.service
...
-- Boot 8355aa8f03964ae0a965bc009282e597 --
Mar 31 20:17:42 gw systemd[1]: Starting Raise network interfaces...
Mar 31 20:17:42 gw systemd[1]: networking.service: start operation timed out. Terminating.
Mar 31 20:17:42 gw systemd[1]: networking.service: Main process exited, code=exited, status=1/FAILURE
Mar 31 20:17:42 gw ifup[587]: Restarting fail2ban (via systemctl): fail2ban.service
Mar 31 20:17:42 gw ifup[435]: Got signal Terminated, terminating...
Mar 31 20:17:42 gw ifup[435]: ifup: failed to bring up vlan89
Mar 31 20:17:42 gw systemd[1]: networking.service: Failed with result 'timeout'.
Mar 31 20:17:42 gw systemd[1]: Failed to start Raise network interfaces.
...

Видим странное сообщение про Restarting fail2ban и failed to bring up vlan89. Пробуем комментировать описание про vlan, post-up и выясняем, что виноват именно post-up. В нём ничего необычного, кроме запуска правил файервола и перезапуск fail2ban. В справке по post-up сказано, что если скрипт возвращает ненулевой код возврата, то вся служба networking будет сфейлина! Вот это поворот! Запускаем вручную скрипт и проверяем код возврата – 0. Странно. Учитывая, что правил файервола было много, решил начать с простого – посмотреть, что твориться в логах fail2ban. И тут на тебе:

fail2ban.database [612]: ERROR Failed to upgrade database '/var/lib/fail2ban/fail2ban.sqlite3': database disk image is malformed

Вот оно! После обновления с 10 на 11 в fail2ban изменилась структура базы и оно не может автоматически обновиться. Решение простое: выключить fail2ban, удалить все fail2ban.sqlite3* файлы и перезапустить fail2ban.

Теперь возвращаем обратно post-up скрипт в /etc/network/intefaces, перегружаем и всё работает как надо: нету задержки в 5 минут, и, спустя время сервер переполучает адрес по DHCP. Задержка в 5 минут была вызвана таймаутом сервиса networking.services.

Какой вывод можно сделать? Скрипт post-up желательно не использовать (вместо него можно задание в cron или rc.local или ещё что-то). А если и использовать, то убрать оттуда потенциально опасные вещи, которые могут сломаться.

Есть пару моментов в /etc/network/interfaces, которые хочется объяснить

auto / allow-hotplug

Основное отличие, это в том, когда происходит инициализация устройств. И так

auto: в момент ранней загрузки. Подойдёт для карточек PCI/SoC, а так же для специальных интерфейсов, вроде bond, vlan, bridge (не используйте для них allow-hotplug!!!)

allow-hotplug: в момент поздней загрузки, после того, как udev (а соответственно и все модули, которые не вкомпилены в ядро) их определит. Подходит для разного рода USB, SDIO карточек.

post-up(up)/post-down(down)/pre-up/pre-down

Очень важным нюансов считается, где указана эта строка. Если между ней нету пропуска, то она применяется сразу же после поднятия этого интерфейса, после которого указана. Если же есть – то уже после поднятия всех интерфейсов.

/etc/network/{if-up.d,if-down,d,if-pre-up.d,if-pre-down.d}

Каждый из этих скриптов запускается при каждой инициализации интерфейса (а так же для каждого из типов IPv4/IPv6). Если у вас 5 интерфейсов, то каждый скрипт запуститься 5 (на самом деле может и больше, ибо почти для каждого интерфейса есть ещё и IPv6) раз. Имейте это ввиду, когда будете ложить в эту папку скрипт. Доступна переменная окружения – IFACE для использования в скриптах

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься.