firewalld防护墙服务¶
firewalld概念¶
firewalld
是Red Hat开发的firewall daemon,默认使用了nftables(取代iptables的netfilter实现)。firewalld
提供了动态管理的基于主机的防火墙,带有 D-Bus 接口,支持网络/防火墙区域(zones)概念以便定义网络连接或网络接口的信任级别。firewalld
支持IPv4, IPv6防火墙设置,以太网网桥以及IP sets。firewalld
提供了运行时配置和永久性配置的区分,也提供了面向服务或应用程序来添加防火墙规则的接口。firewalld
阻止未明确设置为打开的端口上的所有流量。默认情况下,某些区域(例如受信任区域)允许所有流量。
安装firewalld¶
arch linux:
pacman -S firewalld
rhel/CentOS:
dnf install firewalld
使用firewalld¶
激活和启动firewalld.service:
systemctl start firewalld
systemctl enable firewalld
通过 firewall-cmd
控制台工具可以管理防火墙规则。
配置¶
备注
大多数命令是运行时配置,但是不是持久化配置,也就是重启操作系统会清除。要永久化配置有两个选项:
使用
--permanent
选项,这个命令选项不会
修改运行时配置,除非重启firewall服务或者重新加载--reload
将运行时配置转换成永久配置
Zones¶
zone是汇集规则并应用到指定接口。
检查当前zone和关联到接口,使用命令:
firewall-cmd --get-active-zones
例如,显示输出:
libvirt
interfaces: virbr0
public
interfaces: wlp3s0
通过传递 --zone=zone_name
参数可以向指定zone传递
zone信息¶
可以列出所有zone的配置:
firewall-cmd --list-all-zones
或只列出指定zone:
firewall-cmd --info-zone=zone_name
举例:
firewall-cmd --info-zone=public
显示输出:
public (active)
target: default
icmp-block-inversion: no
interfaces: wlp3s0
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
修改zone的接口:
firewall-cmd --zone=zone --change-interface=interface_name
默认zone¶
检查默认zone的接口:
firewall-cmd --get-default-zone
显示输出:
public
可以修改默认zone,注意这个修改是永久的:
firewall-cmd --set-default-zone=XXXX
服务¶
服务(service)是预先制定的针对特定daemon的预定规则。例如 ssh
service对应的就是SSH服务和开放端口22到指定zone。
列出所有可用的预定服务:
firewall-cmd --get-services
可以进一步检查特定服务信息:
firewall-cmd --info-service service_name
举例,查看 samba
需要开放端口有4个:
firewall-cmd --info-service samba
输出显示:
samba
ports: 137/udp 138/udp 139/tcp 445/tcp
protocols:
source-ports:
modules: netbios-ns
destination:
includes:
在zone上添加或移除服务¶
将服务添加到zone,就可以一次设置好需要的所有端口:
firewall-cmd --zone=zone_name --add-service service_name
举例,在libvirt zone上添加samba服务,以便能够让虚拟机访问物理主机上的samba共享存储卷,方便虚拟机交换数据:
firewall-cmd --zone=libvirt --add-service samba
反之,也可以删除服务:
firewall-cmd --zone=zone_name --remove-service service_name
端口添加或删除¶
也可以在指定zone上添加端口或删除端口:
firewall-cmd --zone=zone_name --add-port port_num/protocol
这里protocol可以是tcp或udp。删除端口使用 --remove-port
参数。
端口和服务时限¶
firewalld还支持一种有时间限制的服务和端口添加,时间单位可以是秒(无需单位表示),或者分钟(m)或者小时(h)。举例,添加3小时有效的SSH服务:
firewall-cmd --add-service ssh --timeout=3h
运行时配置持久化¶
可以将当前配置持久化:
firewall-cmd --runtime-to-permanent
惨痛的教训¶
我在 排查Ceph部署”monclient(hunting): authenticate timed out” 犯了一个低级错误,简单查看了 iptables -L
输出为空就以为主机没有启动防火墙。没想到 Fedora 默认启用了 firewalld
服务。所以后来检查:
firewall-cmd --list-all
可以看到 firewalld
屏蔽了 Ceph Atlas 服务访问:
FedoraServer
target: default
icmp-block-inversion: no
interfaces:
sources:
services: cockpit dhcpv6-client ssh
ports:
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
停止 firewalld
:
systemctl stop firewalld
systemctl disable firewalld