一、基本概念
1.1 防火墙的预定义区域
通过将网络划分成不同的区域,制定出不同区域之间的访问控制策略来控制不同程序区域间传送的数据流。
网络安全模型可以在安装、初次启动和首次建立网络连接时选择初始化。该模型描述了主机所连接的整个网络环境的可信级别,并定义了新连接的处理方式。系统防火墙初始化区域及功能如表所示。
| 区域 | 功能 | |
|---|---|---|
| 阻塞区域(block) | 任何传入的网络数据包都将被阻止 | |
| 工作区域(work) | 信任网络上的其他计算机,不会损害你的计算机 | |
| 家庭区域(home) | 信任网络上的其他计算机,不会损害你的计算机 | |
| 公共区域(public) | 不信任网络上的任何计算机,只选择接受传入的网络连接。Firewalld 的默认区域是 public | |
| 隔离区域(DMZ) | 隔离区域是在内外网络之间增加的一层网络,起到缓冲作用。对于隔离区域,只选择接受传入的网络连接 | |
| 信任区域(trusted) | 所有的网络连接都可以接受 | |
| 丢弃区域(drop) | 任何传入的网络连接都被拒绝 | |
| 内部区域(internal) | 信任网络上的其他计算机,不会损害你的计算机。只选择接受传入的网络连接 | |
| 外部区域(external) | 不信任网络上的其他计算机,不会损害你的计算机。只选择接受传入的网络连接 |
1.2 Firewalld 防火墙配置
作系统管理员可以通过 3 种方式与 firewalld 交互:
- 第一种方式是直接编辑
/etc/firewalld中的配置文件; - 第二种方式是使用
firewall-config图形化工具; - 第三种方式是使用
firewall-cmd命令行工具。
使用 firewall-cmd 命令时,只是在运行时生效,若要重新启动或重新加载 firewalld 服务单元后永久生效,需要指定 permanent 参数。Firewall-cmd 命令参数及作用如表所示。
| 参数 | 作用 |
|---|---|
| –set-default-zone=<区域名称> | 设置默认的区域,使其永久生效 |
| –get-zones | 显示可用的区域 |
| –get-services | 显示预先定义的服务 |
| –get-active-zones | 显示当前正在使用的区域与网卡名称 |
| –add-source= | 将源自此 IP 或子网的流量导向指定的区域 |
| –remove-source= | 不再将源自此 IP 或子网的流量导向某个指定区域 |
| –add-interface=<网卡名称> | 将源自该网卡的所有流量都导向某个指定区域 |
| –change-interface=<网卡名称> | 将某个网卡与区域进行关联 |
| –list-all | 显示当前区域的网卡配置参数、资源、端口以及服务等信息 |
| –list-all-zones | 显示所有区域的网卡配置参数、资源、端口以及服务等信息 |
| –add-service=<服务名> | 设置默认区域允许该服务的流量 |
| –add-port=<端口号/协议> | 设置默认区域允许该端口的流量 |
| –remove-service=<服务名> | 设置默认区域不再允许该服务的流量 |
| –remove-port=<端口号/协议> | 设置默认区域不再允许该端口的流量 |
| –reload | 让“永久生效”的配置规则立即生效,并覆盖当前的配置规则 |
1.3预定义服务
firewalld上有一些预定义服务,这些预定义服务可帮助你识别要配置的特定网络服务。例如,可指定预构建的SSH服务来配置正确的端口和协议,而无须研究SSH服务的相关端口。初始防火墙区域配置中使用的预定义服务如表所示。
| 服务名称 | 配置内容 |
|---|---|
| SSH | 本地 SSH 服务器。到 22/tcp 的流量 |
| Dhcpv 6-client | 本地 DHCPv 6 客户端。到 fe 80::/64 IPv 6 网络中 546/udp 的流量 |
| Ipp-client | 本地 IPP 打印。到 631/udp 的流量 |
| Samba-client | 本地Windows文件和打印共享客户端。到137/udp和138/udp的流量 |
| mDNS | 多播DNS(mDNS)本地链路名称解析。到5353/udp指向224.0.0.251(IPv4)或ff02::fb(IPv6)多播地址的流量 |
1.4 管理富规则
firewalld富规则为管理员提供了一种表达性语言,通过这种语言可表达firewalld的基本语法中未涵盖的自定义防火墙规则;支持配置更复杂的防火墙配置。规则中几乎每个单一元素都能够以optionvalue形式来采用附加参数。富规则参数如表所示。
| 参数 |
内容 |
|---|---|
--add-rich-rule='<RULE>' |
向指定区域中添加<RULE>,如果未指定区域,则向默认区域中添加 |
--remove-rich-rule='<RULE>' |
从指定区域中删除<RULE>,如果未指定区域,则从默认区域中删除 |
--query-rich-rule='<RULE>' |
查询指定区域中删除的<RULE>,如果未指定区域,则从默认区域中查询 |
--list-rich-rules |
输出指定区域的所有富规则,如果未指定区域,则从默认区域富规则端口转发 |
富规则基本语法:
rule
[source]
[destination]
service|port|protocol|icmp-block|masquerade|forward-port
[log]
[audit]
[accept|reject|drop]
1.5 端口转发
firewalld支持两种类型的网络地址转换(Network Address Translation,NAT):伪装和端口转发。可以在基本级别使用常规firewall-cmd规则来同时配置两种网络地址转换,更高级的转发配置可以使用富规则来完成。
- 第一种 NAT 形式是伪装,通过伪装,系统会将非直接寻址到自身的包转发到指定接收方,同时将通过的包的源地址更改为其自己的公共 IP 地址。
- 第二种 NAT 形式是端口转发,通过端口转发,指向单个端口的流量将转发到相同计算机上的不同端口,或者转发到不同计算机上的端口。
二、firewalld 防火墙管理实践
2.1 查询系统当前防火墙信息 :
firewall-cmd --list-all

