将 openSUSE Tumbleweed 系统默认防火墙 SuSEFirewall2 切换到 Firewalld

Firewalld 是 fedora 的项目。相比较开发停滞的 SuSEFirewall2 来说,Firewalld 能够提供动态防火墙规则管理,而常用的 NetworkManager、fail2ban、libvirt 和 docker 都支持 Firewalld 集成。Firewalld 甚至为传统的 iptables/ip6tables 提供了专门的区「direct」来方便用户同时使用 Firewalld 和 iptables 管理系统防火墙。

博主个人对于这两款产品的了解并不太多。只是偶然看到了有人讨论是不是该将 openSUSE 的默认防火墙切换为 Firewalld 而不是继续使用已经基本停止开发的 SuSEfirewall2。因为博主管理的 VPS 使用的 CentOS 系统默认使用 Firewalld 防火墙,这也是博主用防火墙最多的地方。所以想想还是将自己桌面系统里的也切换到 Firewalld 吧。可能是因为对 SUSEFirewall2 了解太少吧,觉得用起来非常不方便。有一点是肯定的,至少命令行输入的时候 firewall-cmd 要比分大小写的 SuSEfirewall2 方便。firewall-cmd 的文档在这里

背景

而早在 2014 年 11 月 Mathias Homann 就在邮件列表上提起讨论,希望能将 Firewalld 作为一个选项提供给 openSUSE 用户。相关的讨论太多我没有仔细去查看。

在 2016 年 2 月的更新中,openSUSE Tumbleweed 开始在官方源中提供一个供测试的 Firewalld,并表示会推出从 SuSEFirewall2 迁移到 Firewalld 的脚本作为协助。实际上很早的时候就有人(Markos Chandras)开始开发了 susefirewall2-to-firewalld 这个小程序来帮助自动完成规则转换。而其 0.0.1 版本(现在还是)于 2016 年 3 月进入 openSUSE Tumbleweed 官方源,成为安装 Firewalld 时候的推荐软件包。但是 susefirewall2-to-firewalld 只能迁移有限的规则,如果系统的防火墙规则很复杂,也许会有很多问题都需要系统管理员自己来完成。 2017 年 4 月 Firewalld 甚至被加入到了 SuSE 的可选资源库。

在 2018 年年初的更新中,openSUSE 已经将默认的系统防火墙切换到了 FirewallD,见第三周周报。随后不久,YaST 开发组宣布停止开发 yast-firewall 模块并推荐大家如果有需要的话就使用 firewall-config 来通过图形界面管理防火墙。

尝试切换(规则转换失败)

安装软件包

博主的系统很简单,除了系统默认的防火墙规则外就只有很少的几个自己添加的规则。有给 KDE Connect 用的;有玩 qBittorrent 用的;有 create_ap 自动添加的。为了简单,我先把 create_ap 服务停止了。

而且最重要的是,系统根目录使用的 BtrFS 文件系统有自动的快照(snapper)功能。如果失败了,大不了回滚这一次更新。(就怕等到好多天以后才发现问题 :-))

下面就开始安装需要的软件包,

$ sudo zypper install firewalld susefirewall2-to-firewalld

susefirewall2-to-firewalld 的作者推荐大家先查看帮助信息,

$ susefirewall2-to-firewalld -h

其实就是说,如果系统 Firewall 规则很复杂,那就很头痛了,转换可能不成功。幸好我的很简单(我觉得是这样的,因为我相信这个脚本处理系统默认的规则应该没有问题的)。事实上我错了。

这个 susefirewall2-to-firewalld 不加任何参数的直接运行是「模拟(dry-run)」,让用户检查看看结果有没有问题。如果系统规则很复杂,建议将输出导入到文本文件中慢慢看。例如,

$ sudo susefirewall2-to-firewalld > ~/susefirewall2-to-firewalld.log

根据实际情况不同,这个可能需要一小会儿时间来完成。

进行规则转换

*** 下面的操作会对系统有实际更改,请特别注意!!!***

如果检查记录发现没有问题就可以提交实际更改了,

$ sudo susefirewall2-to-firewalld -c

