Ubuntu 18.04 не загружает правила iptables после перезагрузки
Мы поставляем серверы с помощью chef, поэтому у нас одинаковая конфигурация для версий Ubuntu 16.04 и 18.04. И есть такое же правило для восстановления правил iptables
cat /etc/network/if-pre-up.d/iptables_load
/sbin/iptables-restore < /etc/iptables/general
но это не работает для Ubuntu 18.04.
Если я запускаю его вручную, это работает. Означает ли это, что этот скрипт не запускается при запуске?
ОБНОВИТЬ
Я создал службу systemd, как описано здесь, и она отлично работает.
[Unit]
Description = Apply iptables rules
[Service]
Type=oneshot
ExecStart=/etc/network/if-pre-up.d/iptables_load
[Install]
WantedBy=network-pre.target
1 ответ
Вот что я сделал:
- Перетащите свои iptables.rules в /etc/iptables.rules
Создайте шаблон сервиса примерно так:
sudo nano /etc/systemd/system/restore-iptables-rules.service
Скопируйте и вставьте это:
[Unit] Description = Apply iptables rules [Service] Type=oneshot ExecStart=/bin/sh -c 'iptables-restore < /etc/iptables.rules' [Install] WantedBy=network-pre.target
Включить сервис так:
sudo systemctl enable restore-iptables-rules.service
Перезагрузитесь и убедитесь, что правила были применены:
sudo iptables -L
Я столкнулся с множеством проблем, связанных с iptables, запускаемым в местах, где они есть. Поскольку мой сценарий iptables становился все более сложным, тот факт, что он может выполняться (в зависимости от точного местоположения сценария) для каждого интерфейса, стал проблемой, равно как и необходимость правильного сетевого интерфейса, чтобы работали такие вещи, как разрешение имени хоста. Эти факторы вызывали медленную загрузку и сбои. Вы можете рассмотреть альтернативу, которая заключается в запуске сценария iptables в качестве службы systemd.
Это можно сделать, создав файл, называемый, например, real_iptables.service в / etc / systemd / system / с таким содержимым, как:
[Unit]
Description=Set up the firewall
After=network.target
[Service]
Type=oneshot
ExecStart=/root/iptables
[Install]
WantedBy=multi-user.target
Как вы видите, настоящий скрипт iptables находится в / root / iptables. Установите сервис с помощью:
systemctl enable real_iptables
systemctl start real_iptables
Если служба включена, она будет запущена во время загрузки, но будет запущена только один раз. Если вы хотите быть полностью безопасным, вы можете поместить скрипт в /etc/network/if-up.d/, который использует iptables для блокировки всех сетевых соединений. Это означает, что ничего не может произойти, пока сервис не запустится.