这是我参与8月更文挑战的第9天,活动详情查看:8月更文挑战
严格意义来讲,单纯将 Firewalld 视为防火墙软件并不准确。Firewalld 是 Linux 内核 Netfilter/Iptables 信息包过滤系统的前端控制工具,用于用户层管理防火墙规则策略。
与直接使用 Iptables 管理相比,Firewalld 提供更好的易用性,在不了解“四表五链”的情况下,只要熟悉常用参数就能轻松管理防火墙规则。
此外,Firewalld 支持动态更新技术,修改规则不需要重新加载防火墙服务。同时加入了“区域”和“服务”概念,能快速切换不同场景策略及快速设置服务规则。
Firewalld 安装与管理
Firewalld 默认包含在部分 Linux 发行版中,比如 CentOS 7+ 和 Fedora 18+,可以使用下面命令检查服务是否被安装。
# 安装
yum install firewalld
# 桌面环境可以一并安装图形化界面和托盘小工具
yum install firewall-config
yum install firewall-applet
# 启动服务和设置开机启动
systemctl start firewalld
systemctl enable firewalld
# 查看默认区域已允许的端口列表
firewall-cmd --list-port
#查看默认区域已允许的服务列表
firewall-cmd --list-services
Firewalld 区域概念
Firewalld 有一个“区域”防火墙概念,这是针对不同使用场景而对应不同信任级别的访问控制策略。通过将网络分割成不同的区域,制定出不同区域间允许不同的网络服务和流量传输类型。
Firewalld 默认提供了几组区域策略模板(见下面表格,配置文件在 /usr/lib/firewalld/zones/ 目录下),其中 public 是默认使用区域。对于大部分服务,需要手动设置放行才能访问。
| 区域名称 | 规则策略 |
|---|---|
| public | 表示公共区域,不信任网络内其他计算机,仅允许选定的传入连接 |
| drop | 最低级别的信任。所有传入连接都会被丢弃,并且没有回应,仅能有传出的网络连接 |
| block | 与 drop 类似,但不是简单地丢弃连接,由 icmp-host-prohibited 返回拒绝信息 |
| external | 通常是启用了 NAT 伪装的外部网络,不信任网络上其他计算机,只接受选定的传入连接 |
| internal | 用于内部网络。信任网络内的其他计算机,仅接受选定的传入连接 |
| home | 用于家庭区域。信任网络内的其他计算机,只接受选定的传入连接 |
| work | 用于工作区域。信任网络内的其他计算机,只接受选定的传入连接 |
| dmz | 处于隔离区域的计算机,可通过有限的内部网络进行公开访问。只接受选定的传入连接 |
| trusted | 最高级别的信任区域,可接受所有的网络连接,信任网络内其他计算机 |
查看某个区域的配置信息,包括区域描述、网卡、允许端口及服务等参数(以查看 public 区域为例)
firewall-cmd --info-zone=public -v
如果需要添加自定义区域,操作流程如下
# 创建新区域
firewall-cmd --permanent --new-zone=ZoneName
# 添加允许的服务(根据需要设置)
firewall-cmd --permanent --zone=ZoneName --add-service=ssh
firewall-cmd --permanent --zone=ZoneName --add-service=dns
# 设置使用网卡(非必需,不设置将使用默认网卡)
firewall-cmd --zone=ZoneName --change-interface=eth1
# 重启网络和防火墙服务,使配置生效
systemctl restart network
systemctl reload firewalld
针对服务设置访问规则
Firewalld 默认公共区域策略,除了 SSH 这类关键服务,其他服务默认是禁止的(服务泛指端口/协议、应用程序)。如果需要允许其他服务通信,需要手动添加例外。
例如在公共区域内启用 / 禁用 HTTP 服务
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --remove-service=http
操作后,运行 firewall-cmd --reload 命令使配置刷新生效。
要查看可用的服务名称列表,请使用 firewall-cmd --get-services 命令。如需进一步查看服务描述与其端口使用情况,进入 /usr/lib/firewalld/services 目录,查看里面的 XML 服务描述文件。
如果需要添加自定义服务,请到 /etc/firewalld/services 目录下创建相应的 XML 服务文件。可以直接复制其它服务文件,然后在此基础上修改。需要修改的地方有服务名称、描述、允许的端口协议。
cp /usr/lib/firewalld/services/http.xml /etc/firewalld/services/service-name.xml
在下面例子中创建了一个自定义服务,设置服务使用 TCP 111 和 UDP 222 端口
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>example-service</short>
<description>This is just an example service. use TCP 111 and UDP 222 network port.</description>
<port protocol="tcp" port="111"/>
<port protocol="udp" port="222"/>
</service>
相较直接对不同服务设置具体端口访问,以服务方式管理会更方便,建议优先采用。这样可以不用记住各项服务的端口/协议参数,只需知道服务名称就能操作。
针对端口/协议设置访问规则
如果需要单独允许 / 禁止特定协议的某些端口访问,命令如下
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --zone=public --remove-port=80/tcp --permanent
批量添加 / 删除端口可以使用连字号指定端口范围
firewall-cmd --zone=public --add-port=80-90/tcp --permanent
firewall-cmd --zone=public --remove-port=80-90/tcp --permanent
设置端口转发,示例将 80 端口流量转发到 8080 端口
# 开启 NAT 功能
firewall-cmd --zone=public --add-masquerade
# 设置端口转发
firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080
临时开放端口/服务访问
对于测试用途,有时可能只需临时开放一段时间。例如设置允许 25 端口或 smtp 服务 600 秒内可访问
firewall-cmd --add-port=25/tcp --timeout=600
firewall-cmd --add-service=smtp --timeout=600
允许/禁止特定 IP 访问
通过配置 rich-rule 参数,可以屏蔽指定IP的访问,命令如下(命令最后的 reject 参数也可以使用 drop,区别是 drop 直接丢弃流量请求,reject 会返回拒绝信息)
firewall-cmd --add-rich-rule 'rule family="ipv4" source address=1.1.1.1 reject'
允许特定 IP 访问
firewall-cmd --add-rich-rule 'rule family="ipv4" source address=1.1.1.1 accept'
进一步设置访问条件,比如指定端口和协议
# 屏蔽 1.1.1.1 IP 地址访问 TCP 22 端口
firewall-cmd --add-rich-rule 'rule family="ipv4" source address=1.1.1.1 port port=22 protocol=tcp reject'
# 允许 1.1.1.1 IP 地址访问 TCP 22 端口
firewall-cmd --add-rich-rule 'rule family="ipv4" source address=1.1.1.1 port port=22 protocol=tcp accept'
常见命令附录
| 参数选项 | 功能作用 |
|---|---|
| –version | 查看软件版本信息 |
| –help | 查看软件帮助信息 |
| –permanent | 设置规则永久生效,需要重新加载配置生效 |
| –reload | 重新加载防火墙配置,使永久规则即时生效 |
| –get-default-zone | 查询当前默认区域名称 |
| –set-default-zone=<区域名称> | 更改默认区域(需刷新防火墙配置生效) |
| –get-zones | 列出所有区域名称,以空格分隔显示 |
| –get-services | 显示所有可用的服务名称 |
| –get-active-zones | 显示当前正在使用的区域与网卡名称 |
| –list-all | 显示当前区域详细参数内容 ,包括网卡、允许服务/端口等信息 |
| –list-all-zones | 显示所有区域详细参数内容 ,包括网卡、允许服务/端口等信息 |
| –add-service=<服务名> | 设置默认区域允许该服务的流量 |
| –remove-service=<服务名> | 设置默认区域不再允许该服务的流量 |
| –add-port=<端口号/协议> | 允许默认区域允许该端口的流量 |
| –remove-port=<端口号/协议> | 允许默认区域不再允许该端口的流量 |
| –add-source=<IP地址> | 将此IP或子网流量导向指定的区域 |
| –remove-source=<IP地址> | 取消此IP或子网流量导向某个指定区域 |
| –add-interface=<网卡名称> | 将来该网卡的所有流量导向某个指定区域 |
| –change-interface=<网卡名称> | 将某个网卡与区域做关联 |
| –direct | 直接运行 Iptables 命令接口 |
| –direct –get-all-chains | 查看添加的 Iptables 链命令 |
| –direct –get-all-rules | 查看添加的 Iptables 规则命令 |
| –list-lockdown-whitelist-commands | 列出锁定白名单中的所有命令 |
| –add-lockdown-whitelist-command=<命令> | 添加命令到锁定白名单 |
| –remove-lockdown-whitelist-command=<命令> | 从锁定白名单里删除命令 |
| –list-lockdown-whitelist-users | 列出锁定白名单里的所有用户 |
| –add-lockdown-whitelist-user=<用户名> | 添加用户到锁定白名单内 |
| –remove-lockdown-whitelist-user=<用户名> | 从锁定白名单里删除用户 |
| –lockdown-on | 锁定防火墙配置,锁定后将无法使用 firewall-cmd 管理配置 |
| –lockdown-off | 解除锁定状态,需要 firewall-cmd 命令在锁定白名单中才能使用 |
| –runtime-to-permanent | 保存运行时的配置,并用它覆盖永久配置 |
| –panic-on | 启用紧急模式,切断所有传入传出数据包 |
| –panic-off | 关闭紧急模式 |
| –complete-reload | 完全重新加载防火墙服务,包括 netfilter 内核模块,会终止活动连接 |