在上面指令完成后的结尾部分有提示,需要注意看。

 INFO: ##################################################################################
 INFO:
 INFO: Your SuSEfirewall2 rules have been migrated to FirewallD. A celebration is in order!
 INFO:
 INFO: Please note that the firewalld rules haven't been made permanent yet.
 INFO: Use 'firewall-cmd --list-all-zones' to verify you are happy with the proposed
 INFO: configuration and then use 'firewall-cmd --runtime-to-permanent' to make it permanent.
 INFO: However, you are advised to look at the following resources and/or
 INFO: commands before making permanent changes to your firewall:
 INFO:
 INFO: - http://www.firewalld.org/documentation/
 INFO: - firewall-cmd --help
 INFO: - firewall-cmd --list-all-zones
 INFO: - firewall-cmd --direct --get-all-passthrough
 INFO: - And the firewalld manpages of course!
 INFO:
 INFO: ##################################################################################

大致就是说,规则转换已经完成,但是并「没有」设置为 Firewalld 的「permanent (永久)」模式,建议用户在查看 Firewalld 的规则之后再将其转换为 permanent 模式。

检查 Firewalld 的 zone 和规则,

$ sudo firewall-cmd --list-all-zones

检查所有生效中的规则,

$ sudo iptables -L -n --line-number
$ sudo ip6tables -L -n --line-number

转换为 permanent 模式,

$ sudo firewall-cmd --runtime-to-permanent

检查

因为前面提到了博主的系统其实非常简单,于是就接受了 `susefirewall2-to-firewalld` 「推荐」的 Firewalld 配置,然后准备慢慢自己改造。反正有之前管理 VPS 的底子在,可以仿照着服务器的规则加加减减。

完成后,启用 create_ap 服务,手机自动连上并可以上网。但是 KDE Connect 没有连接上。然后就发现,实际上这个脚本/程序真的连基本的规则都无法成功转换。比如在上面的试运行日志中记录的,

 INFO: Port(s) "1714:1764(TCP)" will be added to the "external" zone
 INFO: Port(s) "1714:1764(UDP)" will be added to the "external" zone

这个是给 KDE Connect 用的。虽然在日志中提到了,但是实际检查之后发现并没有成功添加到新防火墙中,

 $ sudo firewall-cmd --zone=external --list-all
 external (active)
 target: default
 icmp-block-inversion: no
 interfaces: wlp58s0 enp0s31f6
 sources:
 services: ssh
 ports:
 protocols:
 masquerade: yes
 forward-ports:
 source-ports:
 icmp-blocks:
 rich rules:

另外,更甚的是下面这个,

 Chain IN_external_allow (1 references)
 num target prot opt source destination
 1 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 ctstate NEW

本来没有启用的 SSH 服务居然被启用了。可是检查开启的端口,却又提示是空的(就是没有开启任何端口),

$ sudo firewall-cmd --list-ports

可见这个脚本真的是非常初级的,基本上就是搭了个 Firewalld 的架子出来,剩下的可能完全靠自己了。

不知道是不是博主搞错了。

自主配置 Firewalld(手工设置,成功)

因为博主的防火墙规则很简单,自己自主配置可能更轻松,也更容易把握。所以准备自己从头来。利用 snapper 撤销这一对 BtrFS 镜像的更改,然后卸载并禁用 SuSEfirewall2。

$ sudo zypper remove SuSEfirewall2
$ sudo zypper addlock SuSEfirewall2

然后重新安装 Firewalld。如果需要的话也可以顺便安装图形界面的配置工具 firewall-config 和任务栏图标 firewall-applet(这两个在 KDE Plasma 5 上也可以工作)。这次就不要那个转换脚本了。

$ sudo zypper install firewalld firewall-applet firewall-config

启用并立即运行 FirewallD,

$ sudo systemctl enable firewalld
$ sudo systemctl start firewalld

然后就直接使用 Firewalld 的默认配置,并开始自己加入需要的服务/端口。因为在服务器上用惯了,还是命令行比较顺手。

首先把默认的 zone 改成了 Firewalld 的默认 “public”(估计安装后就是这样,只是 susefirewall2-to-firewalld 给改成了 “external”),

