简易防火墙 Uncomplicated Firewall (UFW)

更新于 2026-01-27

coder7475 2024-08-12

Linux 防火墙

所有现代 Linux 防火墙解决方案都使用 Netfilter 子系统。

Netfilter 是一个数据包过滤系统,用于控制进入服务器或通过服务器的网络流量的命运。

系统管理员使用用户空间接口工具 iptables 来设置规则,以管理传入的流量。

iptables 极其高效且高度可定制,但配置起来可能较为复杂。

开发者为此开发了多个前端工具,帮助用户在不编写冗长 iptables 规则的情况下控制防火墙。例如:ufwfirewalld 等。


ufw - Uncomplicated Firewall(简易防火墙)

  • Debian 系发行版(如 Ubuntu、Linux Mint 等)的默认防火墙工具。
  • 提供一种用户友好的方式来创建基于主机的 IPv4 或 IPv6 防火墙。
  • ufw 默认初始状态为禁用

启用或禁用 ufw

启用 ufw:

sudo ufw enable

禁用 ufw:

sudo ufw disable

查看状态

查看防火墙状态:

sudo ufw status

以编号格式显示:

sudo ufw status numbered

显示所有已添加的规则:

ufw show added

UFW 默认策略

理解 ufw 的默认策略对安全至关重要。

运行以下命令:

sudo ufw status verbose

输出示例:

# ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To                         Action      From
--                         ------      ----
22/tcp                     ALLOW IN    Anywhere
44                         DENY IN     Anywhere
22/tcp (v6)                ALLOW IN    Anywhere (v6)
44 (v6)                    DENY IN     Anywhere (v6)

输出解释:

  • deny (incoming):确保在你显式添加允许规则之前,外部系统无法连接到你的机器。
  • allow (outgoing):表示所有出站请求都被允许。此设置有助于正常运行 apt installwgetping 等命令。但若要提高服务器安全性,建议将默认出站策略改为拒绝,然后仅允许特定 IP 或域名。
  • disabled (routed):表示所有路由功能被禁用,转发被阻止。如果你的机器不是用作路由器,这是一个良好的默认设置。

Action 列中,除了 ALLOW INDENY IN,也存在 ALLOW OUTDENY OUT


重新加载防火墙以应用新规则

如果 UFW 已启用,修改规则后需要重新加载才能生效。

你可以通过先禁用再启用的方式重启 UFW:

sudo ufw disable && sudo ufw enable

或者直接重载规则:

sudo ufw reload

重置所有 ufw 规则

ufw reset

如何添加 ufw 规则

语法:

sudo ufw allow <端口>/<可选: 协议>
sudo ufw deny <端口>/<可选: 协议>

示例:

  • 打开端口 22:

    sudo ufw allow 22
    
  • 关闭已打开的端口 22:

    sudo ufw deny 22
    
  • 允许 SSH 连接:

    ufw allow ssh
    
  • 允许 HTTP 和 HTTPS:

    sudo ufw allow http && sudo ufw allow https
    

使用编号格式添加规则

先查看带编号的规则列表:

sudo ufw status numbered

然后在指定位置插入规则(例如在第 1 条插入允许 80 端口):

sudo ufw insert 1 allow 80

删除规则

删除某条规则(例如删除 deny 22):

sudo ufw delete deny 22

检查当前正在运行的开放端口

如果尚未安装 net-tools,请先安装:

sudo apt install net-tools

显示当前所有正在监听的端口:

netstat -tulpn

进一步检查网络连接,可使用以下命令:

  • 显示所有网络连接的详细信息:

    netstat -anp
    
  • 列出打开的网络文件:

    lsof -i
    
  • 显示套接字统计和网络连接(ssnetstat 的现代替代):

    ss
    
  • 显示所有 TCP 套接字:

    ss -t
    
  • 显示所有 UDP 套接字:

    ss -u
    
  • 显示所有监听中的套接字:

    ss -l
    
  • 显示所有套接字:

    ss -a
    
  • 显示套接字摘要统计:

    ss -s
    
  • 显示使用套接字的进程:

    ss -p
    
  • 以数字形式显示地址(而非主机名):

    ss -n
    
  • 列出所有防火墙规则(含 IP 和端口号):

    iptables -L -n
    
  • 查看系统 DNS 配置信息:

    cat /etc/resolv.conf
    

允许特定主机访问

可以允许特定主机或网络访问某个端口。

示例:允许来自主机 192.168.0.2 的 SSH 访问本机任意 IP:

sudo ufw allow proto tcp from 192.168.0.2 to any port 22

允许整个子网访问 SSH:

sudo ufw allow proto tcp from 192.168.0.2/24 to any port 22

模拟添加规则(Dry Run)

若想预览添加规则的效果,可使用 --dry-run 选项:

sudo ufw --dry-run allow http

配置支持 IPv6

编辑配置文件(使用 nano 编辑器):

sudo nano /etc/default/ufw

IPV6 的值改为 yes

IPV6=yes

ufw 应用程序集成

列出所有可用的应用程序配置文件:

sudo ufw app list

语法:

sudo ufw allow <应用程序名称>
sudo ufw deny <应用程序名称>

例如,允许 OpenSSH:

sudo ufw allow "OpenSSH"

给新手的特别提示

启用防火墙后,在未添加 SSH 允许规则前,切勿断开远程服务器连接!
否则你将无法再次登录自己的服务器。


UFW 日志记录(Logging)

检查日志是否启用:

sudo ufw status verbose

启用日志记录:

sudo ufw logging on

UFW 防火墙日志级别(共 5 级):

  • off:禁用日志记录。
  • low:记录与当前防火墙规则不匹配的被阻止数据包,以及显式标记为记录的规则日志。
  • medium:除 low 级别内容外,还包括无效数据包、新连接的日志,以及通过速率限制记录的日志。
  • high:包含带速率限制和不带速率限制的数据包日志。
  • full:与 high 类似,但不进行速率限制

更改日志级别

语法:

sudo ufw logging <日志级别>

例如,设为 medium 级别:

sudo ufw logging medium

⚠️ 注意:原文此处有笔误(写成了 logging_level),正确应为具体级别名称,如 medium

查看日志

  • 查看完整日志:

    sudo less /var/log/ufw.log
    
  • 实时查看日志最后 10 行(持续跟踪):

    sudo tail -f /var/log/ufw.log