iptables 与 ufw 的区别、常用命令及常见问题

2740 字
14 分钟
iptables 与 ufw 的区别、常用命令及常见问题

本文将深入对比 iptables 和 ufw,从工作原理、常用命令、适用场景等方面进行详细解析,并提供常见问题的解决方案,帮助读者根据实际需求选择合适的防火墙管理工具。

一、iptables 详解#

1.1 工作原理#

iptables 是 Linux 内核 netfilter 框架的用户空间接口,通过表(Table)、链(Chain)和规则(Rule)三层结构来控制网络流量。

表(Table):用于存放不同功能的规则集合,主要包括:

表名功能描述
filter默认表,用于过滤数据包(放行、拒绝、丢弃)
nat用于网络地址转换(NAT)
mangle用于修改数据包的特定字段
raw用于配置数据包跟踪

链(Chain):每张表包含多条内置链,数据包在传输过程中会经过不同的链:

链名作用位置
INPUT进入本机的数据包
OUTPUT从本机发出的数据包
FORWARD经过本机转发(路由)的数据包
PREROUTING路由决策前处理
POSTROUTING路由决策后处理

规则(Rule):规则是匹配条件与动作的组合,当数据包符合匹配条件时,执行指定动作(如 ACCEPT、DROP、REJECT)。

数据包的处理流程为:进入系统 → PREROUTING → 路由判断 → INPUT/FORWARD → POSTROUTING → 发出系统

1.2 常用命令及示例#

# 查看当前所有规则
sudo iptables -L -n -v
# 查看 filter 表的规则(默认表)
sudo iptables -t filter -L -n
# 允许来自 192.168.1.100 的 SSH 连接
sudo iptables -A INPUT -s 192.168.1.100 -p tcp --dport 22 -j ACCEPT
# 允许 HTTP(80)和 HTTPS(443)流量
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 拒绝来自特定 IP 的所有流量
sudo iptables -A INPUT -s 10.0.0.5 -j DROP
# 删除指定规则(先查看规则编号)
sudo iptables -L INPUT --line-numbers
sudo iptables -D INPUT 3
# 允许已建立的连接
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 设置默认策略为 DROP(谨慎操作)
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
# 保存规则到文件(Ubuntu/Debian)
sudo sh -c 'iptables-save > /etc/iptables/rules.v4'
# 从文件恢复规则
sudo iptables-restore < /etc/iptables/rules.v4

1.3 适用场景#

iptables 适用于以下场景:

  • 生产环境服务器:需要精细化控制网络流量,实现复杂的安全策略

  • 网络设备配置:如路由器、网关的 NAT、端口转发等

  • 安全研究:深入理解 Linux 网络安全机制

  • 多协议管理:需要同时管理 TCP、UDP、ICMP 等多种协议的流量

二、ufw 详解#

2.1 设计理念#

ufw(Uncomplicated Firewall)是 Ubuntu 默认的防火墙管理工具,诞生于 2008 年,旨在为普通用户提供一个简单易用的 iptables 前端。ufw 将复杂的 iptables 命令简化为直观的操作语法,让用户无需记忆繁琐的参数即可管理防火墙规则。

ufw 的核心优势在于:

  • 语法简洁:将多行 iptables 命令压缩为单条简洁指令

  • 默认安全:启用后默认拒绝所有入站流量、放行所有出站流量

  • 配置文件支持:支持通过 .rules 文件扩展高级规则

  • 应用集成:可与 ufw 添加”应用配置文件”(如 Nginx、OpenSSH)

2.2 常用命令及示例#

# 启用防火墙
sudo ufw enable
# 禁用防火墙
sudo ufw disable
# 查看防火墙状态和规则
sudo ufw status verbose
# 显示带行号的详细规则
sudo ufw status numbered
# 允许 SSH 连接
sudo ufw allow ssh
# 允许特定端口
sudo ufw allow 80/tcp
sudo ufw allow 443
# 允许来自特定 IP 的访问
sudo ufw allow from 192.168.1.100
# 允许特定 IP 访问特定端口
sudo ufw allow from 192.168.1.100 to any port 22
# 拒绝特定端口
sudo ufw deny 3306
# 删除规则
sudo ufw delete allow 80/tcp
# 重置所有规则(慎用)
sudo ufw reset
# 允许应用配置文件中定义的服务
sudo ufw app list
sudo ufw allow 'Nginx Full'
# 查看 ufw 日志
sudo ufw show raw
sudo tail -f /var/log/ufw.log

