Ubuntu 18.04 重启后不加载 iptables 规则

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
    

答案2

我在 if-up 位置触发 iptables 时遇到了各种问题。随着我的 iptables 脚本变得越来越复杂,它可能针对每个接口运行(取决于脚本的确切位置)这一事实成为了一个问题,如果要使主机名解析等功能正常工作,则需要启动正确的网络接口。这些因素导致启动缓慢和失败。您可以考虑另一种方法,即将 iptables 脚本作为 systemd 服务运行。

这可以通过在 /etc/systemd/system/ 中创建一个名为 real_iptables.service 的文件来完成,其内容如下:

[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 来阻止所有网络通信。这意味着在服务启动之前什么都不会发生。

相关内容