Мы предоставляем серверы с помощью 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.
Если я запускаю его вручную, он работает. Значит ли это, что этот скрипт не выполняется при запуске?
UPDATE
Я создал службу systemd, как описано здесь, и она работает нормально.
[Unit]
Description = Apply iptables rules
[Service]
Type=oneshot
ExecStart=/etc/network/if-pre-up.d/iptables_load
[Install]
WantedBy=network-pre.target
Я столкнулся с множеством проблем с iptables, запускаемым в местоположениях if-up. По мере того, как мой сценарий 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 для блокировки всех сетевых соединений. Это означает, что ничего не может произойти, пока служба не запустится.
Вот что я сделал:
Создайте шаблон службы следующим образом:
sudo nano / etc / systemd / system /restore-iptables-rules.service
Скопируйте и вставьте это:
[Единица]
Описание = Применить правила iptables
[Обслуживание]
Тип = oneshot
ExecStart = / bin / sh -c 'iptables-restore
Включите службу следующим образом:
sudo systemctl enable restore-iptables-rules.service
Перезагрузитесь и убедитесь, что правила были применены:
sudo iptables -L