将 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 的可选资源库。

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

安装软件包

博主的系统很简单,除了系统默认的防火墙规则外就只有很少的几个自己添加的规则。有给 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/>。转载请保留此信息及相应链接。

雁过留声,人过留名

电子邮件地址不会被公开。 必填项已用*标注

特别提示:与当前文章主题无关的讨论相关但需要较多讨论求助信息请发布到水景一页讨论区的相应版块,谢谢您的理解与合作!请参考本站互助指南
您可以在评论中使用如下的 HTML 标记来辅助表达: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>