如何在 Ubuntu 上使用 UFW 配置防火墙:从入门到实践

本文详细介绍了如何在 Ubuntu 系统上使用 UFW(Uncomplicated Firewall)工具配置防火墙。从理解 UFW 的基本概念到设置默认策略、允许 SSH 连接、开放特定端口、管理规则以及遵循最佳安全实践,本教程将帮助开发者有效保护服务器安全。

阅读时长: 7 分钟
共 3182字
作者: eimoon.com

1. 简介:UFW 是什么?

UFW (Uncomplicated Firewall) 是 Ubuntu 系统上一个用户友好的 iptables 接口,旨在简化防火墙的配置和管理。对于初学者而言,它极大地降低了网络安全管理的门槛,无需深入理解复杂的 iptables 命令即可有效保护服务器。

核心思想与安全策略:

  • UFW 是 iptables 的简化接口,便于管理 Ubuntu 上的防火墙。
  • 默认策略应设置为拒绝所有入站流量,并允许所有出站流量,这是“最小权限原则”的核心。
  • 在启用 UFW 之前,务必创建允许 SSH 连接的规则,以防被锁定在服务器之外。
  • 通过 sudo ufw enable 命令激活防火墙,并使其在系统启动时自动运行。
  • 防火墙规则可以基于应用程序配置文件、服务名称、端口号或特定 IP 地址进行灵活配置。
  • sudo ufw status verbose 命令用于检查防火墙状态及已配置的规则列表。
  • 应遵循最小权限原则,仅开放应用程序正常运行所需的特定端口。
  • 启用 UFW 日志是监视网络流量和识别潜在恶意活动的关键实践。
  • UFW 可以与 Fail2ban 等入侵防御系统集成,实现动态阻止攻击者的自动化威胁响应。

2. 前提条件

在开始配置 UFW 之前,请确保满足以下条件:

  • 一台运行 Ubuntu 的服务器,并拥有一个具有 sudo 权限的非 root 用户。
  • UFW 在 Ubuntu 上通常已预装。如果已被卸载,可以使用以下命令进行安装:
    sudo apt install ufw
    
  • (建议)如果您的 Ubuntu 版本为 20.04 或更低,建议升级到最新版本以获得最佳兼容性和安全更新。

3. UFW 防火墙配置步骤

3.1 确保 IPv6 已启用

为了确保 UFW 能够同时管理 IPv4 和 IPv6 流量,请检查 /etc/default/ufw 文件,确认 IPV6 参数设置为 yes

sudo nano /etc/default/ufw
# 确认或修改为以下内容:
# IPV6=yes

3.2 设置默认策略

为服务器设定一个安全的起点至关重要。我们将默认策略设置为:拒绝所有入站(incoming)连接,允许所有出站(outgoing)连接。这遵循了“最小权限原则”,即默认情况下阻止所有未经明确授权的外部访问。

sudo ufw default deny incoming  # 拒绝所有默认入站连接
sudo ufw default allow outgoing # 允许所有默认出站连接

3.3 允许 SSH 连接(关键步骤)

在启用 UFW 之前,务必配置允许 SSH(Secure Shell)连接的规则。否则,一旦防火墙启用,您将无法远程连接到服务器,从而将自己锁定在服务器之外。

您可以通过以下几种方式允许 SSH 连接:

  • 通过应用配置文件 (推荐): UFW 提供了预定义的应用程序配置文件,方便管理常见服务。
    sudo ufw app list   # 查看可用的应用配置文件,例如 OpenSSH
    sudo ufw allow OpenSSH # 允许 OpenSSH 应用配置文件定义的端口(默认为 22 端口)
    
  • 通过服务名称: UFW 可以根据 /etc/services 文件识别服务名称及其默认端口。
    sudo ufw allow ssh  # 允许 SSH 服务默认端口(22)
    
  • 通过端口号: 直接指定 SSH 服务使用的端口号。
    sudo ufw allow 22   # 允许默认 SSH 端口
    sudo ufw allow 2222 # 如果您的 SSH 服务使用自定义端口,例如 2222
    
  • 启用速率限制(推荐): 为了防止暴力破解攻击,您可以对 SSH 连接启用速率限制。
    sudo ufw limit ssh  # 在 30 秒内尝试连接超过 6 次的 IP 地址将被暂时阻止
    

