firewall-cmd 命令讲解
firewall-cmd
是 firewalld
服务的命令行接口,用于配置和管理 Linux 防火墙。它提供了很多选项来添加规则、打开/关闭端口、管理网络区域以及查询防火墙状态等。
以下是 firewall-cmd
的主要命令和选项的详细解释。
基本命令结构
firewall-cmd [选项] [子命令] [参数]
- 选项:如
--permanent
、--zone
等,用于指定作用范围或模式。 - 子命令:如
--add-port
、--list-all
等,表示具体的操作。 - 参数:如端口号、协议、服务名等,用于指定子命令的具体参数。
常见选项和子命令
1. --state
:查看防火墙状态
firewall-cmd --state
该命令会返回防火墙的当前状态。常见的输出结果有:
running
:防火墙正在运行。not running
:防火墙未运行。
2. --reload
:重新加载防火墙规则
firewall-cmd --reload
此命令重新加载防火墙规则,并应用所有已经通过 --permanent
选项设置的更改。
3. --permanent
:永久性生效的规则
firewall-cmd --permanent --add-port=80/tcp
当使用 --permanent
选项时,规则会被永久写入,且在防火墙重新加载后生效(通过 --reload
重新加载)。如果不加 --permanent
,更改只会立即生效,但重启防火墙后将失效。
4. --zone
:指定网络区域
firewall-cmd --zone=public --add-port=443/tcp
--zone=public
表示应用规则到特定区域。每个区域代表一组规则,默认区域通常是public
。- 如果不指定
--zone
,则默认作用于当前默认区域。
5. --list-all
:列出区域的所有规则
firewall-cmd --zone=public --list-all
显示某个区域(如 public
)的所有规则,包括已允许的服务、端口、转发规则等。输出结果类似:
public (active)
target: default
icmp-block-inversion: no
interfaces:
sources:
services: ssh dhcpv6-client
ports: 80/tcp 443/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
6. --add-port
:开放指定端口
firewall-cmd --zone=public --add-port=80/tcp
firewall-cmd --zone=public --add-port=443/tcp --permanent
--add-port=80/tcp
:在public
区域开放 TCP 协议的 80 端口。--permanent
:指定该规则永久生效。
7. --remove-port
:移除已开放的端口
firewall-cmd --zone=public --remove-port=80/tcp
firewall-cmd --zone=public --remove-port=80/tcp --permanent
移除指定的端口,方式与 --add-port
相同。
8. --add-service
:允许某个服务通过
firewall-cmd --zone=public --add-service=http
firewall-cmd --zone=public --add-service=https --permanent
--add-service=http
:允许 HTTP 服务(通常是端口 80)。- 使用
--permanent
使规则永久生效。
9. --remove-service
:禁止某个服务通过
firewall-cmd --zone=public --remove-service=http --permanent
移除已允许的服务,比如 HTTP 或 HTTPS。
10. --list-ports
:列出开放的端口
firewall-cmd --zone=public --list-ports
列出当前区域中已经开放的端口,输出类似:
80/tcp 443/tcp
11. --list-services
:列出允许的服务
firewall-cmd --zone=public --list-services
列出已允许的服务,输出类似:
ssh dhcpv6-client http https
12. --add-rich-rule
:添加复杂规则
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port port=22 protocol=tcp accept'
- rich rule:允许你定义更复杂的规则。上面的示例允许来自
192.168.1.100
的 IP 访问 TCP 的 22 端口(SSH)。
13. --remove-rich-rule
:移除复杂规则
firewall-cmd --zone=public --remove-rich-rule='rule family="ipv4" source address="192.168.1.100" port port=22 protocol=tcp accept'
移除已定义的复杂规则,规则字符串必须与添加时的规则一致。
14. --add-masquerade
:启用伪装(NAT)
firewall-cmd --zone=public --add-masquerade
firewall-cmd --zone=public --add-masquerade --permanent
启用网络地址转换(NAT),可以让内网的私有地址通过外部地址进行访问。
15. --remove-masquerade
:禁用伪装
firewall-cmd --zone=public --remove-masquerade --permanent
禁用伪装功能。
16. --get-default-zone
:获取默认区域
firewall-cmd --get-default-zone
查看当前默认区域,通常是 public
,所有规则默认应用于此区域。
17. --set-default-zone
:设置默认区域
firewall-cmd --set-default-zone=internal
设置新的默认区域为 internal
。所有规则不指定区域时将作用于该区域。
18. --get-active-zones
:查看当前活跃的区域
firewall-cmd --get-active-zones
查看当前正在使用的区域及对应的网络接口。
示例输出:
public
interfaces: eth0
19. --zone
与 --permanent
的配合使用
--zone
与 --permanent
选项通常一起使用。--zone
用于指定规则作用的网络区域,--permanent
用于指定规则是否永久生效。
例如,永久开放 internal
区域的 8080 端口:
firewall-cmd --zone=internal --add-port=8080/tcp --permanent
firewall-cmd --reload
总结
firewall-cmd
是一个非常灵活且强大的工具,用于管理防火墙规则和配置。通过它,你可以:
- 动态添加/删除端口和服务。
- 应用临时或永久的规则。
- 使用复杂的 rich rule 管理更细粒度的防火墙策略。
在操作防火墙时,确保规则配置正确,以避免不必要的服务中断或安全风险。
区域(Zone)讲解
在 firewalld
中,区域(Zone)定义了一组预配置的防火墙规则,这些规则基于网络信任级别来管理流量。每个区域表示一个特定的网络环境或信任级别,决定了哪些流量可以进入或离开该区域中的接口(如网络接口、IP 地址、VLAN 等)。
区域的作用
-
管理不同网络环境的流量控制:
每个网络环境可能具有不同的信任级别,例如家庭网络、工作网络或公共网络。通过为不同的区域分配不同的接口,管理员可以为不同的网络环境配置不同的防火墙规则。 -
允许或限制特定服务和端口:
每个区域可以配置允许哪些服务(例如 HTTP、SSH)或端口可以通过防火墙访问,哪些协议或源地址的流量被接受。 -
简化防火墙配置管理:
通过使用区域,管理员可以轻松地为不同的网络环境应用不同的规则集,而无需为每个接口手动配置防火墙规则。
区域的信任级别
每个区域根据网络的信任级别预先配置了不同的防火墙规则。firewalld
默认提供了几种区域类型,信任级别从最开放到最严格递增,涵盖从完全信任的网络到完全不信任的网络。
以下是常见的区域类型及其信任级别:
-
trusted(完全信任)
- 允许所有传入和传出的流量,不进行任何过滤。适用于完全信任的网络(如本地回环)。
- 示例:实验室设备或安全的专用网络。
-
home(家庭网络)
- 适用于家庭环境,信任级别较高,允许常见服务(如 SSH、DHCP)访问。
- 示例:家庭 Wi-Fi 网络。
-
work(工作网络)
- 用于工作环境,类似于家庭区域,但信任级别稍低,允许的服务较少。
- 示例:办公室内网。
-
internal(内部网络)
- 适用于内部网络,信任级别较高,允许内部网络流量,但对外部连接有限制。
- 示例:企业局域网。
-
public(公共网络)
- 用于不信任的公共网络,默认仅允许基本的传入流量,禁止大部分传出流量。
- 示例:咖啡馆 Wi-Fi、机场 Wi-Fi。
-
external(外部网络)
- 用于外部连接,通常用于路由器或网关,启用网络伪装(NAT)以保护内部网络。
- 示例:边界路由器连接到互联网。
-
dmz(隔离区)
- 适用于放置在网络隔离区的系统,限制外部访问,只允许特定服务。通常用于需要受限外部访问的服务器(如 Web 服务器)。
- 示例:Web、邮件服务器等暴露给外部但要与内部网络隔离的系统。
-
block(阻止所有流量)
- 默认阻止所有传入流量,适用于完全不信任的网络环境。除了允许通过的流量(如回送接口、ping),所有其他请求都会被拒绝。
-
drop(丢弃所有流量)
- 最严格的区域,不回应传入请求,直接丢弃所有外部连接,甚至不发送响应(如
ICMP
请求)。适用于完全不信任的网络环境。
- 最严格的区域,不回应传入请求,直接丢弃所有外部连接,甚至不发送响应(如
示例:区域的使用
1. 查看默认区域
查看当前防火墙的默认区域:
firewall-cmd --get-default-zone
2. 设置接口到特定区域
你可以将一个网络接口(如 eth0
)分配到特定的区域。例如,将 eth0
分配到 public
区域:
firewall-cmd --zone=public --change-interface=eth0 --permanent
firewall-cmd --reload
--zone=public
:指定区域为public
。--change-interface=eth0
:将接口eth0
分配到该区域。--permanent
:使配置永久生效。--reload
:重新加载防火墙以应用更改。
3. 修改区域中的规则
可以为每个区域添加、删除服务或端口。例如,在 public
区域开放 HTTP 服务:
firewall-cmd --zone=public --add-service=http --permanent
firewall-cmd --reload
4. 查看某个区域的规则
列出 public
区域中的所有规则:
firewall-cmd --zone=public --list-all
输出示例:
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dhcpv6-client ssh http
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
解释:
# public (active)
# 这是当前激活的防火墙区域。区域可以定义特定的防火墙规则,适用于不同的网络环境(例如家庭、公共场所)。
# "public" 是一个预定义的防火墙区域,默认情况下更注重安全,适用于不太信任的公共网络。
# target: default
# 防火墙的目标(target)是 "default",这意味着默认情况下,如果没有显式的规则允许或拒绝某个连接,
# 它会遵循区域的默认策略。在 public 区域,这通常是拒绝不明流量。
# icmp-block-inversion: no
# ICMP(Internet Control Message Protocol)是用于网络诊断的协议,如 ping 命令。
# "icmp-block-inversion" 设置为 "no" 表示 ICMP 不会被阻止。若为 "yes",则会阻止 ICMP 请求。
# interfaces: eth0
# 防火墙规则应用于接口 "eth0"。这个网络接口代表服务器的网络连接,通常是网卡的名称。
# 所有进出该接口的流量都由该区域的规则管理。
# sources:
# sources 列为空,意味着没有特定的 IP 源被添加到此区域。默认情况下,该区域应用于所有流量。
# services: dhcpv6-client ssh http
# 允许的服务列表包括:
# - dhcpv6-client: DHCPv6 客户端服务,用于获取 IPv6 地址。
# - ssh: 允许通过端口 22 进行 SSH 连接,便于远程管理服务器。
# - http: 允许通过端口 80 提供 HTTP 服务,通常是网站服务器。
# ports:
# 这里为空,意味着没有特定的端口被手动允许或阻止。允许的服务会自动开放相应的端口。
# protocols:
# 这里为空,意味着没有指定的网络协议(如 TCP、UDP)需要被显式处理。
# masquerade: no
# "masquerade" 是网络地址转换(NAT)的一个功能,用于隐藏内部网络的 IP 地址。
# 在这里设置为 "no",意味着没有启用 IP 地址伪装,流量不会进行 NAT 转换。
# forward-ports:
# 这里为空,意味着没有端口转发配置。端口转发允许将来自一个端口的流量转发到另一个端口或 IP。
# source-ports:
# 这里为空,意味着没有对特定源端口的流量进行任何特别处理。
# icmp-blocks:
# 这里为空,表示没有阻止任何 ICMP 消息类型。
# rich rules:
# "rich rules" 是 firewalld 中的高级规则,可以精确控制网络流量。
# 这里为空,意味着没有定义任何自定义的高级规则。
区域的实际作用场景
- 家用路由器:你可以为家庭网络的接口(如
wlan0
)配置home
区域,以允许常见的家庭服务,同时防止来自不可信设备的流量。 - 工作网络:如果你有多个网络接口,连接到不同的网络环境(如办公室局域网、外部公共网络),可以为局域网接口配置
work
区域,为公共网络接口配置public
区域,以确保不同环境下的流量安全。 - 服务器:当运行一个暴露给外部的 Web 服务器时,服务器通常会分配到
dmz
区域,从而仅允许 HTTP、HTTPS 等必要的流量通过。
总结
- 区域是
firewalld
用于根据网络环境和信任级别分类防火墙规则的机制。 - 每个区域都有一组预定义的规则,决定了可以允许哪些服务、端口或流量。
- 通过将网络接口分配到不同区域,你可以在不同网络环境下灵活应用不同的安全策略,以确保系统安全并简化防火墙管理。