Firewalld 防火墙配置使用方法
严格意义来讲,单纯将 Firewalld 视为防火墙软件并不准确。Firewalld 是 Linux 内核 Netfilter/Iptables 信息包过滤系统的前端控制工具,用于用户层管理防火墙规则策略。
与直接使用 Iptables 管理相比,Firewalld 提供更好的易用性,在不了解“四表五链”的情况下,只要熟悉常用参数就能轻松管理防火墙规则。
此外,Firewalld 支持动态更新技术,修改规则不需要重新加载防火墙服务。同时加入了“区域”和“服务”概念,能快速切换不同场景策略及快速设置服务规则。
Firewalld 安装与管理
Firewalld 默认包含在部分 Linux 发行版中,比如 CentOS 7+ 和 Fedora 18+,可以使用下面命令检查服务是否被安装。
firewall-cmd --state
如果服务存在会显示 running
或 not running
,如果返回 -bash: firewall-cmd: command not found
则表示没有安装。安装命令如下。
yum install firewalld
桌面环境可以一并安装图形化界面和托盘小工具。
yum install firewall-config yum install firewall-applet
启动服务和设置开机启动(有的系统虽然自带了 Firewalld,但可能没有默认激活)。
systemctl start firewalld systemctl enable firewalld
查看 Firewalld 守护进程状态。
systemctl status firewalld
查看默认区域已允许的端口列表。
firewall-cmd --list-port
查看默认区域已允许的服务列表。
firewall-cmd --list-services
参数选项 | 功能作用 |
---|---|
–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 内核模块,会终止活动连接 |
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的访问,命令如下(命令最后的 drop 参数也可以使用 reject,区别是 drop 直接丢弃流量请求,reject 会返回拒绝信息)。
firewall-cmd --permanent --add-rich-rule 'rule family="ipv4" source address=1.1.1.1 drop'
之后运行 firewall-cmd --reload
命令使配置生效。另外可用 firewall-cmd --list-rich-rules
命令查看屏蔽列表。
允许特定 IP 访问。
firewall-cmd --permanent --add-rich-rule 'rule family="ipv4" source address=1.1.1.1 accept'
进一步设置访问条件,比如指定端口和协议。
# 屏蔽 1.1.1.1 IP 地址访问 TCP 22 端口 firewall-cmd --permanent --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 --permanent --add-rich-rule 'rule family="ipv4" source address=1.1.1.1 port port=22 protocol=tcp accept'
有关 Firewalld 入门使用方法就介绍到这了。如果希望了解更多 Firewalld 用法,可参考 Fedora 文档。