3.4 启用 UFW 防火墙

确认已添加 SSH 规则后,即可安全地启用防火墙。

sudo ufw show added # 验证已添加的规则,确保 SSH 规则存在
sudo ufw enable     # 启用防火墙。系统会提示确认,输入 'y' 并回车。

防火墙现在已激活,并会在系统启动时自动运行。

3.5 允许其他所需连接

根据您的服务器用途,可能需要开放其他端口以允许特定服务(如 Web 服务器、数据库等)的访问。

  • HTTP (Web 服务,端口 80):
    sudo ufw allow http
    # 或者
    sudo ufw allow 80/tcp
    
  • HTTPS (安全 Web 服务,端口 443):
    sudo ufw allow https
    # 或者
    sudo ufw allow 443/tcp
    
  • Web 服务器应用配置文件 (例如 Apache/Nginx):
    sudo ufw allow 'Apache Full' # 同时允许 Apache 的 HTTP 和 HTTPS 流量
    # 或者
    sudo ufw allow 'Nginx Full'  # 同时允许 Nginx 的 HTTP 和 HTTPS 流量
    
  • 特定端口范围: 适用于需要开放一段连续端口的情况,必须指定协议。
    sudo ufw allow 6000:6007/tcp # 允许 6000 到 6007 端口的 TCP 流量
    sudo ufw allow 6000:6007/udp # 允许 6000 到 6007 端口的 UDP 流量
    
  • 特定 IP 地址: 限制只有指定 IP 地址才能访问服务。
    sudo ufw allow from 203.0.113.4                        # 允许来自 IP 203.0.113.4 的所有连接
    sudo ufw allow from 203.0.113.4 to any port 22         # 允许 IP 203.0.113.4 连接到任何端口的 22 端口 (SSH)
    
  • 子网 (CIDR 表示法): 允许来自整个子网的连接。
    sudo ufw allow from 203.0.113.0/24                     # 允许来自 203.0.113.0/24 子网的所有连接
    sudo ufw allow from 203.0.113.0/24 to any port 22      # 允许子网 203.0.113.0/24 连接到任何端口的 22 端口
    
  • 特定网络接口的连接: 将规则限制在某个网络接口上,例如 eth0(公共接口)或 eth1(私有接口)。
    ip addr                                             # 首先使用此命令查找网络接口名称,例如 eth0
    sudo ufw allow in on eth0 to any port 80            # 允许 HTTP 流量进入公共接口 eth0
    sudo ufw allow in on eth1 to any port 3306          # 允许 MySQL 流量进入私有接口 eth1
    

3.6 拒绝连接

除了允许特定连接外,您也可以明确拒绝某些连接。默认策略已拒绝所有入站,此命令主要用于覆盖之前允许的规则或拒绝出站流量。

sudo ufw deny http                  # 拒绝 HTTP 连接 (如果之前有允许 HTTP 的规则,此规则将优先)
sudo ufw deny from 203.0.113.4      # 拒绝来自特定 IP 地址 203.0.113.4 的所有连接
sudo ufw deny out 25                # 拒绝所有出站 SMTP (邮件发送) 流量

3.7 删除规则

当不再需要某个规则时,可以将其删除。可以通过规则编号或规则定义删除。

  • 按编号删除:
    sudo ufw status numbered       # 获取带编号的规则列表 (IPv4 和 IPv6 规则分开编号)
    sudo ufw delete 2              # 删除规则列表中编号为 2 的规则
    
    注意: 如果一条规则同时有 IPv4 和 IPv6 版本,按编号删除时需要分别删除对应的编号。
  • 按名称/定义删除: 推荐使用此方法,因为它会同时删除匹配的 IPv4 和 IPv6 规则。
    sudo ufw delete allow http              # 删除允许 HTTP 的规则
    sudo ufw delete allow "Apache Full"     # 删除允许 Apache Full 配置文件的规则
    

3.8 检查 UFW 状态和规则

随时检查 UFW 的当前状态和已配置的规则是良好的习惯。

sudo ufw status verbose

这将显示 UFW 是否激活、默认策略以及所有已生效的规则列表。

