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 就够了。©
本文发表于水景一页。永久链接:<http://cnzhx.net/blog/opensuse-tumbleweed-switch-susefirewall2-to-firewalld/>。转载请保留此信息及相应链接。
引用通告: openSUSE Tumbleweed 更新 Linux 内核 4.14.13、RPM 4.14.0、Mesa 17.3.2 和 KDE Applications 17.12.1 等 | 水景一页
突然发现yast里的防火墙变成了Firewalld 貌似SuSEfirewall2还在
是的,在 0117 快照中切换了,但是没有强制转换已有系统的防火墙。这个在上周的快报中介绍过了。
竟然没怎么注意, 今天上去改个端口发现得装东西, 然后就是Firewalld了
: ) , 还是感谢博主一如既往的每周总结.
如果你不是新装的系统,应该不会有什么变化吧?怎么还需要装东西呢?本来用的如果是 SuSEfirewall2 那就应该还是这个啊。我也不太明白 :-P
这我也不清楚, 不过现在这个也用了一段时间了, 并不是新装的 当时版本是0120的 :)
那不是已经一年了?我不知道,用着没问题就好。
: ) 我指的是 我发现这个的时候 当前快照是 0120
用着还可以,感觉还挺好用的,就是一进去的时候有点懵 :)
哈,我理解错了。似乎现在 yast-firewalld 模块还不是很健全,不过对于桌面使用来说应该足够了。我喜欢将操作编成命令行来执行,这样下一次有类似的修改一下就能重用,很少用 YaST。
我今天也打开YaST里的防火墙模块看了,发现你当时安装的东西多半是
firewall-config
。引用通告: 在 T470s 上折腾 Linux 滚动发行版 openSUSE Tumbleweed 记录汇总 | 水景一页
想问一下, 今后 YasT 还打算集成 Firewalld 吗? 还是就推荐使用 firewall-config 了? 因为我比较喜欢 YasT 可以管理一切的设定。而且听说 SUSE 官方打算精简 YasT 的功能? 谢谢
记得之前看到过这个问题的讨论。大意是,这个不属于紧要功能,所以以后能开发到什么程度现在没人能预料。目前还是建议用 firewall-config。
引用通告: openSUSE Tumbleweed 更新 Linux Kernel 4.19.2、KDE Frameworks 5.52 和 systemd 239 等 | 水景一页