1.网络区域
trusted(信任区域) 可接收所有网络连接
public(公共区域) 除非与传出流量相关,或与 ssh 或dhcpv6-client预定义服务匹配,否则拒绝流量传入,在公共区域内,不能相信网络内的其他计算机不会对计算机造成危害,只能接收经过选择的连接。并且,该区域是新添加网络接口的默认区域
work(工作区域) 除非与传出流量相关,或与 ssh、ipp-client、dhcpv6-client 预定义服务匹配,否则拒绝流量传入,用于工作区。相信网络内的其他计算机不会危害计算机,仅接收经过选择的连接
home(家庭区域) 除非与传出流量相关,或与 ssh、ipp-client、mdns、samba-client、dhcpv6-client 预定义服务匹配,否则拒绝流量传入,用于家庭网络。信任网络内的其他计算机不会危害计算机,仅接收经过选择的连接
internal(内部区域) 除非与传出流量相关,或与 ssh、ipp-client、mdns、samba-client、dhcpv6-client 预定义服务匹配,否则拒绝流量传入,用于内部网络。信任网络内的其他计算机不会危害计算机,仅接收经过选择的连接
external(外部区域) 除非与传出流量相关,或与 ssh 预定义服务匹配,否则拒绝流量传入。通过此区域转发的 IPv4 传出流量将进行地址伪装,可用于为路由器启用了伪装功能的外部网络
dmz(隔离区域也称为非军事区域)除非与传出的流量相关,或与 ssh 预定义服务匹配,否则拒绝流量传入
block(限制区域) 除非与传出流量相关,否则拒绝所有传入流量
drop(丢弃区域) 除非与传出流量相关,否则丢弃所有传入流量,并且不产生包含 ICMP(Internet Control Message Protocol,互联网控制报文协议)的错误响应
2.firewalld-cmd命令
(1).firewalld服务管理
systemctl start firewalld #启动firewalld
systemctl enable firewalld #设置firewalld为开机自启动
systemctl status firewalld #查看firewalld服务状态
firewall-cmd --state #查看firewalld服务状态
systemctl stop firewalld #停止firewalld
systemctl disable firewalld #设置firewalld开机不自启动
(2).获取预定义信息
firewall-cmd --get-zones #显示预定义的区域
firewall-cmd --get-service #显示预定义的服务
firewall-cmd --get-service | tr ' ' '\n' #显示预定义的服务以空格做换行操作
firewall-cmd --get-icmptypes | tr ' ' '\n' #显示预定义的ICMP类型
(3).区域管理 --get
firewall-cmd --get-default-zone #显示当前系统中的默认区域
firewall-cmd --list-all #显示默认区域的所有规则
firewall-cmd --get-zone-of-interface=ens33 #显示网络接口ens33对应区域
firewall-cmd --zone=internal --change-interface=ens33 #将网络接口ens33对应区域为internal区域
firewall-cmd --zone=internal --list-interfaces
firewall-cmd --get-zone-of-interface=ens33
firewall-cmd --get-active-zones #显示所有激活区域
(4).服务管理 /usr/lib/firewalld/services XML文件
firewall-cmd --list-services #显示默认区域内允许访问的所有服务
firewall-cmd --add-service=http #设置默认区域允许访问http服务
firewall-cmd --add-service=https #设置默认区域允许访问https服务
firewall-cmd --list-services #查看当前默认区域中已放行的 firewalld 预定义服务
firewall-cmd --zone=internal --add-service=mysql #设置internal1区域允许访问mysql服务
firewall-cmd --zone=internal --remove-service=samba-client #设置internal1区域不允许访问samba-client服务
firewall-cmd --zone=internal --list-services #显示internal区域内允许访问的所有服务
(5).端口管理
firewall-cmd --zone=internal --add-port=443/tcp #在internal区域打开443/tcp端口
firewall-cmd --zone=internal --remove-port=443/tcp #在internal区域禁止443/tcp端口
(6).两种配置模式
Runtime mode:运行时模式
Permanent mode:永久模式
--reload:重新加载防火墙规则并保持状态信息,也就是将永久配置应用为运行时模式。
--permanent:带有此选项的命令用于设置永久性规则,这些规则只有在重新启动firewalld 或重新加载防火墙规则时才会生效;若不带有此选项,表示用于设置运行时规则。
--runtime-to-permanent:将当前的运行时配置写入规则配置文件中,使之成为永久性配置。
实验

1. 禁止所有主机 ping 服务器(阻断 ICMP echo-request)
bash
# 临时生效(internal 区域)
firewall-cmd --zone=internal --add-icmp-block=echo-request
# 永久生效
firewall-cmd --zone=internal --add-icmp-block=echo-request --permanent
firewall-cmd --reload
2. 仅允许 192.168.8.130 访问 SSH 服务
bash
# 先移除 internal 区域默认放行的 SSH(避免冲突)
firewall-cmd --zone=internal --remove-service=ssh
firewall-cmd --permanent --zone=internal --remove-service=ssh
# 添加富规则(仅允许指定IP访问SSH,作用于internal区域)
firewall-cmd --zone=internal --add-rich-rule='rule family="ipv4" source address="192.168.8.130" port protocol="tcp" port="22" accept'
firewall-cmd --permanent --zone=internal --add-rich-rule='rule family="ipv4" source address="192.168.8.130" port protocol="tcp" port="22" accept'
firewall-cmd --reload
3. 允许所有主机访问 Apache 服务
bash
# 临时生效(internal 区域)
firewall-cmd --zone=internal --add-service=http
# 永久生效
firewall-cmd --permanent --zone=internal --add-service=http
firewall-cmd --reload
验证 internal 区域的规则(确认配置生效)
bash
# 查看 internal 区域所有放行规则(含服务、富规则、ICMP阻断等)
firewall-cmd --zone=internal --list-all
输出中应能看到:
icmp-blocks: echo-request(ping 已阻断);rich rules: rule family="ipv4" source address="192.168.8.130" port port="22" protocol="tcp" accept(SSH 仅允许指定IP);services: http(Apache 已放行)。
可选优化(简化后续操作)
若后续所有规则都针对 internal 区域,可将其设为默认区域,避免每次加 --zone=internal:
bash
# 永久设置默认区域为 internal
firewall-cmd --permanent --set-default-zone=internal
firewall-cmd --reload
# 验证默认区域
firewall-cmd --get-default-zone # 输出 internal