主题
Linux防火墙配置详解
课程介绍
接下来我们学习防火墙配置。firewalld是Rocky Linux 9的默认防火墙工具,基于zone(区域)的概念管理。可以用firewall-cmd命令添加端口规则、服务规则,比如firewall-cmd --add-port=80/tcp --permanent开放80端口。添加规则后要--reload重载配置。防火墙用于控制进出网络流量,保护系统安全,配置不当会影响服务访问,要小心操作。
1. 防火墙概述
什么是防火墙
防火墙是一种网络安全设备或软件,用于监控和控制进出网络的流量,根据预设的安全规则允许或拒绝数据包通过。
防火墙的作用
- 保护网络安全:阻止未授权的网络访问
- 控制流量:管理进出网络的数据包
- 防御攻击:防止恶意攻击和入侵
- 日志记录:记录网络访问情况,便于审计和分析
- 隔离网络:将不同安全级别的网络隔离开
Linux中的防火墙解决方案
1. firewalld
- Rocky Linux 9的默认防火墙管理工具
- 基于动态区域(zone)的概念
- 支持网络区域隔离
- 提供命令行工具和图形界面
- 适合现代网络环境
2. firewalld
- 传统的Linux防火墙工具
- 基于规则链的概念
- 功能强大但配置复杂
- 适合需要精细控制的场景
本课程主要讲解firewalld的使用。
2. firewalld基础
firewalld的基本概念
1. Zone(区域)
Zone是firewalld的核心概念,它定义了不同网络环境的安全级别和规则集。每个网络接口可以分配到一个zone,firewalld会根据zone的规则来处理该接口上的流量。
2. Service(服务)
Service是预定义的端口集合,代表一种网络服务(如HTTP、SSH等)。使用service可以简化防火墙规则的配置。
3. Port(端口)
Port是网络通信的入口,firewalld可以根据端口号允许或拒绝流量。
4. Rule(规则)
Rule是firewalld根据zone、service、port等条件定义的安全策略。
firewalld的默认Zone
| Zone名称 | 安全级别 | 描述 |
|---|---|---|
| trusted | 最高 | 允许所有流量 |
| home | 高 | 适合家庭网络,允许常见服务 |
| internal | 高 | 适合内部网络,允许常见服务 |
| work | 中 | 适合工作网络,允许常见服务但限制一些娱乐服务 |
| public | 中 | 适合公共网络,只允许必要的服务 |
| external | 低 | 适合外部网络,启用伪装(NAT) |
| dmz | 低 | 适合DMZ网络,只允许特定服务 |
| block | 最低 | 拒绝所有传入流量,只允许传出流量 |
| drop | 最低 | 丢弃所有传入流量,不发送任何响应 |
3. firewalld服务管理
查看firewalld服务状态
bash
# 查看firewalld服务状态
sudo systemctl status firewalld
# 查看firewalld是否正在运行
sudo firewall-cmd --state启动、停止和重启firewalld服务
bash
# 启动firewalld服务
sudo systemctl start firewalld
# 停止firewalld服务
sudo systemctl stop firewalld
# 重启firewalld服务
sudo systemctl restart firewalld设置firewalld服务开机自启
bash
# 设置firewalld开机自启
sudo systemctl enable firewalld
# 禁用firewalld开机自启
sudo systemctl disable firewalld4. firewalld Zone管理
查看当前zone配置
bash
# 查看所有可用的zone
sudo firewall-cmd --get-zones
# 查看当前默认zone
sudo firewall-cmd --get-default-zone
# 查看每个网络接口所属的zone
sudo firewall-cmd --get-active-zones
# 查看指定zone的详细配置
sudo firewall-cmd --zone=public --list-all
# 查看所有zone的详细配置
sudo firewall-cmd --list-all-zones修改默认zone
bash
# 设置默认zone为public
sudo firewall-cmd --set-default-zone=public为网络接口分配zone
bash
# 将eth0接口分配到public zone
sudo firewall-cmd --zone=public --change-interface=eth0
# 验证接口分配
sudo firewall-cmd --get-active-zones创建自定义zone
bash
# 创建一个名为myzone的自定义zone
sudo firewall-cmd --new-zone=myzone --permanent
# 重载firewalld配置使新zone生效
sudo firewall-cmd --reload
# 查看新创建的zone
sudo firewall-cmd --get-zones删除自定义zone
bash
# 删除名为myzone的自定义zone
sudo firewall-cmd --delete-zone=myzone --permanent
# 重载firewalld配置
sudo firewall-cmd --reload5. 管理防火墙规则
添加和删除端口规则
1. 添加端口规则
bash
# 允许TCP协议的80端口通过(临时生效,重启firewalld后失效)
sudo firewall-cmd --zone=public --add-port=80/tcp
# 允许TCP协议的80端口通过(永久生效)
sudo firewall-cmd --zone=public --add-port=80/tcp --permanent
# 允许UDP协议的53端口通过
sudo firewall-cmd --zone=public --add-port=53/udp --permanent
# 允许TCP协议的8080-8090端口范围通过
sudo firewall-cmd --zone=public --add-port=8080-8090/tcp --permanent2. 删除端口规则
bash
# 删除TCP协议的80端口规则(临时生效)
sudo firewall-cmd --zone=public --remove-port=80/tcp
# 删除TCP协议的80端口规则(永久生效)
sudo firewall-cmd --zone=public --remove-port=80/tcp --permanent3. 查看端口规则
bash
# 查看public zone中已添加的端口规则
sudo firewall-cmd --zone=public --list-ports
# 查看public zone中已添加的永久端口规则
sudo firewall-cmd --zone=public --list-ports --permanent管理防火墙服务
1. 查看可用服务
bash
# 查看firewalld支持的所有服务
sudo firewall-cmd --get-services2. 添加服务规则
bash
# 允许http服务通过(临时生效)
sudo firewall-cmd --zone=public --add-service=http
# 允许http服务通过(永久生效)
sudo firewall-cmd --zone=public --add-service=http --permanent
# 允许https服务通过(永久生效)
sudo firewall-cmd --zone=public --add-service=https --permanent
# 允许ssh服务通过(永久生效)
sudo firewall-cmd --zone=public --add-service=ssh --permanent3. 删除服务规则
bash
# 删除http服务规则(临时生效)
sudo firewall-cmd --zone=public --remove-service=http
# 删除http服务规则(永久生效)
sudo firewall-cmd --zone=public --remove-service=http --permanent4. 查看服务规则
bash
# 查看public zone中已添加的服务规则
sudo firewall-cmd --zone=public --list-services
# 查看public zone中已添加的永久服务规则
sudo firewall-cmd --zone=public --list-services --permanent重载firewalld配置
当添加或删除永久规则后,需要重载firewalld配置才能使规则生效:
bash
# 重载firewalld配置
sudo firewall-cmd --reload6. 防火墙高级配置
端口转发
端口转发允许将到达一个端口的流量转发到另一个端口或另一台主机。
1. 启用IP伪装
bash
# 在external zone启用IP伪装
sudo firewall-cmd --zone=external --add-masquerade --permanent2. 配置端口转发
bash
# 将80端口的流量转发到8080端口
sudo firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080 --permanent
# 将80端口的流量转发到另一台主机的8080端口
sudo firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toaddr=192.168.1.100:toport=8080 --permanent3. 删除端口转发
bash
sudo firewall-cmd --zone=public --remove-forward-port=port=80:proto=tcp:toport=8080 --permanent富规则(Rich Rules)
富规则是firewalld提供的一种更灵活的规则配置方式,支持更复杂的条件和动作。
1. 添加富规则
bash
# 允许来自192.168.1.0/24网段的TCP 22端口访问
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="22" accept' --permanent
# 拒绝来自192.168.2.100的所有访问
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.2.100" reject' --permanent2. 查看富规则
bash
sudo firewall-cmd --zone=public --list-rich-rules --permanent3. 删除富规则
bash
sudo firewall-cmd --zone=public --remove-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="22" accept' --permanent锁定防火墙配置
锁定防火墙配置可以防止意外修改:
bash
# 锁定防火墙配置
sudo firewall-cmd --lock
# 解锁防火墙配置
sudo firewall-cmd --unlock7. 防火墙规则的应用顺序
规则优先级
firewalld按照以下顺序应用规则:
- 富规则(Rich Rules)
- 端口转发规则
- 服务规则
- 端口规则
规则匹配逻辑
- 当数据包匹配到一条规则时,firewalld会执行该规则的动作(允许、拒绝或丢弃)
- 如果没有匹配到任何规则,firewalld会执行该zone的默认动作
8. 常见防火墙配置场景
场景1:允许Web服务访问
bash
# 允许http服务
sudo firewall-cmd --zone=public --add-service=http --permanent
# 允许https服务
sudo firewall-cmd --zone=public --add-service=https --permanent
# 重载配置
sudo firewall-cmd --reload场景2:允许SSH服务从特定IP访问
bash
# 删除默认的ssh服务规则(如果存在)
sudo firewall-cmd --zone=public --remove-service=ssh --permanent
# 添加富规则,只允许192.168.1.100访问ssh
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.100" service name="ssh" accept' --permanent
# 重载配置
sudo firewall-cmd --reload场景3:允许特定端口访问
bash
# 允许TCP 3306端口(MySQL)
sudo firewall-cmd --zone=public --add-port=3306/tcp --permanent
# 允许TCP 6379端口(Redis)
sudo firewall-cmd --zone=public --add-port=6379/tcp --permanent
# 重载配置
sudo firewall-cmd --reload场景4:配置内部和外部网络隔离
bash
# 将eth0接口分配到internal zone
sudo firewall-cmd --zone=internal --change-interface=eth0 --permanent
# 将eth1接口分配到external zone
sudo firewall-cmd --zone=external --change-interface=eth1 --permanent
# 在external zone启用IP伪装
sudo firewall-cmd --zone=external --add-masquerade --permanent
# 重载配置
sudo firewall-cmd --reload9. 防火墙状态和日志查看
查看firewalld日志
bash
# 查看firewalld日志
sudo journalctl -u firewalld
# 实时查看firewalld日志
sudo journalctl -u firewalld -f查看firewalld规则
虽然使用firewalld管理防火墙,但最终还是会转换为firewalld规则:
bash
# 查看nat表规则
sudo firewalld -t nat -L -n
# 查看filter表规则
sudo firewalld -t filter -L -n使用firewall-cmd查看详细状态
bash
# 查看firewalld的详细状态
sudo firewall-cmd --state
# 查看firewalld的版本
sudo firewall-cmd --version10. 常见防火墙问题与解决方案
1. 防火墙规则不生效
可能原因:
- 规则没有设置为永久生效
- 没有重载firewalld配置
- 规则添加到了错误的zone
- 网络接口分配到了错误的zone
解决方案:
- 添加规则时使用
--permanent选项 - 添加规则后执行
firewall-cmd --reload - 检查规则所在的zone是否正确
- 检查网络接口的zone分配
2. 无法访问特定服务
可能原因:
- 防火墙没有允许该服务或端口
- 服务没有在监听正确的端口
- 网络连接问题
解决方案:
- 检查防火墙是否允许该服务或端口
- 使用
ss -tuln查看服务是否在监听 - 检查网络连接是否正常
3. firewalld服务无法启动
可能原因:
- 配置文件损坏
- 与其他防火墙服务冲突
- 权限问题
解决方案:
- 检查配置文件是否正确
- 停止并禁用其他防火墙服务(如firewalld)
- 检查firewalld配置文件的权限
4. 如何临时关闭防火墙进行测试
bash
# 临时停止firewalld服务
sudo systemctl stop firewalld
# 测试完成后重新启动
sudo systemctl start firewalld11. 命令速查
| 命令 | 功能 | 示例 |
|---|---|---|
firewall-cmd --state | 查看firewalld状态 | firewall-cmd --state |
firewall-cmd --get-zones | 查看所有可用zone | firewall-cmd --get-zones |
firewall-cmd --get-default-zone | 查看默认zone | firewall-cmd --get-default-zone |
firewall-cmd --set-default-zone=public | 设置默认zone | firewall-cmd --set-default-zone=public |
firewall-cmd --add-service=http --permanent | 添加服务规则 | firewall-cmd --add-service=http --permanent |
firewall-cmd --add-port=80/tcp --permanent | 添加端口规则 | firewall-cmd --add-port=80/tcp --permanent |
firewall-cmd --remove-service=http --permanent | 删除服务规则 | firewall-cmd --remove-service=http --permanent |
firewall-cmd --reload | 重载配置 | firewall-cmd --reload |
firewall-cmd --list-all | 查看所有规则 | firewall-cmd --list-all |
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" accept' --permanent | 添加富规则 | firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" accept' --permanent |
课程总结
这节课学了firewalld防火墙,记住这几点:
firewalld是什么
- Rocky Linux 9默认的防火墙工具
- 用zone(区域)来管理不同的安全策略
- 每个zone有不同的安全级别
常用操作
- 看状态:
firewall-cmd --state - 看规则:
firewall-cmd --list-all - 开端口:
firewall-cmd --permanent --add-port=80/tcp - 开服务:
firewall-cmd --permanent --add-service=http - 改完要重载:
firewall-cmd --reload
重要提醒
- 一定要加
--permanent,不然重启就没了 - 改完必须
--reload才能生效 - 防火墙很重要,别随便关
防火墙是保护系统安全的第一道防线,学会配置很有用!
课后练习
练习1:基础操作(必做)
- 查看防火墙状态:
firewall-cmd --state - 查看当前所有规则:
firewall-cmd --list-all - 允许SSH服务通过(永久生效):
firewall-cmd --permanent --add-service=ssh - 重载配置使规则生效:
firewall-cmd --reload
💡 提示:SSH是远程登录用的,一定要开,不然可能连不上服务器
练习2:开放Web服务
- 允许HTTP(80端口):
firewall-cmd --permanent --add-service=http - 允许HTTPS(443端口):
firewall-cmd --permanent --add-service=https - 重载配置:
firewall-cmd --reload - 验证规则是否生效:
firewall-cmd --list-services
练习3:开放自定义端口
- 允许8080端口(常用的应用端口):
firewall-cmd --permanent --add-port=8080/tcp - 重载配置:
firewall-cmd --reload - 查看已开放的端口:
firewall-cmd --list-ports
练习4:删除规则
- 删除刚才加的8080端口规则:
firewall-cmd --permanent --remove-port=8080/tcp - 重载配置:
firewall-cmd --reload - 确认规则已删除:
firewall-cmd --list-ports