Автозагрузка правил iptables на Ubuntu Server 20.04
Ubuntu 20.04
iptables-persistent 1.0.14
После перехода системы настройки интерфейсов с ifupdown на netplan, перестали работать прежние способы загрузки правил iptables.
Скрипты в /etc/network/if-pre-up.d/ больше не выполняются, как и в других if-up.d, if-down.d директориях.
Пока ещё остается возможность вернуть систему ifupdown, но этого делать не будем.
Рассмотрим несколько вариантов - это написание простого systemd сервиса и использование готового netfilter-persistent
Установка iptables-persistent
Тут стоит пояснить, что netfilter-persistent это базовый пакет.
This package provides a loader for netfilter configuration using a plugin-based architecture.
По сути это скрипт который вызывается через systemd сервис и запускает уже другие скрипты названные plugin'ами.
А уже пакет iptables-persistent содержит plugin'ы (скрипты) для работы с iptables
/usr/share/netfilter-persistent/plugins.d/15-ip4tables /usr/share/netfilter-persistent/plugins.d/25-ip6tables
Установка
sudo apt-get install iptables-persistent
На предложение сохранить текущие правила для IPv4, а затем IPv6 - выбираем No
┌───────────────────────────────────────────────────────────────┤ Configuring iptables-persistent ├───────────────────────────────────────────────────────────────┐ │ │ │ Current iptables rules can be saved to the configuration file /etc/iptables/rules.v4. These rules will then be loaded automatically during system startup. │ │ │ │ Rules are only saved automatically during package installation. See the manual page of iptables-save(8) for instructions on keeping the rules file up-to-date. │ │ │ │ Save current IPv4 rules? │ │ │ │ <Yes> <No> │ │ │ └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
Производим настройку iptables, например добавим правило
iptables -A INPUT -s 2.2.2.2 -j DROP
после этого сохраним текущие правила
netfilter-persistent save
Проверяем сохраненные правила
cat /etc/iptables/rules.v4
Для сохранения скрипт выполняет команду
iptables-save > /etc/iptables/rules.v4
Обзор настроек
/etc/default/netfilter-persistent
# Очищает правила iptables в случает остановки сервиса. # т.е. выполнение команды netfilter-persistent stop (хотя это alias к команде flush) # netfilter-persistent flush по-прежнему будет работать FLUSH_ON_STOP=0 # Не сохранять правила iptables. # Т.е. netfilter-persistent save просто перестает сохранять правила. # Но в чем смысл такой опции, я не понял. #IPTABLES_SKIP_SAVE=yes #IP6TABLES_SKIP_SAVE=yes # Не сохранять ipset'ы # Актуально с пакетом ipset-persistent #IPSET_SKIP_SAVE=yes # По умолчанию перед загрузкой существующие правила iptables очищаются. # Можно отключить очищение, будет выполняться iptables-restore --noflush #IPTABLES_RESTORE_NOFLUSH=yes #IP6TABLES_RESTORE_NOFLUSH=yes
Теперь можно перезагрузиться и проверить.
Создаем свой systemd сервис
Это простой и рабочий способ запустить скрипт для настройки iptables при старте операционной системы.
Для себя вижу плюсом данного способа то, что установка правил происходит bash скриптом, что дает больше возможностей.
Создаем скрипт для настройки, содержимое исключительно для примера:
/root/bin/iptables-set.sh
#!/bin/bash set -eu ############################################################## # ACL ############################################################## BLACK_LIST=" 62.210.202.0/24 195.154.170.0/24 " ############################################################## # INPUT ############################################################## # Бан по IP for IP in ${BLACK_LIST}; do iptables -A INPUT -i enp5s0 -s ${IP} -j DROP done
chmod +x /root/bin/iptables-set.sh
Создаем файл сервиса
/etc/systemd/system/iptables-set.service
[Unit] Description=setup iptables configuration DefaultDependencies=no Wants=network-pre.target systemd-modules-load.service local-fs.target Before=network-pre.target After=systemd-modules-load.service local-fs.target [Service] Type=oneshot ExecStart=/root/bin/iptables-set.sh [Install] WantedBy=multi-user.target
Активируем сервис
systemctl daemon-reload
systemctl enable iptables-set
Применим конфигурацию
systemctl restart iptables-set
Так же можно перезагрузиться и проверить.
Обсуждение