关键配置项解释
区域信息:
public (active):表示当前使用的是 public 区域,且该区域是激活状态。
区域(zone)是 firewalld 的核心概念,用于根据网络环境的信任程度划分流量(如 public、private、trusted 等)。
基础配置:
target: default:防火墙默认策略(接受、拒绝或丢弃)。
icmp-block-inversion: no:是否反转 ICMP 阻塞规则。
接口与源地址:
interfaces: eth0:该区域关联的网络接口(网卡)。
sources::按源 IP 地址或网段划分的信任源。
服务与端口:
services: http https ssh:允许访问的预定义服务(对应 /usr/lib/firewalld/services/ 目录下的配置文件)。
ports: 8080/tcp 4430-4440/udp:手动开放的端口或端口范围(协议可为 TCP 或 UDP)。
高级功能:
masquerade: no:是否启用 IP 伪装(NAT),通常用于内网共享公网 IP。
forward-ports::端口转发规则(如将外部端口转发到内部服务器)。
rich rules::富规则,用于定义更复杂的策略(如按源 IP 限制访问)。
2.2查询预定义firewalld服务
firewall-cmd --get-services

2.3 查看系统存在的防火墙区域
firewall-cmd --get-zones

2.4查看firewalld服务当前所使用的区域
firewall-cmd --get-default-zone

2.5将firewalld防火墙服务的当前默认区域设置为public
firewall-cmd --set-default-zone=public

2.6查询ens33网卡在firewalld服务中的区域
firewall-cmd --get-zone-of-interface=ens33

2.7将firewalld防火墙服务中ens33网卡的默认区域修改为external
firewall-cmd --permanent --zone=external
2.8 查询在public区域中的ssh与https服务请求是否被允许
firewall-cmd --zone=public --query-service=ssh
firewall-cmd --zone=public --query-service=https

2.9 将firewalld防火墙服务中https服务的请求流量设置为永久允许
firewall-cmd --permanent --zone=public --add-service=https
# 重新加载防火墙配置
firewall-cmd --reload

2.10 将firewalld防火墙服务中8899/tcp端口的请求流量设置为允许放行
firewall-cmd --zone=public --permanent --add-port=8899/tcp
firewall-cmd --reload
firewall-cmd --list-ports

三、富规则和端口转发
3.1 防火墙基本规则
在firewalld防火墙服务中配置一条富规则,拒绝所有来自192.168. 10.0/24网段的用户访问本机ssh服务
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.10.0/24" service name="ssh" reject"
firewall-cmd --reload
# 查询配置成功的富规则
firewall-cmd --list-rich-rules

3.2 端口转发防火墙规则
在 server 上配置防火墙,将端口 443/tcp 转发到 22/tcp
firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address=192.168.10.0/24 forward-port port=443 protocol=tcp to-port=22"
firewall-cmd --reload

配置成功后,可以使用另外一台虚拟机,使用 443 端口登录 ssh
ssh -p443 root@192.168.161.100
3.3 流量转发防火墙规则
将来自work区域中192.168.0.0/24且传入端口80/tcp的流量转发到防火墙计算机自身的端口8080/tcp。
firewall-cmd --permanent --zone=work --add-rich-rule='rule family=ipv4 source address=192.168.0.0/24 forward-port port=80 protocol=tcp to-port=8080'

3.4 http和https防火墙规则
仅允许某个网络主机访问http和https服务
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=172.31.72.0/24 service name=http accept'
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=172.31.72.0/24 service name=https accept'

3.5 ssh防火墙规则
ssh远程连接服务默认使用22端口提供远程连接,在防火墙规则中添加ssh服务使用2220端口,并修改ssh服务配置文件sshd_config禁止22端口访问。
grep -i port /etc/ssh/sshd_config
# 将原来的22端口改为2220端口,保存退出
#Port 22
Port 2220
# 重启ssh服务
systemctl restart sshd
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=172.31.72.0/24 port port=2220 protocol=tcp accept'

3.6 查看防火墙日志
使用客户端登录服务器,查看/var/log/secure文件,检查sshd日志。
tail -f /var/log/secure

四、沙场点兵
- 将firewalld的默认区域设置为DMZ区域。
- 将firewalld防火墙服务中ens33网卡的默认区域修改为block,使其重启后再生效。
- 将firewalld防火墙服务中dns和nfs服务的请求流量设置为永久允许放行,并使其立即生效。
- 将firewalld防火墙服务中6880端口的请求流量设置为允许放行。
评论