2.3 适用场景#

ufw 适用于以下场景:

  • 桌面 Linux 系统:快速配置个人电脑的防火墙

  • 小型服务器:部署简单网站、开发环境

  • 初学者学习:理解防火墙概念,不被复杂语法困扰

  • 快速原型开发:需要频繁开关端口的开发测试环境

三、iptables vs ufw 对比#

3.1 核心差异对比#

对比维度iptablesufw
学习曲线陡峭,需要深入理解表链结构平缓,命令直观易懂
语法复杂度复杂,需要指定表、链、动作等参数简洁,屏蔽底层实现细节
功能覆盖完整覆盖 netfilter 所有功能仅覆盖常用场景
配置位置直接操作内核通过配置文件间接管理
调试难度较难,需要理解内核网络栈较易,错误提示友好
社区支持资料丰富,文档完善资料相对较少
扩展性高度可扩展,支持自定义模块受限于预置功能

3.2 命令对照表#

操作目的iptables 命令ufw 命令
查看规则iptables -L -n -vufw status verbose
允许入站iptables -A INPUT -p tcp —dport 80 -j ACCEPTufw allow 80/tcp
拒绝入站iptables -A INPUT -p tcp —dport 3306 -j DROPufw deny 3306
允许特定IPiptables -A INPUT -s 10.0.0.1 -j ACCEPTufw allow from 10.0.0.1
删除规则iptables -D INPUT 1ufw delete allow 80/tcp
保存规则iptables-save > /etc/iptables.rulesufw status > /tmp/ufw.rules
重置配置手动清理规则ufw reset

3.3 性能对比#

从性能角度分析,iptables 和 ufw 在运行时几乎没有性能差异,因为 ufw 本质上是对 iptables 的封装,最终都生成相同的内核规则。性能瓶颈主要来自规则的复杂度和数量,而非管理工具的选择。

  • 简单规则集(<100条):两者性能一致

  • 复杂规则集(>1000条):建议使用 iptables 以获得更精细的优化控制

  • 超大规模规则:可考虑 nftables 作为替代方案

3.4 选择建议#

场景推荐工具
Linux 初学者ufw
个人桌面/笔记本ufw
小型网站服务器ufw
企业生产服务器iptables
需要 NAT/端口转发iptables
路由器/网关配置iptables
快速开发测试ufw

四、常见问题与解决方案#

4.1 规则不生效的排查#

问题表现:添加规则后,流量仍然无法按预期被放行或拒绝。

排查步骤

# 1. 确认规则已生效
sudo iptables -L -n -v | grep <PORT_OR_IP>
# 2. 检查规则顺序
# 规则按顺序匹配,先匹配的规则会生效
# DROP 规则在 ACCEPT 之前会导致后续规则失效
# 3. 检查默认策略
sudo iptables -L | grep Policy
# 4. 检查是否有冲突规则
sudo iptables -L INPUT -n --line-numbers
# 5. 确认服务监听地址
sudo ss -tlnp | grep <PORT>
# 6. 检查 ufw 状态(如果是 ufw)
sudo ufw status verbose
sudo ufw reload

常见原因

  • 规则顺序错误(拒绝规则在允许规则之前)

  • 默认策略与规则冲突

  • 服务绑定在 127.0.0.1 而非 0.0.0.0

  • 规则已存在但需要重启服务

4.2 端口无法访问的解决方法#

# 1. 确认服务正在运行
sudo systemctl status nginx
sudo netstat -tlnp | grep 80
# 2. 检查防火墙是否放行端口
sudo ufw allow 80/tcp
# 或
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# 3. 检查端口是否在监听所有地址
# 编辑服务配置,确保监听 0.0.0.0 而非 127.0.0.1
# 4. 检查云服务器安全组(阿里云、AWS等)
# 确认云平台层面的入站规则已开放
# 5. 测试本地连通性
curl http://localhost:80
# 6. 使用 telnet/nc 测试端口连通性
nc -zv 127.0.0.1 80

4.3 防火墙规则备份与恢复#

使用 iptables

