主题
Linux 防火墙管理 - iptables、ufw 与 firewalld 详解
1. 防火墙基础概念
1.1 防火墙类型
Linux 系统中常见的防火墙类型包括:
- 网络层防火墙:基于 IP、端口和协议过滤流量(如 iptables)
- 应用层防火墙:基于应用程序和内容过滤流量(如入侵检测系统)
- 主机防火墙:运行在单个主机上的防火墙(如 Linux 内置防火墙)
- 网络防火墙:保护整个网络的防火墙设备或软件
1.2 Linux 防火墙架构
Linux 防火墙架构主要包括:
- netfilter:Linux 内核中的数据包过滤框架
- iptables:用户空间工具,用于配置 netfilter 规则
- nftables:新一代包过滤框架,iptables 的后继者
- 前端工具:如 ufw、firewalld 等,提供简化的配置界面
1.3 防火墙规则链
iptables 使用以下规则链来处理网络数据包:
- PREROUTING:数据包到达后,路由前处理
- INPUT:目标为本机的数据包处理
- FORWARD:需要转发的数据包处理
- OUTPUT:本机生成的数据包处理
- POSTROUTING:数据包离开前,路由后处理
2. iptables 详解
2.1 iptables 基础
安装 iptables:
bash
# Debian/Ubuntu
sudo apt install iptables
# CentOS/RHEL
sudo yum install iptables查看当前规则:
bash
# 查看所有规则链
iptables -L -n -v
# 查看特定表的规则
iptables -t nat -L -n -v规则保存与加载:
bash
# 保存规则
iptables-save > /etc/iptables/rules.v4
# 加载规则
iptables-restore < /etc/iptables/rules.v42.2 基本规则配置
默认策略设置:
bash
# 设置默认拒绝策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 允许已建立的连接和相关连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许本地回环接口
iptables -A INPUT -i lo -j ACCEPT允许特定端口:
bash
# 允许 SSH (22) 端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 允许 HTTP (80) 和 HTTPS (443) 端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 允许 MySQL (3306) 端口,仅限特定 IP
iptables -A INPUT -p tcp -s 192.168.1.100 --dport 3306 -j ACCEPTICMP 控制:
bash
# 允许 ping 请求
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
# 允许回显应答
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT2.3 NAT 和转发
配置 IP 转发:
bash
# 启用 IP 转发
echo 1 > /proc/sys/net/ipv4/ip_forward
# 永久启用(编辑 /etc/sysctl.conf)
net.ipv4.ip_forward = 1
# 应用 sysctl 配置
sysctl -p源地址转换 (SNAT):
bash
# 将内部网络 192.168.1.0/24 的流量通过 eth0 接口进行地址转换
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE目标地址转换 (DNAT):
bash
# 将外部访问 80 端口的流量转发到内部服务器 192.168.1.10 的 8080 端口
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80802.4 高级规则
端口转发:
bash
# 将本地 8080 端口转发到远程服务器的 80 端口
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 203.0.113.1:80限制连接数:
bash
# 限制 SSH 连接数,防止暴力破解
iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j REJECT
# 限制单 IP 的新连接数
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 --connlimit-mask 32 -j REJECT速率限制:
bash
# 限制 ICMP 请求速率
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 5 -j ACCEPT
# 限制 SSH 连接尝试速率
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 5 -j DROP日志记录:
bash
# 记录被拒绝的连接
iptables -N LOGGING
iptables -A INPUT -j LOGGING
iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables-Dropped: " --log-level 4
iptables -A LOGGING -j DROP2.5 iptables 规则管理
删除规则:
bash
# 删除特定规则
iptables -D INPUT -p tcp --dport 80 -j ACCEPT
# 删除链中的特定位置规则
iptables -D INPUT 3
# 清空所有规则
iptables -F
# 删除用户定义的链
iptables -X
# 重置计数器
iptables -Z插入规则:
bash
# 在特定位置插入规则
iptables -I INPUT 2 -p tcp --dport 8080 -j ACCEPT替换规则:
bash
# 替换特定位置的规则
iptables -R INPUT 2 -p tcp --dport 8443 -j ACCEPT3. ufw (Uncomplicated Firewall)
3.1 ufw 基础
安装 ufw:
bash
# Debian/Ubuntu
sudo apt install ufw
# CentOS/RHEL (需要 EPEL 仓库)
sudo yum install epel-release
sudo yum install ufw启用/禁用 ufw:
bash
# 启用 ufw
sudo ufw enable
# 禁用 ufw
sudo ufw disable
# 重新加载规则
sudo ufw reload查看状态:
bash
sudo ufw status
sudo ufw status verbose
sudo ufw status numbered3.2 基本规则配置
默认策略:
bash
# 设置默认策略
sudo ufw default deny incoming
sudo ufw default allow outgoing允许/拒绝服务:
bash
# 允许 SSH
sudo ufw allow ssh
# 允许特定端口
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# 允许特定范围端口
sudo ufw allow 6000:6007/tcp
sudo ufw allow 6000:6007/udp
# 允许来自特定 IP 的连接
sudo ufw allow from 192.168.1.100
# 允许来自特定 IP 的特定端口
sudo ufw allow from 192.168.1.100 to any port 3306拒绝连接:
bash
# 拒绝特定 IP
sudo ufw deny from 203.0.113.5
# 拒绝特定端口
sudo ufw deny 25/tcp3.3 应用配置文件
查看可用应用配置:
bash
sudo ufw app list
sudo ufw app info "Nginx Full"允许应用配置:
bash
# 允许 Nginx 完整配置(HTTP 和 HTTPS)
sudo ufw allow "Nginx Full"
# 允许 OpenSSH
sudo ufw allow "OpenSSH"自定义应用配置:
bash
# 创建自定义应用配置文件(编辑 /etc/ufw/applications.d/myapp)
[MyApp]
title=My Application
description=Description of My Application
ports=8080/tcp
# 重新加载应用配置
sudo ufw app update MyApp3.4 高级 ufw 配置
限制连接数:
bash
# 编辑 /etc/ufw/user.rules 添加 iptables 规则
# 例如限制 SSH 连接数
-A ufw-user-input -p tcp --dport 22 -m connlimit --connlimit-above 3 -j REJECT端口转发:
bash
# 编辑 /etc/ufw/before.rules 添加 DNAT 规则
*nat
:PREROUTING ACCEPT [0:0]
-A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.10:80
COMMIT日志配置:
bash
# 设置日志级别
sudo ufw logging low
sudo ufw logging medium
sudo ufw logging high
sudo ufw logging full4. firewalld
4.1 firewalld 基础
安装 firewalld:
bash
# Debian/Ubuntu
sudo apt install firewalld
# CentOS/RHEL
sudo yum install firewalld启动/停止服务:
bash
# 启动 firewalld
sudo systemctl start firewalld
# 开机自启
sudo systemctl enable firewalld
# 停止 firewalld
sudo systemctl stop firewalld
# 禁用自启
sudo systemctl disable firewalld查看状态:
bash
sudo firewall-cmd --state
sudo systemctl status firewalld4.2 区域管理
查看区域:
bash
# 查看所有可用区域
sudo firewall-cmd --get-zones
# 查看默认区域
sudo firewall-cmd --get-default-zone
# 查看区域详情
sudo firewall-cmd --list-all-zones
# 查看特定区域详情
sudo firewall-cmd --zone=public --list-all设置区域:
bash
# 设置默认区域
sudo firewall-cmd --set-default-zone=home
# 将接口添加到区域
sudo firewall-cmd --zone=public --add-interface=eth0
# 修改接口所在区域
sudo firewall-cmd --zone=internal --change-interface=eth04.3 服务和端口管理
查看服务:
bash
# 查看所有可用服务
sudo firewall-cmd --get-services
# 查看区域中允许的服务
sudo firewall-cmd --zone=public --list-services添加/删除服务:
bash
# 临时添加服务(不重启防火墙永久有效)
sudo firewall-cmd --zone=public --add-service=http
# 永久添加服务
sudo firewall-cmd --permanent --zone=public --add-service=http
# 删除服务
sudo firewall-cmd --permanent --zone=public --remove-service=http管理端口:
bash
# 添加端口
sudo firewall-cmd --permanent --zone=public --add-port=8080/tcp
# 添加端口范围
sudo firewall-cmd --permanent --zone=public --add-port=6000-6007/tcp
# 删除端口
sudo firewall-cmd --permanent --zone=public --remove-port=8080/tcp
# 查看开放的端口
sudo firewall-cmd --zone=public --list-ports4.4 高级配置
端口转发:
bash
# 启用伪装(NAT)
sudo firewall-cmd --permanent --zone=public --add-masquerade
# 设置端口转发(将 80 端口转发到 8080 端口)
sudo firewall-cmd --permanent --zone=public --add-forward-port=port=80:proto=tcp:toport=8080
# 设置端口转发到其他 IP
sudo firewall-cmd --permanent --zone=public --add-forward-port=port=80:proto=tcp:toaddr=192.168.1.10
# 设置端口转发到其他 IP 和端口
sudo firewall-cmd --permanent --zone=public --add-forward-port=port=80:proto=tcp:toaddr=192.168.1.10:toport=8080富规则配置:
bash
# 允许特定 IP 访问特定端口
sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port protocol="tcp" port="3306" accept'
# 拒绝特定 IP
sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="203.0.113.5" reject'
# 限制连接速率
sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="80" accept limit value="20/m"'IP 集管理:
bash
# 创建 IP 集
sudo firewall-cmd --permanent --new-ipset=blacklist --type=hash:net
# 添加 IP 到 IP 集
sudo firewall-cmd --permanent --ipset=blacklist --add-entry=203.0.113.5
# 使用 IP 集创建规则
sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source ipset="blacklist" reject'4.5 规则重载和配置管理
重载规则:
bash
# 重新加载防火墙规则
sudo firewall-cmd --reload
# 完全重启防火墙
sudo firewall-cmd --complete-reload配置管理:
bash
# 查看运行时配置
sudo firewall-cmd --list-all
# 查看永久配置
sudo firewall-cmd --permanent --list-all
# 将运行时配置保存为永久配置
sudo firewall-cmd --runtime-to-permanent5. nftables
5.1 nftables 简介
nftables 是 Linux 内核中新一代的包过滤框架,旨在替代 iptables。
安装 nftables:
bash
# Debian/Ubuntu
sudo apt install nftables
# CentOS/RHEL
sudo yum install nftables启动服务:
bash
sudo systemctl start nftables
sudo systemctl enable nftables5.2 基本操作
查看规则:
bash
# 查看所有规则集
sudo nft list ruleset
# 查看特定表
sudo nft list table inet filter基本规则创建:
bash
# 创建表
sudo nft add table inet filter
# 创建链
sudo nft add chain inet filter input { type filter hook input priority 0; policy drop; }
sudo nft add chain inet filter output { type filter hook output priority 0; policy accept; }
sudo nft add chain inet filter forward { type filter hook forward priority 0; policy drop; }
# 添加基本规则
sudo nft add rule inet filter input iif lo accept
sudo nft add rule inet filter input ct state related,established accept
sudo nft add rule inet filter input tcp dport 22 accept
sudo nft add rule inet filter input tcp dport { 80, 443 } accept5.3 保存和加载配置
保存配置:
bash
# 保存当前规则到文件
sudo nft list ruleset > /etc/nftables.conf加载配置:
bash
# 从文件加载规则
sudo nft -f /etc/nftables.conf6. 防火墙最佳实践
6.1 安全策略制定
- 默认拒绝原则:默认拒绝所有入站连接,只允许明确需要的服务
- 最小权限原则:只开放必要的端口和服务
- 分层防御:结合网络防火墙和主机防火墙
- 定期审查:定期检查和更新防火墙规则
6.2 常见场景配置
Web 服务器配置:
bash
# ufw 配置
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https
sudo ufw enable数据库服务器配置:
bash
# ufw 配置 - 只允许特定 IP 访问数据库
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh
sudo ufw allow from 192.168.1.100 to any port 3306
sudo ufw enable邮件服务器配置:
bash
# ufw 配置
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh
sudo ufw allow 25/tcp # SMTP
sudo ufw allow 110/tcp # POP3
sudo ufw allow 143/tcp # IMAP
sudo ufw allow 465/tcp # SMTPS
sudo ufw allow 993/tcp # IMAPS
sudo ufw allow 995/tcp # POP3S
sudo ufw enable6.3 性能优化
- 规则顺序优化:将频繁匹配的规则放在前面
- 使用连接跟踪:利用已建立连接的状态减少规则评估
- 避免过多规则:合并相似规则,减少规则数量
- 使用 IP 集:对于大量 IP 过滤,使用 IP 集提高性能
- 考虑硬件加速:对于高性能需求,考虑使用硬件加速功能
6.4 日志和监控
配置日志:
bash
# iptables 日志
iptables -A INPUT -j LOG --log-prefix "IPTABLES-DENY: " --log-level 4
# ufw 日志级别
sudo ufw logging medium
# firewalld 日志配置
sudo firewall-cmd --set-log-denied=all监控工具:
- fail2ban:自动封禁可疑 IP
- wazuh:安全监控平台
- ossec:开源主机入侵检测系统
7. 故障排除
7.1 连接问题排查
检查端口监听:
bash
# 检查端口是否在监听
ss -tuln
# 使用 netstat(如果已安装)
netstat -tuln测试连接:
bash
# 测试 TCP 连接
telnet 192.168.1.1 80
# 测试 UDP 连接
nc -zv -u 192.168.1.1 53检查防火墙规则:
bash
# 检查规则是否正确配置
ufw status numbered
# 临时禁用防火墙进行测试
sudo systemctl stop firewalld # 对于 firewalld
sudo ufw disable # 对于 ufw
iptables -F # 对于 iptables(仅测试时使用)7.2 常见问题解决
规则不生效:
- 检查规则顺序是否正确
- 确认已重新加载防火墙配置
- 检查默认策略设置
- 验证规则语法是否正确
性能问题:
- 检查规则数量是否过多
- 优化规则顺序
- 考虑使用 nftables 替代 iptables
- 检查硬件资源是否充足
连接跟踪表满:
bash
# 增加连接跟踪表大小(编辑 /etc/sysctl.conf)
net.netfilter.nf_conntrack_max = 262144
net.netfilter.nf_conntrack_buckets = 65536
# 应用配置
sysctl -p8. 总结
Linux 提供了多种强大的防火墙解决方案,从底层的 iptables/nftables 到用户友好的 ufw 和 firewalld。选择合适的防火墙工具取决于具体需求、发行版习惯以及管理复杂度。
无论使用哪种防火墙解决方案,都应当遵循安全最佳实践,制定明确的安全策略,并定期审查和更新规则。结合日志监控和入侵检测系统,可以构建更全面的安全防护体系。
随着 nftables 的发展,它将逐渐成为 Linux 防火墙的主流选择,提供更灵活的配置语法和更好的性能。对于新的部署,建议考虑使用 nftables 或基于 nftables 的前端工具。