一文搞懂 iptables 与 ufw:配置教程+优缺点+选择指南
一、技术概述
1.1 iptables:Linux防火墙的核心引擎
iptables是Linux系统中最基础、最强大的网络数据包过滤工具,自Linux内核2.4版本起成为核心组件。它的设计目标是提供一个灵活、可扩展的防火墙框架,允许系统管理员精确控制进出网络接口的数据包。
核心设计理念:
-
基于规则的包过滤机制
-
支持网络地址转换(NAT)
-
提供连接跟踪功能(conntrack)
-
高度可扩展的模块化架构
适用场景:
-
需要精细控制网络流量的服务器
-
复杂的网络拓扑环境
-
需要自定义防火墙策略的高级用户
-
企业级安全防护需求
1.2 UFW:简化防火墙管理的前端工具
UFW(Uncomplicated Firewall,“简单防火墙”)是一个基于iptables的前端管理工具,最初为Ubuntu系统开发,现已广泛应用于各大Linux发行版。它的设计目标是降低防火墙配置的门槛,让普通用户也能轻松管理防火墙规则。
核心设计理念:
-
简化命令语法,提升易用性
-
提供人性化的规则管理方式
-
支持应用配置文件(App Profiles)
-
兼容iptables的底层功能
适用场景:
-
个人桌面系统
-
中小型服务器的快速配置
-
初学者学习防火墙管理
-
需要快速部署安全策略的场景
1.3 两者关系
UFW本质上是对iptables的封装和抽象。它通过简化的命令接口,将用户输入的配置翻译成复杂的iptables规则并执行。可以理解为:iptables是防火墙的底层引擎,UFW是让这台引擎更容易操作的驾驶界面。所有UFW的操作最终都会转换为iptables规则存储在系统中。
二、核心功能对比
2.1 易用性对比
表格
| 维度 | iptables | UFW |
|---|---|---|
| 学习曲线 | 陡峭,需要理解复杂的链、表、规则概念 | 平缓,命令直观易懂 |
| 命令语法 | 复杂,参数众多 | 简洁,贴近自然语言 |
| 配置速度 | 慢,需要精确指定每个参数 | 快,预设常见场景 |
| 错误容忍度 | 低,语法错误可能导致规则失效 | 高,提供友好的错误提示 |
2.2 功能复杂度对比
iptables的优势:
-
无限的灵活性,可实现任意复杂的防火墙策略
-
支持高级功能如速率限制、连接跟踪标记、基于状态的过滤
-
可直接操作内核网络栈,性能最优
-
支持自定义链,便于规则组织和管理
UFW的优势:
-
内置常用服务配置文件(SSH、HTTP、HTTPS等)
-
自动处理IPv4和IPv6规则
-
提供状态查看和规则序号管理
-
支持规则注释,便于维护
2.3 配置方式对比
iptables配置方式:
# 需要手动指定表、链、动作、协议、端口等iptables -A INPUT -p tcp --dport 22 -j ACCEPTUFW配置方式:
# 简化的语义化命令ufw allow 22/tcp2.4 各自的局限性
iptables局限性:
-
规则管理复杂,容易出错
-
规则按顺序匹配,调整顺序需要手动操作
-
没有内置的规则注释机制
-
配置文件格式不直观
UFW局限性:
-
不支持某些iptables的高级特性
-
复杂场景下可能需要回退到iptables
-
某些网络功能(如复杂的NAT配置)支持有限
-
故障排查时需要查看底层的iptables规则
三、iptables基础配置
3.1 基本概念
表(Tables) :iptables将规则组织到不同的表中,每个表用于特定的目的:
-
filter表:默认表,用于包过滤(INPUT、OUTPUT、FORWARD链)
-
nat表:用于网络地址转换(PREROUTING、OUTPUT、POSTROUTING链)
-
mangle表:用于修改数据包的TOS、TTL等字段
-
raw表:用于配置连接跟踪
链(Chains) :规则按顺序排列在链中,数据包经过链时依次匹配规则:
-
INPUT链:处理进入本机的数据包
-
OUTPUT链:处理从本机发出的数据包
-
FORWARD链:处理需要转发的数据包
规则(Rules) :每条规则包含匹配条件和处理动作:
-
匹配条件:协议、端口、IP地址、连接状态等
-
处理动作:ACCEPT(接受)、DROP(丢弃)、REJECT(拒绝)等
3.2 常用基础命令
查看现有规则:
# 列出filter表所有规则(带行号)iptables -L -n -v --line-numbers
# 查看特定链的规则iptables -L INPUT -n -v
# 以数字形式显示IP和端口,便于脚本处理iptables -S
# 查看规则计数器(显示匹配的数据包和字节数)iptables -L -n -v -x添加规则:
# 在INPUT链末尾添加允许SSH访问的规则iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 在INPUT链开头插入规则(使用-I参数)iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT
# 允许特定IP访问iptables -A INPUT -s 192.168.1.100 -j ACCEPT
# 允许来自特定网段的数据包iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT删除规则:
# 根据行号删除规则iptables -D INPUT 3
# 根据规则内容删除iptables -D INPUT -p tcp --dport 22 -j ACCEPT
# 清空特定链的所有规则iptables -F INPUT
# 清空所有表的所有规则(谨慎使用!)iptables -F设置默认策略:
# 设置INPUT链默认策略为DROP(拒绝所有未匹配的包)iptables -P INPUT DROP
# 设置OUTPUT链默认策略为ACCEPTiptables -P OUTPUT ACCEPT
# 设置FORWARD链默认策略为DROPiptables -P FORWARD DROP3.3 开放特定端口配置示例
开放SSH端口:
# 允许TCP协议的22端口(SSH)iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 限制SSH只允许特定IP访问iptables -A INPUT -p tcp -s 192.168.1.100 --dport 22 -j ACCEPT
# 允许SSH并记录连接日志iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j LOG --log-prefix "SSH attempt: "iptables -A INPUT -p tcp --dport 22 -j ACCEPT开放HTTP/HTTPS端口:
# 允许HTTP(端口80)iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# 允许HTTPS(端口443)iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 允许HTTP和HTTPS的简洁写法iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT限制IP访问配置:
# 拒绝特定IP的所有访问iptables -A INPUT -s 10.0.0.50 -j DROP
# 拒绝某个网段的访问iptables -A INPUT -s 10.0.0.0/24 -j REJECT
# 白名单模式:先拒绝所有,再允许特定IPiptables -A INPUT -j DROP # 这条规则会拒绝所有前面的规则未匹配的包iptables -I INPUT 1 -s 192.168.1.100 -j ACCEPT # 插入到开头
# 黑名单模式:允许所有,拒绝特定IPiptables -A INPUT -j ACCEPTiptables -A INPUT -s 10.0.0.50 -j DROP四、UFW基础配置
4.1 UFW的简化命令体系
UFW的设计哲学是”约定优于配置”,它预置了常用场景的配置模板,并通过语义化的命令语法降低学习门槛。命令格式通常为: ufw [动作] [目标] [协议]
4.2 常用基础命令
启用/禁用防火墙:
# 启用UFW防火墙sudo ufw enable
# 禁用UFW防火墙sudo ufw disable
# 重载防火墙规则(不中断现有连接)sudo ufw reload
# 重置防火墙到默认状态sudo ufw reset查看状态:
# 查看防火墙状态和规则sudo ufw status verbose
# 查看编号格式的规则(便于删除)sudo ufw status numbered
# 查看详细配置信息sudo ufw show added允许/拒绝服务:
# 允许SSH服务sudo ufw allow ssh
# 允许HTTP服务sudo ufw allow http
# 允许HTTPS服务sudo ufw allow https
# 拒绝特定服务sudo ufw deny ftp允许/拒绝端口:
# 允许特定TCP端口sudo ufw allow 22/tcp
# 允许特定UDP端口sudo ufw allow 53/udp
# 允许端口范围sudo ufw allow 1000:2000/tcp
# 允许来自特定IP的端口访问sudo ufw allow from 192.168.1.100 to any port 33064.3 端口转发配置
UFW支持简单的端口转发功能,配置编辑 /etc/ufw/before.rules 文件:
# 编辑UFW配置文件sudo nano /etc/ufw/before.rules
# 在文件开头添加以下配置(在*nat之前)*nat:PREROUTING ACCEPT [0:0]# 将外部80端口的流量转发到内部8080端口-A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080COMMIT
# 保存并重新加载UFWsudo ufw reload4.4 应用配置文件
UFW提供应用配置文件(App Profiles)来简化常见服务的配置:
# 列出所有可用的应用配置文件sudo ufw app list
# 查看特定应用的详细信息sudo ufw app info Apache
# 允许应用的所有端口sudo ufw allow Apache
# 创建自定义应用配置文件sudo nano /etc/ufw/applications.d/myapp自定义应用配置文件示例:
[myapp]title=My Custom Applicationdescription=Ports for my custom applicationports=8080/tcp,8443/tcp|9000/udp五、高级应用场景
5.1 iptables实现Web服务器安全配置
以下是一个典型的Web服务器防火墙策略:
#!/bin/bash# Web服务器防火墙配置脚本
# 1. 清空现有规则iptables -Fiptables -Xiptables -t nat -Fiptables -t nat -X
# 2. 设置默认策略iptables -P INPUT DROPiptables -P FORWARD DROPiptables -P OUTPUT ACCEPT
# 3. 允许本地回环接口iptables -A INPUT -i lo -j ACCEPTiptables -A OUTPUT -o lo -j ACCEPT
# 4. 允许已建立的连接iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 5. 允许SSH(限制速率防止暴力破解)iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --setiptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROPiptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 6. 允许HTTP和HTTPSiptables -A INPUT -p tcp --dport 80 -j ACCEPTiptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 7. 防止SYN洪水攻击iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
# 8. 防止ICMP洪水攻击iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
# 9. 记录被拒绝的连接iptables -A INPUT -j LOG --log-prefix "FIREWALL: "
# 10. 拒绝所有其他连接(默认策略已设置为DROP)5.2 UFW实现Web服务器安全配置
相同的策略用UFW实现:
#!/bin/bash# Web服务器UFW配置脚本
# 1. 重置UFW到默认状态sudo ufw --force reset
# 2. 设置默认策略sudo ufw default deny incomingsudo ufw default allow outgoing
# 3. 允许SSH(限制速率)sudo ufw limit 22/tcp
# 4. 允许HTTP和HTTPSsudo ufw allow 80/tcpsudo ufw allow 443/tcp
# 5. 启用UFWsudo ufw --force enable
# 6. 查看状态sudo ufw status verbose5.3 保存配置确保重启后生效
iptables保存方法:
在Ubuntu/Debian系统上:
# 安装iptables-persistent包sudo apt-get install iptables-persistent
# 保存当前规则sudo netfilter-persistent save
# 手动保存规则到文件sudo iptables-save > /etc/iptables/rules.v4sudo ip6tables-save > /etc/iptables/rules.v6
# 恢复规则sudo iptables-restore < /etc/iptables/rules.v4在CentOS/RHEL系统上:
# 保存规则service iptables save
# 或使用iptables-save命令iptables-save > /etc/sysconfig/iptablesUFW保存方法:
UFW会自动保存配置,但需要确保配置正确:
# 启用UFW时自动保存sudo ufw enable
# 手动保存配置sudo cp /etc/ufw/user.rules /etc/ufw/user.rules.backup
# 检查配置文件sudo cat /etc/ufw/user.rules六、最佳实践建议
6.1 防火墙规则设计基本原则
-
最小权限原则:只开放必要的端口和服务,默认拒绝所有其他访问
-
规则顺序很重要:将最常用的规则放在前面,提高匹配效率
-
使用白名单而非黑名单:明确允许访问的源比禁止特定源更安全
-
记录关键事件:对被拒绝的连接进行日志记录,便于安全审计
-
定期审查规则:删除不再使用的规则,避免规则膨胀
-
测试后再部署:在生产环境部署前,在测试环境验证规则
6.2 常见错误及排查方法
错误1:SSH连接被意外阻断
# 问题:配置防火墙后无法SSH登录# 解决:在启用防火墙前,确保SSH规则已生效# 使用at命令延迟启用防火墙,给自己留出时间测试sudo at -f <(echo "ufw enable") now + 5 minutes错误2:规则顺序错误
# 问题:规则不按预期生效# 解决:查看规则顺序和匹配情况iptables -L -n -v --line-numbers
# 检查规则匹配计数器iptables -L INPUT -n -v -x错误3:忘记保存规则
# 问题:重启后规则丢失# 解决:使用iptables-persistent或创建启动脚本# 将规则保存脚本添加到rc.local或systemd服务错误4:IPv4和IPv6不一致
# 问题:某些服务在IPv6环境下无法访问# 解决:确保同时配置iptables和ip6tables规则# 或在UFW中明确启用IPv6支持sudo nano /etc/default/ufw # 设置IPV6=yes6.3 安全加固建议
-
定期更新系统和防火墙软件:及时获取安全补丁
-
使用Fail2ban辅助防护:自动封禁恶意IP地址
-
监控防火墙日志:使用logwatch或自定义脚本分析异常
-
实施网络分段:在不同网络区域应用不同的防火墙策略
-
定期渗透测试:验证防火墙规则的有效性
-
备份配置文件:保存工作正常的配置,便于快速恢复
6.4 性能优化建议
-
优化规则顺序:将高流量规则放在前面
-
使用状态检测:避免重复检查已建立的连接
-
限制规则数量:过多的规则会影响性能
-
使用连接跟踪:利用state模块提高匹配效率
-
定期清理过期规则:删除不再需要的规则
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!