firewall-cmd
是 firewalld 服务的命令行客户端,用于在 Linux 系统中动态管理防火墙规则。Firewalld 提供了支持网络区域的动态管理防火墙,而不需要重新加载整个防火墙规则集。
基本选项
通用选项
-h, --help
:显示帮助信息-V, --version
:显示版本信息-q, --quiet
:不显示状态消息
状态选项
--state
:检查 firewalld 是否运行--reload
:重新加载防火墙规则(保留状态信息)--complete-reload
:完全重新加载防火墙(会中断活动连接)--runtime-to-permanent
:将当前运行时配置保存为永久配置--check-config
:检查永久配置的有效性
区域(Zone)管理
基本区域操作
--get-default-zone
:显示默认区域--set-default-zone=<zone>
:设置默认区域--get-active-zones
:显示活动区域及其绑定的接口和源--get-zones
:列出所有预定义区域--info-zone=<zone>
:显示指定区域的详细信息--list-all-zones
:列出所有区域的配置
区域配置
--zone=<zone> --list-all
:列出指定区域的所有配置--zone=<zone> --list-services
:列出区域允许的服务--zone=<zone> --add-service=<service>
:允许服务通过防火墙--zone=<zone> --remove-service=<service>
:移除允许的服务--zone=<zone> --list-ports
:列出允许的端口--zone=<zone> --add-port=<port>/<protocol>
:允许端口通过防火墙--zone=<zone> --remove-port=<port>/<protocol>
:移除允许的端口
服务(Service)管理
--get-services
:列出所有预定义服务--info-service=<service>
:显示服务的详细信息--add-service=<service>
:添加服务(运行时配置)--remove-service=<service>
:移除服务
端口管理
--add-port=<port>/<protocol>
:临时开放端口(如--add-port=80/tcp
)--remove-port=<port>/<protocol>
:关闭端口--list-ports
:列出已开放的端口
接口绑定
--zone=<zone> --add-interface=<interface>
:将接口绑定到区域--zone=<zone> --change-interface=<interface>
:更改接口绑定的区域--zone=<zone> --remove-interface=<interface>
:移除接口绑定--zone=<zone> --list-interfaces
:列出区域绑定的接口
源地址绑定
--zone=<zone> --add-source=<source>
:将源地址绑定到区域--zone=<zone> --change-source=<source>
:更改源地址绑定的区域--zone=<zone> --remove-source=<source>
:移除源地址绑定--zone=<zone> --list-sources
:列出区域绑定的源地址
永久配置
-
--permanent
:使更改永久生效(需重启或重载防火墙)示例:
firewall-cmd --permanent --add-service=http # 永久允许HTTP服务 firewall-cmd --reload # 重载防火墙使永久更改生效
高级功能
直接规则(Direct)
--direct --add-rule {ipv4|ipv6|eb} <table> <chain> <priority> <args>
:添加直接规则--direct --remove-rule {ipv4|ipv6|eb} <table> <chain> <priority> <args>
:移除直接规则
锁定模式(Lockdown)
--lockdown-on
:启用锁定模式(限制配置更改)--lockdown-off
:禁用锁定模式--query-lockdown
:查询锁定模式状态
紧急模式(Panic)
--panic-on
:启用紧急模式(阻止所有网络流量)--panic-off
:禁用紧急模式--query-panic
:查询紧急模式状态
示例
1. 状态管理
1.1 检查防火墙状态
firewall-cmd --state
- 作用:检查
firewalld
守护进程是否运行。 - 输出:
running
(运行中)、not running
(未运行)、RUNNING_BUT_FAILED
(运行但启动失败)。 - 示例:
$ firewall-cmd --state running
1.2 重新加载防火墙规则
firewall-cmd --reload
- 作用:重新加载防火墙规则,保留当前连接状态。
- 注意:仅影响运行时配置,不会终止活动连接。
1.3 完全重载防火墙
firewall-cmd --complete-reload
- 作用:完全重载防火墙,包括内核模块(可能终止活动连接)。
- 注意:仅在严重问题时使用。
2. 区域管理
2.1 获取默认区域
firewall-cmd --get-default-zone
- 作用:查看默认区域(新接口/源的绑定区域)。
2.2 设置默认区域
firewall-cmd --set-default-zone=<zone>
- 作用:将默认区域设置为
<zone>
(如public
)。 - 示例:
$ firewall-cmd --set-default-zone=public
2.3 列出活动区域
firewall-cmd --get-active-zones
- 作用:列出当前绑定到接口或源的活动区域。
- 输出格式:
zone: public interfaces: eth0 sources: 192.168.1.0/24
2.4 查询接口所属区域
firewall-cmd --get-zone-of-interface=<interface>
- 作用:查看接口
<interface>
所属的区域。 - 示例:
$ firewall-cmd --get-zone-of-interface=eth0 public
2.5 查询源地址所属区域
firewall-cmd --get-zone-of-source=<source>
- 作用:查看源地址
<source>
(IP/MAC/ipset)所属的区域。 - 示例:
$ firewall-cmd --get-zone-of-source=192.168.1.100 home
3. 服务管理
3.1 添加服务到区域
firewall-cmd --zone=<zone> --add-service=<service> [--timeout=<timeval>]
- 作用:将服务
<service>
(如http
)添加到指定区域。 - 参数:
--timeout
:设置临时规则(单位:秒、分钟、小时,如30m
)。
- 示例:
$ firewall-cmd --zone=public --add-service=http
3.2 移除服务
firewall-cmd --zone=<zone> --remove-service=<service>
- 作用:从区域中移除服务。
- 示例:
$ firewall-cmd --zone=public --remove-service=http
3.3 查询服务是否启用
firewall-cmd --zone=<zone> --query-service=<service>
- 作用:检查服务是否在区域中启用。
- 返回值:
0
(启用)、1
(未启用)。
4. 端口管理
4.1 添加端口到区域
firewall-cmd --zone=<zone> --add-port=<portid[-portid]/protocol> [--timeout=<timeval>]
- 作用:开放指定端口和协议(如
80/tcp
)。 - 示例:
$ firewall-cmd --zone=public --add-port=80/tcp
4.2 移除端口
firewall-cmd --zone=<zone> --remove-port=<portid[-portid]/protocol>
- 作用:关闭指定端口。
- 示例:
$ firewall-cmd --zone=public --remove-port=80/tcp
4.3 列出区域端口
firewall-cmd --zone=<zone> --list-ports
- 作用:查看区域中开放的端口列表。
5. 协议管理
5.1 添加协议到区域
firewall-cmd --zone=<zone> --add-protocol=<protocol> [--timeout=<timeval>]
- 作用:允许指定协议(如
icmp
)。 - 示例:
$ firewall-cmd --zone=public --add-protocol=icmp
5.2 移除协议
firewall-cmd --zone=<zone> --remove-protocol=<protocol>
- 作用:禁止指定协议。
6. ICMP 类型管理
6.1 阻止 ICMP 类型
firewall-cmd --zone=<zone> --add-icmp-block=<icmptype>
- 作用:阻止特定 ICMP 类型(如
echo-request
)。 - 示例:
$ firewall-cmd --zone=public --add-icmp-block=echo-request
6.2 移除 ICMP 阻止
firewall-cmd --zone=<zone> --remove-icmp-block=<icmptype>
7. 转发端口
7.1 添加端口转发
firewall-cmd --zone=<zone> --add-forward-port=port=<port>:proto=<protocol>[:toport=<port>][:toaddr=<address>]
- 作用:配置端口转发(NAT)。
- 示例:
$ firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.1.100
7.2 移除端口转发
firewall-cmd --zone=<zone> --remove-forward-port=port=<port>:proto=<protocol>[:toport=<port>][:toaddr=<address>]
8. 富规则(Rich Rules)
8.1 添加富规则
firewall-cmd --zone=<zone> --add-rich-rule='<rule>' [--timeout=<timeval>]
- 作用:添加复杂规则(如基于源地址、端口、服务的组合规则)。
- 示例:
$ firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="22" accept'
8.2 移除富规则
firewall-cmd --zone=<zone> --remove-rich-rule='<rule>'
9. 永久配置
9.1 保存运行时配置
firewall-cmd --runtime-to-permanent
- 作用:将当前运行时配置保存为永久配置(需配合
--reload
生效)。
9.2 永久配置选项
- 所有命令添加
--permanent
参数即可持久化配置,例如:$ firewall-cmd --permanent --add-service=http
10. 高级功能
10.1 IPset 管理
- 创建 IPset:
firewall-cmd --permanent --new-ipset=<ipset> --type=<type>
- 添加条目:
firewall-cmd --permanent --ipset=<ipset> --add-entry=<entry>
10.2 直接规则(Direct Rules)
firewall-cmd --direct --passthrough <ipv4|ipv6|eb> <args>
- 作用:直接调用
iptables
/ip6tables
命令。 - 示例:
$ firewall-cmd --direct --passthrough ipv4 '-A INPUT -p tcp --dport 22 -j ACCEPT'
11. 锁定模式(Lockdown)
11.1 启用锁定
firewall-cmd --lockdown-on
- 作用:限制只有白名单内的程序可修改防火墙规则。
11.2 添加白名单命令
firewall-cmd --permanent --add-lockdown-whitelist-command=<command>
12. 常见错误代码
代码 | 含义 |
---|---|
0 | 成功 |
11 | 已启用(ALREADY_ENABLED) |
12 | 未启用(NOT_ENABLED) |
252 | 服务未运行(NOT_RUNNING) |
253 | 权限不足(NOT_AUTHORIZED) |
254 | 未知错误(UNKNOWN_ERROR) |
13. 示例汇总
13.1 开放 HTTP 服务
# 运行时开放
firewall-cmd --add-service=http
# 永久开放
firewall-cmd --permanent --add-service=http
# 重载配置
firewall-cmd --reload
13.2 配置端口转发
firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.1.100
firewall-cmd --reload
13.3 限制源地址访问
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="ssh" accept'
firewall-cmd --reload