如何让 ufw 在启动时启动?

Mat*_*ell 10 firewall ufw systemd

UFW 不会在启动时为我启动。我的/etc/ufw/ufw.conf文件看起来像这样:

# /etc/ufw/ufw.conf
#

# Set to yes to start on boot. If setting this remotely, be sure to add a rule
# to allow your remote connection before starting ufw. Eg: 'ufw allow 22/tcp'
ENABLED=yes

# Please use the 'ufw' command to set the loglevel. Eg: 'ufw logging medium'.
# See 'man ufw' for details.
LOGLEVEL=low
Run Code Online (Sandbox Code Playgroud)

所以看起来它应该可以正常启动。但是在启动后我总是得到这个:

$ sudo ufw status
Status: inactive
Run Code Online (Sandbox Code Playgroud)

使用“服务”脚本启动它似乎不起作用:

$ sudo service ufw start
$ sudo ufw status
Status: inactive
Run Code Online (Sandbox Code Playgroud)

如果我强制重新加载它会正常工作:

$ sudo ufw reload
Firewall reloaded
$ sudo ufw status
Status: active
Run Code Online (Sandbox Code Playgroud)

之后“服务”脚本工作得很好:

$ sudo ufw status
Status: active
$ sudo service ufw stop
$ sudo ufw status
Status: inactive
$ sudo service ufw start
$ sudo ufw status
Status: active
Run Code Online (Sandbox Code Playgroud)

如何让 ufw 在启动时启动?

编辑:

我使用的是 Ubuntu 18.04,所以正在使用 systemd。systemctl is-enabled报告如下:

$ sudo ufw status verbose
Status: inactive
$ sudo systemctl is-enabled ufw.service
enabled
Run Code Online (Sandbox Code Playgroud)

我也试过这个:

$ sudo systemctl enable ufw
Synchronizing state of ufw.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable ufw
$ sudo ufw status verbose
Status: inactive
Run Code Online (Sandbox Code Playgroud)

重新启动后,它仍然处于非活动状态。journalctl -p err报告没有什么有趣的。journalctl -u ufw报告:

$ journalctl -u ufw
...<snip>...
-- Reboot --
May 26 12:53:36 matt-laptop systemd[1]: Started Uncomplicated firewall.
Run Code Online (Sandbox Code Playgroud)

所以看起来它肯定是在尝试启动 ufw ......似乎它实际上并没有这样做

Mat*_*ell 15

我想出了各种各样的解决方案。我做了这个编辑/lib/systemd/system/ufw.service

$ diff -u ufw.service.orig ufw.service
--- ufw.service.orig    2018-05-26 13:45:48.696356561 +0100
+++ ufw.service 2018-05-26 13:46:04.443673265 +0100
@@ -2,7 +2,7 @@
 Description=Uncomplicated firewall
 Documentation=man:ufw(8)
 DefaultDependencies=no
-Before=network.target
+After=network.target
 
 [Service]
 Type=oneshot
Run Code Online (Sandbox Code Playgroud)

因此,这会导致ufw在网络启动之后而不是在网络启动之前启动。这似乎可以解决问题 - 启动后始终启用 ufw。我不知道这是否是最好的做事方式。我担心网络启动和防火墙启动之间有一小段时间窗口……但至少它启动了,这比以前好!

也许有人可以提出更好的解决方案。或者,这也许是正确的做事方式——在这种情况下,它是否是默认在网络之前启动的错误?

编辑:

一个更好的解决方案是:

$ diff -u ufw.service.orig ufw.service
--- ufw.service.orig    2018-05-26 13:45:48.696356561 +0100
+++ ufw.service 2018-05-26 14:17:22.030681670 +0100
@@ -2,7 +2,7 @@
 Description=Uncomplicated firewall
 Documentation=man:ufw(8)
 DefaultDependencies=no
-Before=network.target
+After=network-pre.target
 
 [Service]
 Type=oneshot
Run Code Online (Sandbox Code Playgroud)

根据这个页面

https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/

network-pre.target有这个目的:

它的主要目的是与希望在任何网络接口启动之前建立防火墙的防火墙服务一起使用。

这真的让我想知道为什么默认情况下它没有设置为这个。将它设置为这个值似乎解决了我所有的问题。