3.9 禁用或重置防火墙

  • 禁用 UFW:
    sudo ufw disable # 防火墙将停止运行并被禁用,但所有已配置的规则会被保留。
    
  • 重置 UFW:
    sudo ufw reset   # 此命令会禁用 UFW 并删除所有已配置的规则,将其恢复到默认的初始状态。在执行此操作前请务必谨慎。
    

4. 防火墙管理的安全最佳实践

为了最大限度地保护您的服务器,请遵循以下安全实践:

  • 应用最小权限原则: 默认拒绝所有入站流量,只开放必需的端口。进一步限制源 IP 地址,例如:
    sudo ufw allow from 203.0.113.100 to any port 3306 # 只允许特定 IP 访问 MySQL 端口
    
  • 定期审计防火墙规则: 定期检查并删除不再需要的规则,以减少潜在的安全风险。
    • 使用 sudo ufw status numbered 查看规则列表,并评估其必要性和限制性。
  • 启用并监控 UFW 日志: 开启日志记录功能 (sudo ufw logging on),并定期检查 /var/log/ufw.log 文件,以发现可疑的网络活动或攻击尝试。
  • 与入侵防御系统集成: 将 UFW 与 Fail2ban 等入侵防御系统结合使用,可以实现对暴力破解攻击的自动响应和动态 IP 封锁,提供更强大的自动化防御。
  • 关注 IPv4 和 IPv6: 确保所有规则同时适用于 IPv4 和 IPv6。如果您的服务器不需要 IPv6,可以考虑在内核级别禁用它,或者在 UFW 配置中将 IPV6 设置为 no
  • 限制出站流量(高级): 对于高安全要求的环境,可以将默认出站策略设置为拒绝 (sudo ufw default deny outgoing),然后显式允许必要的出站连接(如 DNS 查询、系统更新、NTP 时间同步等)。
  • 应用前后测试规则: 在生产环境部署任何新的防火墙规则之前,务必在测试环境中进行充分验证。可以使用 sudo ufw --dry-run enable 命令进行预演,并利用 nmap 等端口扫描工具从外部验证端口的开放情况。

5. 常见问题 (FAQs)

Q1: UFW 在 Ubuntu 中是什么? A1: UFW (Uncomplicated Firewall) 是 Ubuntu 的默认防火墙管理工具,它是 iptables 的一个用户友好接口,旨在简化防火墙规则的配置和管理。

Q2: 如何在 Ubuntu 上启用 UFW? A2: 首先,使用 sudo ufw allow ssh 允许 SSH 流量(或您自定义的 SSH 端口),然后运行 sudo ufw enable

Q3: 如何检查 UFW 是否正在运行? A3: 运行 sudo ufw status。如果防火墙处于活动状态,将显示 Status: active 和已配置的规则列表。

Q4: 如何通过 UFW 允许一个端口? A4: 使用 allow 命令,例如 sudo ufw allow 80/tcp 允许 TCP 端口 80,或使用服务名称 sudo ufw allow http

Q5: 如果在 UFW 中阻止了 SSH 会发生什么? A5: 您将立即失去对服务器的远程连接,并被锁定在服务器之外。您需要通过其他备用方法(例如云提供商的控制台或物理访问)来访问服务器并修复防火墙规则。

Q6: UFW 可以与 Fail2ban 一起使用吗? A6: 是的,UFW 和 Fail2ban 结合使用可以提供强大的自动化防御系统,例如自动封锁对 SSH 服务的暴力破解尝试 IP。

Q7: 如何重置 UFW 规则? A7: 使用 sudo ufw reset 命令。这将禁用防火墙并删除所有现有规则,恢复到初始默认状态。

6. 总结

通过本教程,您已成功学习如何在 Ubuntu 系统上使用 UFW 配置和管理防火墙。现在您的服务器拥有了一个坚实的安全基础。请记住,防火墙管理是一个持续的过程,应定期审计和更新规则,遵循最小权限原则,并结合其他安全工具(如日志监控和入侵防御系统)来确保服务器的持续安全。

关于

关注我获取更多资讯

公众号
📢 公众号
个人号
💬 个人号
使用 Hugo 构建
主题 StackJimmy 设计