Расскажу об одной, на первый взгляд, странной проблеме. Основная проблема: после обновления с 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 для использования в скриптах