Skip to content

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 系统构建强大的网络安全防护,保护系统免受网络威胁。

基于 MIT 许可发布