AlmaLinux 防火墙配置与管理
本指南详细介绍 AlmaLinux 系统中防火墙的配置、管理和优化方法,帮助您构建安全的网络防护体系。
Firewalld 防火墙基础
Firewalld 是 AlmaLinux 的默认防火墙管理工具,提供动态防火墙管理和区域概念。
基本概念
区域 (Zones)
bash
# 查看所有可用区域
sudo firewall-cmd --get-zones
# 常用区域说明
public # 公共区域 (默认)
trusted # 信任区域 (允许所有流量)
home # 家庭区域 (局域网环境)
work # 工作区域 (办公网络)
internal # 内部区域 (内部网络)
external # 外部区域 (路由/NAT)
dmz # 非军事区 (DMZ网络)
block # 阻止区域 (拒绝所有)
drop # 丢弃区域 (丢弃所有)
服务与端口
bash
# 查看预定义服务
sudo firewall-cmd --get-services
# 查看当前活动区域
sudo firewall-cmd --get-active-zones
# 查看默认区域
sudo firewall-cmd --get-default-zone
防火墙状态管理
基本状态操作
bash
# 查看防火墙状态
sudo firewall-cmd --state
# 启动防火墙
sudo systemctl start firewalld
# 停止防火墙
sudo systemctl stop firewalld
# 重启防火墙
sudo systemctl restart firewalld
# 开机自启
sudo systemctl enable firewalld
# 禁用开机自启
sudo systemctl disable firewalld
配置重载
bash
# 重载配置 (保持连接)
sudo firewall-cmd --reload
# 完全重启 (断开连接)
sudo firewall-cmd --complete-reload
# 检查配置语法
sudo firewall-cmd --check-config
区域管理
区域配置
查看区域信息
bash
# 查看指定区域配置
sudo firewall-cmd --zone=public --list-all
# 查看所有区域配置
sudo firewall-cmd --list-all-zones
# 查看区域详细信息
sudo firewall-cmd --zone=public --list-all-rich-rules
设置默认区域
bash
# 设置默认区域
sudo firewall-cmd --set-default-zone=home
# 临时切换区域
sudo firewall-cmd --zone=work --change-interface=eth0
# 永久绑定接口到区域
sudo firewall-cmd --permanent --zone=internal --change-interface=eth1
sudo firewall-cmd --reload
接口管理
网络接口操作
bash
# 查看接口所属区域
sudo firewall-cmd --get-zone-of-interface=eth0
# 添加接口到区域
sudo firewall-cmd --zone=trusted --add-interface=eth1
# 移除接口
sudo firewall-cmd --zone=trusted --remove-interface=eth1
# 永久配置接口
sudo firewall-cmd --permanent --zone=home --add-interface=eth0
服务管理
预定义服务
服务操作
bash
# 允许HTTP服务
sudo firewall-cmd --add-service=http
# 允许HTTPS服务
sudo firewall-cmd --add-service=https
# 允许SSH服务
sudo firewall-cmd --add-service=ssh
# 移除服务
sudo firewall-cmd --remove-service=http
# 永久配置
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
常用服务配置
bash
# Web服务器配置
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
# 邮件服务器配置
sudo firewall-cmd --permanent --add-service=smtp
sudo firewall-cmd --permanent --add-service=pop3
sudo firewall-cmd --permanent --add-service=imap
# 数据库服务配置
sudo firewall-cmd --permanent --add-service=mysql
sudo firewall-cmd --permanent --add-service=postgresql
# DNS服务配置
sudo firewall-cmd --permanent --add-service=dns
# 文件共享服务
sudo firewall-cmd --permanent --add-service=samba
sudo firewall-cmd --permanent --add-service=nfs
自定义服务
创建自定义服务
bash
# 创建服务定义文件
sudo vim /etc/firewalld/services/myapp.xml
xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>MyApp</short>
<description>My Custom Application</description>
<port protocol="tcp" port="8080"/>
<port protocol="udp" port="8081"/>
</service>
bash
# 重载服务定义
sudo firewall-cmd --reload
# 使用自定义服务
sudo firewall-cmd --permanent --add-service=myapp
端口管理
基本端口操作
开放端口
bash
# 开放单个TCP端口
sudo firewall-cmd --add-port=80/tcp
# 开放UDP端口
sudo firewall-cmd --add-port=53/udp
# 开放端口范围
sudo firewall-cmd --add-port=8000-8010/tcp
# 永久开放端口
sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --reload
关闭端口
bash
# 关闭端口
sudo firewall-cmd --remove-port=80/tcp
# 永久关闭端口
sudo firewall-cmd --permanent --remove-port=80/tcp
sudo firewall-cmd --reload
端口转发
端口重定向
bash
# 本地端口转发
sudo firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080
# 转发到其他主机
sudo firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.1.100
# 转发到其他主机和端口
sudo firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.1.100:toport=8080
# 永久配置转发
sudo firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toport=8080
启用IP转发
bash
# 临时启用IP转发
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
# 永久启用IP转发
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
# 在防火墙中启用伪装
sudo firewall-cmd --add-masquerade
sudo firewall-cmd --permanent --add-masquerade
富规则 (Rich Rules)
高级规则配置
基于源地址的规则
bash
# 允许特定IP访问SSH
sudo firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.100" service name="ssh" accept'
# 拒绝特定网段访问
sudo firewall-cmd --add-rich-rule='rule family="ipv4" source address="10.0.0.0/8" reject'
# 限制特定IP的端口访问
sudo firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="80" accept'
基于目标的规则
bash
# 限制到特定目标的流量
sudo firewall-cmd --add-rich-rule='rule family="ipv4" destination address="192.168.1.200" port protocol="tcp" port="22" drop'
# 允许到特定服务的流量
sudo firewall-cmd --add-rich-rule='rule family="ipv4" destination address="192.168.1.100" service name="http" accept'
日志记录规则
bash
# 记录被拒绝的连接
sudo firewall-cmd --add-rich-rule='rule family="ipv4" source address="0.0.0.0/0" port protocol="tcp" port="22" log prefix="SSH-Denied: " level="info" limit value="10/m" reject'
# 记录特定服务访问
sudo firewall-cmd --add-rich-rule='rule family="ipv4" service name="http" log prefix="HTTP-Access: " level="info" accept'
限速规则
连接限制
bash
# 限制每分钟连接数
sudo firewall-cmd --add-rich-rule='rule family="ipv4" source address="0.0.0.0/0" service name="ssh" log prefix="SSH-Limit: " level="info" limit value="3/m" accept'
# 限制并发连接数
sudo firewall-cmd --add-rich-rule='rule family="ipv4" service name="http" limit value="100/s" accept'
安全策略配置
默认策略
拒绝所有策略
bash
# 设置为drop区域 (丢弃所有)
sudo firewall-cmd --set-default-zone=drop
# 只允许必要服务
sudo firewall-cmd --permanent --zone=drop --add-service=ssh
sudo firewall-cmd --permanent --zone=drop --add-service=http
sudo firewall-cmd --permanent --zone=drop --add-service=https
白名单策略
bash
# 创建严格的public区域配置
sudo firewall-cmd --permanent --zone=public --remove-service=dhcpv6-client
sudo firewall-cmd --permanent --zone=public --remove-service=ssh
# 只允许特定IP访问SSH
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="管理IP" service name="ssh" accept'
防护策略
DDoS防护
bash
# 限制同一IP的连接频率
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="0.0.0.0/0" port protocol="tcp" port="80" limit value="20/s" accept'
# 配置连接状态跟踪
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="0.0.0.0/0" port protocol="tcp" port="80" accept' --timeout=300
暴力破解防护
bash
# 安装fail2ban
sudo dnf install fail2ban
# 配置fail2ban与firewalld协作
sudo vim /etc/fail2ban/jail.local
ini
[DEFAULT]
banaction = firewallcmd-ipset
banaction_allports = firewallcmd-ipset
[sshd]
enabled = true
port = ssh
logpath = /var/log/secure
maxretry = 3
bantime = 3600
监控和日志
流量监控
连接监控
bash
# 查看当前连接
sudo ss -tuln
# 监控防火墙日志
sudo journalctl -u firewalld -f
# 查看内核防火墙日志
sudo dmesg | grep -i firewall
规则统计
bash
# 查看iptables规则统计
sudo iptables -L -n -v
# 查看ipset统计
sudo ipset list
# 查看conntrack连接跟踪
sudo cat /proc/net/nf_conntrack | wc -l
日志配置
启用日志记录
bash
# 配置内核日志
echo 'net.netfilter.nf_log_all_netns = 1' | sudo tee -a /etc/sysctl.conf
# 配置rsyslog
sudo vim /etc/rsyslog.conf
bash
# 添加防火墙日志配置
kern.warning /var/log/firewall.log
日志分析
bash
# 分析访问日志
sudo grep "HTTP-Access" /var/log/messages
# 分析拒绝日志
sudo grep "DPT=" /var/log/messages
# 统计访问最多的IP
sudo awk '/DPT=80/ {print $12}' /var/log/messages | sort | uniq -c | sort -nr
性能优化
规则优化
规则顺序优化
bash
# 将常用规则放在前面
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="局域网IP段" accept' --priority=1
# 使用ipset提高性能
sudo firewall-cmd --permanent --new-ipset=whitelist --type=hash:net
sudo firewall-cmd --permanent --ipset=whitelist --add-entry=192.168.1.0/24
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source ipset="whitelist" accept'
系统调优
连接跟踪优化
bash
# 调整连接跟踪表大小
echo 'net.netfilter.nf_conntrack_max = 1048576' | sudo tee -a /etc/sysctl.conf
# 调整超时时间
echo 'net.netfilter.nf_conntrack_tcp_timeout_established = 600' | sudo tee -a /etc/sysctl.conf
# 应用配置
sudo sysctl -p
故障排除
常见问题
连接问题诊断
bash
# 测试端口连通性
telnet 目标IP 端口号
# 检查本地监听端口
sudo netstat -tlnp
# 跟踪数据包
sudo tcpdump -i any port 80
# 检查防火墙规则匹配
sudo iptables -L -n -v | grep 目标端口
配置错误恢复
bash
# 临时停用防火墙
sudo systemctl stop firewalld
# 重置为默认配置
sudo firewall-cmd --complete-reload
# 恢复备份配置
sudo cp /etc/firewalld/backup/* /etc/firewalld/
sudo firewall-cmd --reload
调试技巧
详细日志输出
bash
# 启用调试日志
sudo firewall-cmd --set-log-denied=all
# 查看详细日志
sudo journalctl -u firewalld --since "1 hour ago"
# 测试规则匹配
sudo firewall-cmd --query-rich-rule='rule family="ipv4" source address="测试IP" service name="ssh" accept'
备份和恢复
配置备份
备份防火墙配置
bash
# 创建备份目录
sudo mkdir -p /etc/firewalld/backup
# 备份配置文件
sudo cp -r /etc/firewalld/{zones,services,icmptypes} /etc/firewalld/backup/
# 导出当前配置
sudo firewall-cmd --list-all-zones > /root/firewall-config-backup.txt
# 定期备份脚本
#!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S)
sudo tar -czf /root/firewall-backup-$DATE.tar.gz /etc/firewalld/
配置恢复
bash
# 恢复配置文件
sudo cp -r /etc/firewalld/backup/* /etc/firewalld/
# 重载配置
sudo firewall-cmd --reload
# 验证配置
sudo firewall-cmd --check-config
通过掌握这些防火墙配置技能,您可以为 AlmaLinux 系统构建强大的网络安全防护,保护系统免受网络威胁。