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 ответ

Вот что я сделал:

  1. Перетащите свои iptables.rules в /etc/iptables.rules
  2. Создайте шаблон сервиса примерно так:

    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
    
  3. Включить сервис так:

    sudo systemctl enable restore-iptables-rules.service
    
  4. Перезагрузитесь и убедитесь, что правила были применены:

    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 для блокировки всех сетевых соединений. Это означает, что ничего не может произойти, пока сервис не запустится.

Другие вопросы по тегам