Брандмауэр не загрузился при старте: ошибка в наборе правил
Отказ загрузки правил опаснее отказа любой другой службы: машина остаётся доступной без фильтрации, и заметить это можно только проверкой. Служба при этом честно сообщает об ошибке в журнал — вопрос лишь в том, читает ли его кто-нибудь.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Ошибка в наборе правил
Набор применяется целиком. Ошибка в одной строке означает, что не применится ничего.
-
Правило ссылается на интерфейс или объект, которого нет
Правило с именем несуществующего интерфейса отвергается при загрузке. При загрузке системы интерфейс может ещё не появиться.
-
Правила загружаются раньше другой службы, которая их перезаписывает
Средства контейнеров и балансировки создают свои цепочки. Порядок загрузки определяет итоговый набор.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Проверка набора правил без применения.
sudo nft -c -f /etc/nftables.confЧто загружено прямо сейчас.
sudo nft list ruleset | head -30Состояние службы загрузки правил.
systemctl status nftables --no-pager | head -8Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Набор применяется целиком. Ошибка в одной строке означает, что не применится ничего.
- Как проверить
-
Проверьте набор без применения и посмотрите сообщение.
sudo nft -c -f /etc/nftables.conf 2>&1 | head journalctl -u nftables -n 20 --no-pager
- Как исправить
- Исправьте ошибку по сообщению и проверяйте набор до применения. Проверка без применения — обязательный шаг при правке правил на удалённой машине.
- Почему происходит
- Правило с именем несуществующего интерфейса отвергается при загрузке. При загрузке системы интерфейс может ещё не появиться.
- Как проверить
-
Посмотрите правила с именами интерфейсов и фактические имена.
grep -nE "iif|oif" /etc/nftables.conf 2>/dev/null | head ip -brief link
- Как исправить
- Используйте группы интерфейсов вместо жёстких имён или добавьте зависимость от готовности сети. Имена интерфейсов меняются при замене оборудования.
- Почему происходит
- Средства контейнеров и балансировки создают свои цепочки. Порядок загрузки определяет итоговый набор.
- Как проверить
-
Посмотрите итоговый набор и порядок запуска.
sudo nft list ruleset 2>/dev/null | head -20 systemctl show nftables -p After -p Before
- Как исправить
- Разведите наборы по отдельным таблицам и задайте порядок загрузки. Один общий набор, который переписывают несколько служб, всегда приводит к неожиданностям.
Пример вывода
Правило ссылается на интерфейс, которого нет. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
nft[630]: /etc/nftables.conf:14:18-24: Error: Interface does not exist
nft[630]: iifname "eth1" accept
nft[630]: ^^^^^^
systemd[1]: nftables.service: Main process exited, code=exited, status=1/FAILURE
systemd[1]: Failed to start nftables.service - nftables.
Связанные ошибки
- UFW BLOCK в журнале: брандмауэр режет нужный трафик Соединения не устанавливаются, в журнале ядра записи о блокировке. Как найти нужное правило.
- Интерфейс не настроен: systemd-networkd не применил описание Сеть не поднимается: файл описания не подхвачен, интерфейс под управлением другой службы, неверное совпадение по имени.
- Docker: правила брандмауэра конфликтуют с вашими После перезапуска брандмауэра контейнеры теряют сеть: Docker управляет своими правилами сам.
- Обновление микрокода процессора не загружено В журнале ядра нет записи о загрузке микрокода: пакет не установлен или образ начальной загрузки не обновлён.
- Служба блокировки не применяет правила: ключ доступа не принят Заблокированные адреса не блокируются: исполнитель не проходит проверку ключа или смотрит не туда.
- A start job is running: загрузка висит на одной службе Загрузка останавливается с обратным отсчётом: служба не укладывается в таймаут. Как найти виновника и не ждать.
- Cannot assign requested address при привязке Ошибка 99 при привязке: адрес не принадлежит машине или ещё не поднят. Разбор с network-online.target и ip_nonlocal_bind.
- Connection closed by authenticating user: вход обрывается Клиент отключается на этапе проверки подлинности: не тот ключ, перебор или ограничение по адресу.
Где встречается чаще всего
Источники
-
nft(8)
Проверка и загрузка наборов правил. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено правилом с именем несуществующего интерфейса.