如何让 ufw 在启动时启动?

如何让 ufw 在启动时启动?

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

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

$ sudo ufw status
Status: inactive

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

$ sudo service ufw start
$ sudo ufw status
Status: inactive

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

$ sudo ufw reload
Firewall reloaded
$ sudo ufw status
Status: active

此后,“服务”脚本就可以正常工作了:

$ sudo ufw status
Status: active
$ sudo service ufw stop
$ sudo ufw status
Status: inactive
$ sudo service ufw start
$ sudo ufw status
Status: active

如何让 ufw 在启动时启动?

编辑:

我正在使用 Ubuntu 18.04,因此正在使用 systemd。systemctl is-enabled报告如下:

$ sudo ufw status verbose
Status: inactive
$ sudo systemctl is-enabled ufw.service
enabled

我也尝试过这个:

$ 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

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

$ journalctl -u ufw
...<snip>...
-- Reboot --
May 26 12:53:36 matt-laptop systemd[1]: Started Uncomplicated firewall.

因此,显然尝试启动 ufw...它似乎实际上并没有它!

答案1

我想到了一个解决方案。我做了以下编辑/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

因此,这会导致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

根据此页面

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

network-pre.target这个目的:

其主要目的是用于希望在任何网络接口启动之前建立防火墙的防火墙服务。

这让我很疑惑为什么它没有默认设置为这个。将它设置为这个值似乎解决了我所有的问题。

答案2

修复很简单;我们需要告诉操作系统在 netfilter-persistent 之后加载 ufw

运行此命令:

sudo nano /lib/systemd/system/ufw.service

并添加以下文字:

[Unit]
 Description=Uncomplicated firewall
 Documentation=man:ufw(8)
 DefaultDependencies=no
 Before=network.target
 After=netfilter-persistent.service

 [Service]
 Type=oneshot
 RemainAfterExit=yes
 ExecStart=/lib/ufw/ufw-init start quiet
 ExecStop=/lib/ufw/ufw-init stop

 [Install]
 WantedBy=multi-user.target

来源:UFW 服务在重启后无法加载

答案3

我使用的是 Debian 的 vanilla 版本,不是 Ubuntu,但这是我能找到的关于如何在启动时加载 ufw 的最佳帖子。这里的建议对我来说不起作用,但为我提供了足够的线索,最终使它工作正常。

到底我只需要改变一行. 其他一切都我都保留了下来。

  • 编辑文件中的 UNIT 部分ufw.service
  • 改成Before=network.targetAfter=network-online.target

保存后重启,ufw 即可运行

注意,如果你禁用 ufw 并重启,它将被禁用。如果启用了 ufw 并重启,它将被启用。

答案4

只有这个解决方案有效(添加到 crontab):

@reboot sleep 120 && /usr/sbin/ufw reload

相关内容