$ sudo firewall-cmd --set-default-zone=public

移除 SSH 服务端口,

$ sudo firewall-cmd --zone=public --permanent --remove-service=ssh

增加 KDE Connect 的规则(开放 1714-1764 端口)到 external 区块中也很简单,因为 /usr/lib/firewalld/services/kdeconnect-kde.xml 这个文件配置了 KDE Connect 作为防火墙的一个服务的配置文件。启用该服务即可,

$ sudo firewall-cmd --zone=public --permanent --add-service=kdeconnect-kde

其实就算是自己直接添加端口也很简单,

$ sudo firewall-cmd --zone=public --permanent --add-port 1714-1764/udp
$ sudo firewall-cmd --zone=public --permanent --add-port 1714-1764/tcp

然后 UPnP 的设置用的端口 1900,

$ sudo firewall-cmd --zone=public --permanent --add-port 1900/udp # for UPnP-Forum
$ sudo firewall-cmd --zone=public --permanent --add-port 1900/tcp # for UPnP-Forum

暂时就这么多,重新加载 Firewalld 的规则即可,

$ sudo firewall-cmd --reload

然后手机立马就连接上了。

最后想说的是,如果不是非常需要,就等着 openSUSE 社区进行切换吧。按照计划,openSUSE Leap 15 将会切换到 FirewallD(reference)。那么 Tumbleweed 上肯定会比这个早吧。不过按照今天的操作来看,这似乎不是个容易的事情。除非有人能够将 susefirewall2-to-firewalld 完善到能够应付复杂的情况。不过其实以博主的使用情景,似乎不需要这些防火墙外壳,直接用 iptables 就够了。©

本文发表于水景一页。永久链接:<https://cnzhx.net/blog/opensuse-tumbleweed-switch-susefirewall2-to-firewalld/>。转载请保留此信息及相应链接。

14 条关于 “将 openSUSE Tumbleweed 系统默认防火墙 SuSEFirewall2 切换到 Firewalld” 的评论

  1. 引用通告: openSUSE Tumbleweed 更新 Linux 内核 4.14.13、RPM 4.14.0、Mesa 17.3.2 和 KDE Applications 17.12.1 等 | 水景一页

  2. 突然发现yast里的防火墙变成了Firewalld 貌似SuSEfirewall2还在

      • 竟然没怎么注意, 今天上去改个端口发现得装东西, 然后就是Firewalld了
        : ) , 还是感谢博主一如既往的每周总结.

        • 如果你不是新装的系统,应该不会有什么变化吧?怎么还需要装东西呢?本来用的如果是 SuSEfirewall2 那就应该还是这个啊。我也不太明白 :-P

          • 这我也不清楚, 不过现在这个也用了一段时间了, 并不是新装的 当时版本是0120的 :)

          • : ) 我指的是 我发现这个的时候 当前快照是 0120
            用着还可以,感觉还挺好用的,就是一进去的时候有点懵 :)

            • 哈,我理解错了。似乎现在 yast-firewalld 模块还不是很健全,不过对于桌面使用来说应该足够了。我喜欢将操作编成命令行来执行,这样下一次有类似的修改一下就能重用,很少用 YaST。

        • 我今天也打开YaST里的防火墙模块看了,发现你当时安装的东西多半是 firewall-config

  3. 引用通告: 在 T470s 上折腾 Linux 滚动发行版 openSUSE Tumbleweed 记录汇总 | 水景一页

  4. 想问一下, 今后 YasT 还打算集成 Firewalld 吗? 还是就推荐使用 firewall-config 了? 因为我比较喜欢 YasT 可以管理一切的设定。而且听说 SUSE 官方打算精简 YasT 的功能? 谢谢

    • 记得之前看到过这个问题的讨论。大意是,这个不属于紧要功能,所以以后能开发到什么程度现在没人能预料。目前还是建议用 firewall-config。

  5. 引用通告: openSUSE Tumbleweed 更新 Linux Kernel 4.19.2、KDE Frameworks 5.52 和 systemd 239 等 | 水景一页

时间过去太久,评论已关闭。
如果您有话要说,请到讨论区留言并给出此文章链接。
谢谢您的理解 :-)