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