在一台机器上,我准备了一个firewall.service
systemd 服务,该服务在运行 Debian 9.5 的机器上运行良好。
现在我正在设置另一台机器,也运行 Debian 9.5,使用完全相同的脚本,但拒绝在启动时运行,我似乎找不到任何关于原因的指示。
启动后,下面是一些输出,仅向我表明 systemd 从未尝试首先启动该服务:
[root@bigbrother ~]# journalctl -u firewall
-- No entries --
[root@bigbrother ~]# systemctl status firewall
● firewall.service - Firewall setup via /etc/iptables.rules
Loaded: loaded (/etc/systemd/system/firewall.service; enabled; vendor preset: enabled)
Active: inactive (dead)
防火墙服务位于/etc/systemd/system/firewall.service
两台计算机上,如下所示:
[Unit]
Description=Firewall setup via /etc/iptables.rules
After=network.target
[Service]
Type=oneshot
ExecStart=/sbin/iptables-restore /etc/iptables.rules
[Install]
WantedBy=network-online.target
正如您所看到的,它只是运行一个iptables-restore command
,仅此而已。我以前曾用过这个/etc/rc.local
,但我想人们必须跟上时尚并用于systemd
此类事情(这很好,当它起作用时)。
该服务确实已启用:
[root@bigbrother ~]# systemctl disable firewall
Removed /etc/systemd/system/network-online.target.wants/firewall.service.
[root@bigbrother ~]# systemctl enable firewall
Created symlink /etc/systemd/system/network-online.target.wants/firewall.service → /etc/systemd/system/firewall.service.
手动运行时效果很好:
[root@bigbrother ~]# systemctl start firewall
[root@bigbrother ~]# systemctl status firewall
● firewall.service - Firewall setup via /etc/iptables.rules
Loaded: loaded (/etc/systemd/system/firewall.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Sep 09 17:10:52 bigbrother systemd[1]: Starting Firewall setup via /etc/iptables.rules...
Sep 09 17:10:53 bigbrother systemd[1]: Started Firewall setup via /etc/iptables.rules.
我缺少什么?
我在这里查看了一些类似的问题,但给我最大希望的问题实际上是一个拼写错误,所以我现在完全迷失了。我在不同的服务器上运行的是相同版本的 Debian,所以我很难相信这与服务的顺序有关。即便如此,我还是很乐意接受建议。
答案1
WantedBy=network-online.target
默认情况下不是依赖链的一部分,您不应该这样使用它。
如果您确实需要在网络启动后启动该脚本,我建议您这样做:
[Unit]
Description=Firewall setup via /etc/iptables.rules
After=network.target
Before=network-online.target
Wants=network-online.target
[Service]
Type=oneshot
ExecStart=/sbin/iptables-restore /etc/iptables.rules
[Install]
WantedBy=multi-user.target
https://www.freedesktop.org/software/systemd/man/systemd.special.html#network.target https://www.freedesktop.org/software/systemd/man/systemd.special.html#network-online.target
答案2
也许运行得太早了。这文档解释network.target
如何主要目的是在关闭时正确订购物品。
相反network-pre.target
的主要目的是与防火墙服务一起使用。想要在网络配置之前运行的服务应该使用
Before=network-pre.target
Wants=network-pre.target
firewalld.service
例如,这就是我在 Fedora 24 的 Unit 中看到的,我认为它是iptables
.