Вопрос или проблема
При запуске “netfilter-persistent” он завершает работу с ошибкой:
10 мая 19:41:53 debian systemd[1]: Запуск постоянной конфигурации netfilter...
-- Тема: Юнит netfilter-persistent.service начал запуск
-- Определено: systemd
-- Поддержка: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Юнит netfilter-persistent.service начал запуск.
10 мая 19:41:53 debian netfilter-persistent[3099]: run-parts: выполняется /usr/share/netfilter-persistent/plugins.d/15-ip4tables start
10 мая 19:41:53 debian netfilter-persistent[3099]: run-parts: /usr/share/netfilter-persistent/plugins.d/15-ip4tables завершился с кодом 2
10 мая 19:41:53 debian netfilter-persistent[3099]: run-parts: выполняется /usr/share/netfilter-persistent/plugins.d/25-ip6tables start
10 мая 19:41:53 debian systemd[1]: netfilter-persistent.service: основной процесс завершился, код=завершился, статус=1/ОШИБКА
10 мая 19:41:53 debian systemd[1]: Не удалось запустить постоянную конфигурацию netfilter.
-- Тема: Юнит netfilter-persistent.service завершился с ошибкой
Это следующий скрипт, упомянутый в выводе ошибки:
#!/bin/sh
# Этот файл является частью netfilter-persistent
# (был iptables-persistent)
# Авторское право (C) 2009, Симон Рихтер <[email protected]>
# Авторское право (C) 2010, 2014 Джонатан Уилтшир <[email protected]>
#
# Эта программа является свободным программным обеспечением; вы можете распространять ее и/или
# изменять на условиях GNU General Public License,
# как это опубликовано Фондом свободного программного обеспечения, либо версии 3
# Лицензии, либо (по вашему выбору) любой более поздней версии.
exit 0
set -e
rc=0
load_rules()
{
# загрузка правил IPv6
if [ ! -f /etc/iptables/rules.v6 ]; then
echo "Предупреждение: пропуск IPv6 (нет правил для загрузки)"
exit 0
else
ip6tables-restore < /etc/iptables/rules.v6 2> /dev/null
if [ $? -ne 0 ]; then
rc=1
fi
fi
}
save_rules()
{
# сохранение правил IPv6
# нужно как минимум загрузить ip6table_filter:
/sbin/modprobe -q ip6table_filter
if [ ! -f /proc/net/ip6_tables_names ]; then
log_action_cont_msg "Предупреждение: пропуск IPv6 (модули не загружены)"
elif [ -x /sbin/ip6tables-save ]; then
touch /etc/iptables/rules.v6
chmod 0640 /etc/iptables/rules.v6
ip6tables-save > /etc/iptables/rules.v6
if [ $? -ne 0 ]; then
rc=1
fi
fi
}
flush_rules()
{
if [ ! -f /proc/net/ip6_tables_names ]; then
echo "Предупреждение: пропуск IPv6 (модуль не загружен)"
elif [ -x /sbin/ip6tables ]; then
for param in F Z X; do /sbin/ip6tables -$param; done
for table in $(cat /proc/net/ip6_tables_names)
do
/sbin/ip6tables -t $table -F
/sbin/ip6tables -t $table -Z
/sbin/ip6tables -t $table -X
done
for chain in INPUT FORWARD OUTPUT
do
/sbin/ip6tables -P $chain ACCEPT
done
fi
}
case "$1" in
start|restart|reload|force-reload)
load_rules
;;
save)
save_rules
;;
stop)
# Почему? потому что если используется stop, фаервол сбрасывается на переменное
# количество времени во время обновлений пакетов, оставляя машину уязвимой
# Также не всегда желательно сбрасывать во время очистки
echo "Автоматический сброс отключен, используйте \"flush\" вместо \"stop\""
;;
flush)
flush_rules
;;
*)
echo "Использование: $0 {start|restart|reload|force-reload|save|flush}" >&2
exit 1
;;
esac
exit $rc
Быстрое исправление
В моем случае была испорченная строка с -j ULOG
в файле /etc/iptables/rules.v4
. Удаление этой строки и повторный запуск apt-get upgrade
исправили проблему для меня.
Как отлаживать
Ошибка здесь:
10 мая 19:41:53 debian netfilter-persistent[3099]: run-parts: /usr/share/netfilter-persistent/plugins.d/15-ip4tables завершился с кодом 2
Вы можете запустить это от имени root для отладки:
/usr/share/netfilter-persistent/plugins.d/15-ip4tables start
После проверки исходного кода /usr/share/netfilter-persistent/plugins.d/15-ip4tables
это была подозрительная ошибочная команда:
/sbin/iptables-restore < /etc/iptables/rules.v4 2> /dev/null
Вы можете запустить это отдельно:
/sbin/iptables-restore -v < /etc/iptables/rules.v4
Сообщенная испорченная строка была бесполезной, поэтому я просто запустил строки в оболочке с префиксом iptables
, чтобы получить что-то полезное. Например, для строки
-A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 22 -j ACCEPT
вы можете запустить
iptables -A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 22 -j ACCEPT
В моем случае проблема проявлялась только при загрузке, когда я вручную выполнял iptables-restore < /etc/iptables/rules.v4
, все работало.
Так что я сделал, чтобы выяснить, что не так, я изменил метод load_rules в /usr/share/netfilter-persistent/plugins.d/15-ip4tables
, чтобы записывать в журнал.
код до:
load_rules()
{
# загрузка правил IPv4
if [ ! -f /etc/iptables/rules.v4 ]; then
echo "Предупреждение: пропуск IPv4 (нет правил для загрузки)"
else
/sbin/iptables-restore < /etc/iptables/rules.v4 2> /dev/null
if [ $? -ne 0 ]; then
rc=1
fi
fi
}
после:
load_rules()
{
# загрузка правил IPv4
if [ ! -f /etc/iptables/rules.v4 ]; then
echo "Предупреждение: пропуск IPv4 (нет правил для загрузки)"
else
/sbin/iptables-restore -v < /etc/iptables/rules.v4 2>> /var/log/netfilter-debug
if [ $? -ne 0 ]; then
rc=1
fi
fi
}
вывод, который я получил в /var/log/netfilter-debug
:
iptables-restore: строка 48 не удалась
так я знал, где искать. Интересно, что проблемная строка была COMMIT… все еще исследую, почему это так.
На нашей установке Debian 12 ни одно из предложенных решений не сработало, и после некоторых изменений мы выяснили, что firewalld загружен, но неактивен.
Тем не менее, firewalld импортировал правила из своего набора правил по умолчанию (только 3 правила P Accept), что означало, что netfilter-persistent не работает (что было правдой, потому что NFP был неактивен).
Поэтому мы удалили и очистили Firewalld, перезагрузили, и все заработало нормально без каких-либо изменений конфигурации.
apt remove –auto-remove firewalld && apt purge firewalld && rm -rf /etc/firewalld
Пожалуйста, любой, кто сталкивался с аналогичным случаем или решением, прокомментируйте.
С уважением,
Джордж
Ответ или решение
Ошибка запуска службы "netfilter-persistent"
Введение
Служба netfilter-persistent
предназначена для сохранения и восстановления правил фильтрации пакетов для iptables
и ip6tables
в системах Linux. При запуске этой службы могут возникать различные ошибки, и одна из наиболее распространенных заключается в том, что она не запускается из-за проблем с конфигурационными правилами. В данном статье мы рассмотрим причины, по которым служба может не запускаться, пути диагностики проблемы, а также возможные решения.
Описание проблемы
При попытке запустить службу netfilter-persistent
, вы можете столкнуться с сообщением об ошибке, подобным следующему:
May 10 19:41:53 debian netfilter-persistent[3099]: run-parts: executing /usr/share/netfilter-persistent/plugins.d/15-ip4tables start
May 10 19:41:53 debian netfilter-persistent[3099]: run-parts: /usr/share/netfilter-persistent/plugins.d/15-ip4tables exited with return code 2
May 10 19:41:53 debian netfilter-persistent[3099]: systemd[1]: netfilter-persistent.service: main process exited, code=exited, status=1/FAILURE
Это означает, что скрипт, который отвечает за загрузку правил из файла /etc/iptables/rules.v4
, завершился с ошибкой.
Поиск причин
Ваша проблема может быть вызвана следующими факторами:
- Неисправные правила в файлах конфигурации: Например, правила, содержащие
-j ULOG
, могут вызвать сбои. - Проблемы с модулями ядра: Убедитесь, что необходимые модули, такие как
ip_tables
иip6_tables
, загружены. - Конфликт с другими системами управления сетевым трафиком: Наличие
firewalld
на вашей системе может препятствовать правильной работеnetfilter-persistent
.
Диагностика проблемы
Чтобы выявить источник проблемы, выполните следующие шаги:
-
Запустите скрипт для отладки вручную:
/usr/share/netfilter-persistent/plugins.d/15-ip4tables start
Это отображает более точные сообщения об ошибках.
-
Проверьте файл правил
iptables
на наличие ошибок:/sbin/iptables-restore -v < /etc/iptables/rules.v4
Обратите внимание на выданные ошибки и неверные строки.
-
Если при загрузке службы нет сообщений об ошибках, попробуйте временно изменить функцию
load_rules
в15-ip4tables
, чтобы записывать вывод в лог:/sbin/iptables-restore -v < /etc/iptables/rules.v4 >> /var/log/netfilter-debug
Решение проблемы
Вот несколько шагов для устранения неполадок:
-
Исправьте некорректные правила: Проверьте строки в файле
/etc/iptables/rules.v4
и уберите или исправьте неправильные команды. -
Удаление конфликта с firewalld: Если
firewalld
установлен, он может конфликтовать сnetfilter-persistent
. Вы можете удалить его с помощью следующих команд:apt remove --auto-remove firewalld apt purge firewalld rm -rf /etc/firewalld
-
Перезагрузите службу:
systemctl restart netfilter-persistent
-
Проверка статуса службы:
systemctl status netfilter-persistent
Заключение
Ошибка запуска службы netfilter-persistent
может быть вызвана различными проблемами, начиная от неправильных правил в конфигурационных файлах и заканчивая конфликтами с другими установленными пакетами. Проведение диагностики, исправление ошибок и возможная деинсталляция конфликтующих программ помогут решить возникшую проблему. Убедитесь, что ваша система защищена, и сетевые правила правильно загружаются при каждой перезагрузке.