# 备份当前规则
sudo iptables-save > /backup/iptables-$(date +%Y%m%d).rules
# 安装 iptables-persistent(Debian/Ubuntu)
sudo apt install iptables-persistent
# 自动保存规则
sudo netfilter-persistent save
# 恢复规则
sudo iptables-restore < /backup/iptables-20240101.rules

使用 ufw

# 导出配置
sudo ufw status > /backup/ufw-backup.txt
# 或备份配置文件
sudo cp /etc/ufw/*.rules /backup/
# 恢复配置
sudo ufw reset
# 重新启用并配置
sudo ufw enable

4.4 如何安全地远程修改防火墙规则#

远程修改防火墙规则是高风险操作,错误的规则可能导致 SSH 连接中断。以下是安全操作的最佳实践:

方法一:计划任务 + 超时回滚

# 创建回滚脚本
cat > /usr/local/bin/firewall-backup.sh << 'EOF'
#!/bin/bash
# 备份当前规则
iptables-save > /tmp/iptables.backup.$(date +%s)
# 设置 5 分钟后自动恢复
echo "iptables-restore < /tmp/iptables.backup.$(date +%s)" | at now + 5 minutes
EOF
chmod +x /usr/local/bin/firewall-backup.sh
# 修改规则前先运行备份脚本
sudo /usr/local/bin/firewall-backup.sh

方法二:使用 ufw 的 SSH 连接保护

# ufw 默认允许 SSH,确保 SSH 规则存在
sudo ufw allow 22/tcp
# 设置默认拒绝策略
sudo ufw default deny incoming
# 使用 ufw 的限流功能防止暴力破解
sudo ufw limit ssh

方法三:通过串口/ILO/DRAC 连接

对于生产服务器,建议通过带外管理方式(如 IPMI、iLO、DRAC)访问服务器,即使 SSH 连接断开也能恢复。

4.5 常见配置错误及修复#

错误类型问题描述修复方法
SSH 锁死修改规则时误删 SSH 规则使用带外管理或等待超时回滚
默认策略错误将默认策略设为 ACCEPTiptables -P INPUT ACCEPT
规则顺序错误DROP 规则在 ACCEPT 之前删除错误规则,按正确顺序添加
忘记保存重启后规则丢失使用 iptables-save 或 iptables-persistent
云平台未配置防火墙规则正确但无法访问检查云服务器安全组

五、使用推荐#

5.1 生产环境建议#

  1. 默认拒绝入站流量
# iptables
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
# ufw
sudo ufw default deny incoming
sudo ufw default deny outgoing # 可选
  1. 只放行必要的端口
# 最小化原则:只开放业务必需的端口
sudo ufw allow 80/tcp # HTTP
sudo ufw allow 443/tcp # HTTPS
sudo ufw allow 22/tcp # SSH
  1. 限制 SSH 访问来源
# 只允许特定 IP 段访问 SSH
sudo ufw allow from 10.0.0.0/24 to any port 22
  1. 启用连接跟踪
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
  1. 记录被拒绝的连接
# iptables 添加日志规则
sudo iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables-dropped: " --log-level 4

5.2 安全加固建议#

  1. 防止 SYN Flood 攻击
sudo iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
sudo iptables -A INPUT -p tcp --syn -j DROP
  1. 限制 ICMP 流量
# 只允许必要的 ICMP 类型
sudo iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
sudo iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
  1. 防止端口扫描
sudo iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
sudo iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
  1. 定期审计规则
# 定期检查并审计防火墙规则
sudo iptables -L -n -v --line-numbers > /var/log/firewall-audit-$(date +%Y%m%d).log
  1. 测试环境验证后再部署
  • 在测试环境验证所有规则

  • 记录每次修改的内容和时间

  • 保持配置文件的版本管理

本文基于 Linux kernel 5.x 及主流发行版编写,部分命令可能因系统版本不同而略有差异。

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

iptables 与 ufw 的区别、常用命令及常见问题
https://www.kshare.top/posts/iptables-与-ufw-的区别常用命令及常见问题/
作者
Kshare
发布于
2026-04-18
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
Kshare
Hello, I'm Kshare.
公告
欢迎来到Kshare站点!近期站点进行升级,欢迎访问和收藏站点!
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
137
分类
12
标签
59
总字数
333,011
运行时长
0
最后活动
0 天前

文章目录