大家好,我是冯哥的缓存。
今天我们来聊一下怎么守门——用 UFW 防火墙控制哪些端口对外开放,哪些关掉。
很多人装了Linux 服务器之后,从来没配过防火墙,所有端口全开着。这没什么大问题……直到有一天日志里出现几百条陌生 IP 在爆破 SSH 端口……!
一、UFW 是什么
UFW(Uncomplicated Firewall)是 Ubuntu/Debian 系发行版上对 iptables 的封装工具,目标是让防火墙配置"不那么复杂"。
1.1 UFW 和 iptables 的关系
自定义 UFW 规则
↓
UFW 把它翻译成
↓
iptables 规则
↓
Linux 内核 netfilter 执行
iptables 是真正干活的,但它的规则语法复杂。UFW 是一层友好的命令行界面,一句话搞定 iptables 要写一大段的事。 UFW 是 iptables 的前端,但 UFW 规则在系统重启后依然生效(已持久化)。
💡提示: CentOS/RHEL 系发行版通常用 firewalld,不用 UFW,命令不一样。本篇以 Ubuntu/Debian 为主。
1.2 需要防火墙吗?
场景 | 是否需要配置 UFW |
家用台式机/笔记本(不对外提供服务) | 不强制,建议启用并保留 SSH 端口开放,其他端口按需开放 |
家庭服务器/NAS(局域网内) | 建议启用,至少保护 SSH |
VPS / 云服务器(有公网 IP) | 建议启用,默认关所有端口,按需开放 |
企业服务器 | 必须,通常还有更严格的策略 |
二、安装与基本操作
2.1 安装
Ubuntu 18.04+ 默认已安装,检查一下:
sudo ufw status
如果提示命令不存在:
sudo apt install ufw
2.2 查看状态
sudo ufw status# 简单状态
sudo ufw status verbose# 详细规则列表
sudo ufw status numbered # 带编号(方便删除)
输出示例:
Status: active
ToActionFrom
------------
22/tcpALLOWAnywhere
80/tcpALLOWAnywhere
443/tcp ALLOWAnywhere
22/tcp (v6)ALLOWAnywhere (v6)
(v6) 表示 IPv6 也单独有一条规则,如果不需要 IPv6 可以在 /etc/default/ufw 里关闭
2.3 启用与禁用
# 启用前必须先放行 SSH ,否则当前连接会被切断。
sudo ufw allow ssh
# 启用(会立即生效)
sudo ufw enable
# 禁用(关闭防火墙,所有流量放行)
sudo ufw disable
# 重置(清除所有规则,恢复默认)
sudo ufw reset
⚠️注意:在远程 SSH 操作时,启用 UFW 之前务必先允许 22 端口,否则会把自己锁在外面!
2.4 设置默认策略
UFW 的默认策略决定了没有匹配规则时的行为:
# 推荐配置:入站默认拒绝,出站默认允许
sudo ufw default deny incoming
sudo ufw default allow outgoing
修改默认策略不影响已有规则,只影响没有匹配到规则的流量。 这是较为安全也常用的配置:所有进来的流量默认拒绝,只有显式允许的端口才放行;出去的流量默认不限制。
三、添加和删除规则
3.1 按端口号配置
# 允许某个端口(TCP+UDP)
sudo ufw allow 80
# 如果不加 /tcp 或 /udp,默认是 TCP+UDP 都开,建议明确指定协议,避免开放不必要的 UDP 端口。
# 允许某个端口(只限TCP)
sudo ufw allow 80/tcp
# 允许某个端口(只限UDP)
sudo ufw allow 53/udp
# 拒绝某个端口
sudo ufw deny 23
# 允许端口范围
sudo ufw allow 6000:6010/tcp
3.2 按服务名配置
UFW 内置了常用服务名,可以直接用名字代替端口号:
sudo ufw allow ssh# 等价于 allow 22/tcp
sudo ufw allow http# 等价于 allow 80/tcp
sudo ufw allow https# 等价于 allow 443/tcp
sudo ufw allow ftp# 等价于 allow 21/tcp
查看所有内置服务名:
sudo ufw app list
3.3 按来源 IP 配置
# 允许特定IP访问所有端口
sudo ufw allow from 192.168.1.100
# 如果只允许访问特定端口,用 to any port 端口限制,避免授权过大。
# 允许特定IP访问特定端口
sudo ufw allow from 192.168.1.100 to any port 3306
# 允许整个网段
sudo ufw allow from 192.168.1.0/24
# 只允许内网访问数据库端口
sudo ufw allow from 192.168.0.0/16 to any port 3306
3.4 删除规则
# 方法一:用 numbered 查看编号,再按编号删
sudo ufw status numbered
sudo ufw delete 3# 删除第3条规则
# 方法二:用原来添加规则的命令,把 allow 换成 delete
sudo ufw delete allow 80
sudo ufw delete allow from 192.168.1.100 to any port 3306
3.5 规则执行顺序
UFW 规则按顺序匹配,先匹配到的先生效。如果有冲突,靠前的规则优先。
# 在指定位置插入规则
sudo ufw insert 1 allow from 10.0.0.0/8# 插到第1条
四、应用程序配置文件
很多软件安装时会在/etc/ufw/applications.d/放一个配置文件,定义自己需要的端口组合,这样可以直接用程序名来配置规则。
# 查看所有应用程序配置
sudo ufw app list
# 查看某个应用的详细端口信息
sudo ufw app info OpenSSH
sudo ufw app info 'Nginx Full'
# 如果某个应用的配置不存在,可以手动创建一个/etc/ufw/applications.d/ 配置文件。
# 按应用名配置规则
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'# 同时开 80 和 443
sudo ufw allow 'Nginx HTTP'# 只开 80
sudo ufw allow 'Nginx HTTPS'# 只开 443
Nginx Full的配置文件内容示例(/etc/ufw/applications.d/nginx):
[Nginx HTTP]
title=Web Server (Nginx, HTTP)
description=Small, but very powerful and efficient web server
ports=80/tcp
[Nginx HTTPS]
title=Web Server (Nginx, HTTPS)
description=Small, but very powerful and efficient web server
ports=443/tcp
[Nginx Full]
title=Web Server (Nginx, HTTP + HTTPS)
description=Small, but very powerful and efficient web server
ports=80,443/tcp
五、限速——防 SSH 暴力破解
UFW 内置了限速功能,对同一个 IP 短时间内的连接次数做限制,能有效防止暴力破解 SSH 密码。
# 对SSH端口启用限速(30秒内超过6次连接则暂时封禁)
sudo ufw limit ssh
sudo ufw limit 22/tcp# 等价写法
# 这个阈值对正常 SSH 使用没有影响,但如果频繁使用 rsync 或 scp 短时间建立多个连接,可能会触发限制。
效果:同一个IP 在 30 秒内如果发起超过 6 次 TCP 连接,后续连接请求会被丢弃,冷静一段时间后自动恢复。
💡提示:这个功能配合密钥登录一起用效果更好。密钥登录即使密码被暴力尝试也没用,限速则进一步减少无效连接对服务器的骚扰。
六、日志配置
# 开启日志记录
sudo ufw logging on
# 设置日志级别(low/medium/high/full)
sudo ufw logging medium
# 关闭日志
sudo ufw logging off
日志写到/var/log/ufw.log,可以用来排查是否有异常访问:
# 实时查看最新日志
sudo tail -f /var/log/ufw.log
# 如果想看被拒绝的请求来源,可以筛选 BLOCK并提取 SRC= 字段。
# 查看被拒绝的连接
sudo grep "BLOCK" /var/log/ufw.log | tail -20
日志格式里的关键字段:
字段 | 含义 |
SRC= | 来源 IP |
DPT= | 目标端口 |
PROTO= | 协议(TCP/UDP) |
[UFW BLOCK] | 被拒绝的连接 |
[UFW ALLOW] | 被允许的连接 |
七、常见服务配置方案
7.1 Web 服务器(HTTP + HTTPS)
sudo ufw allow 'Nginx Full'
# 或者
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
7.2 SSH(带限速)
# 如果 SSH 用默认 22 端口
sudo ufw limit ssh
# 如果 SSH 改了端口(比如改成 2222)
sudo ufw limit 2222/tcp
7.3 数据库(只允许内网或特定 IP)
# MySQL/MariaDB - 只允许内网访问
sudo ufw allow from 192.168.1.0/24 to any port 3306
# PostgreSQL - 只允许指定IP访问
sudo ufw allow from 10.0.0.5 to any port 5432
# Redis - 只允许本机(通常Redis只监听127.0.0.1就够了,不需要UFW规则)
# 如果Redis监听了0.0.0.0,一定要加规则:
sudo ufw deny 6379# 默认拒绝,不对外暴露
⚠️注意:数据库端口绝对不能对公网开放,这是常见的服务器被入侵原因之一。
7.4 邮件服务器
sudo ufw allow 25/tcp# SMTP
sudo ufw allow 587/tcp# SMTP提交
sudo ufw allow 993/tcp# IMAPS
sudo ufw allow 995/tcp# POP3S
7.5 游戏服务器 / 自定义端口
# Minecraft服务器
sudo ufw allow 25565/tcp
# 自定义UDP端口(游戏/语音通信)
sudo ufw allow 7777/udp
7.6 开发机(只允许本机访问)
# 拒绝外部访问开发端口
sudo ufw deny 3000# Node.js开发服务器
sudo ufw deny 8080# 测试Web服务
# (这些服务监听127.0.0.1的话本来就不对外,加规则是双重保险)
八、VPS 服务器推荐配置
刚买了 VPS,从零配 UFW 的标准流程:
# 第一步:设置默认策略
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 第二步:允许SSH(必须在启用之前做!)
sudo ufw allow ssh
# 如果SSH改了端口
sudo ufw allow 2222/tcp
# 第三步:按需开放其他端口
sudo ufw allow http# Web服务
sudo ufw allow https# HTTPS
# sudo ufw allow 25/tcp# 邮件(按需)
# 第四步:对SSH启用限速
sudo ufw limit ssh
# 第五步:启用UFW
sudo ufw enable
# 第六步:验证规则
sudo ufw status verbose
验证后,可以新开一个 SSH 窗口测试连接,确认没问题再关掉当前窗口。
⚠️警告:第二步必须在第五步之前做,否则启用 UFW 后就被锁在外面了,只能去云厂商控制台用 VNC 救机。
九、UFW 与云厂商安全组的关系
如果用的是阿里云、腾讯云、AWS 这类云服务,它们在云平台层面有"安全组",UFW 是操作系统层面的防火墙。两者是叠加关系:
外网流量 → 云安全组(云平台层) → UFW(操作系统层) → 应用程序
流量要到达应用,两层都要放行。所以:
·云安全组开了80 端口,但 UFW 没开 → 访问不了
·UFW 开了 80 端口,但云安全组没开 → 访问不了
·两边都开了 → 才能访问
💡提示:排查端口不通时,先检查云安全组,再检查 UFW,两层都要检查,否则可能走冤枉路。很多人只改了 UFW 忘了云安全组,或者只改了安全组忘了服务器上还有 UFW。
十、常用命令速查表
基础操作
命令 | 说明 |
sudo ufw status | 查看状态和规则 |
sudo ufw status numbered | 查看规则(带编号) |
sudo ufw enable | 启用防火墙 |
sudo ufw disable | 禁用防火墙 |
sudo ufw reset | 重置所有规则 |
sudo ufw reload | 重载规则(不中断连接) |
规则管理
命令 | 说明 |
sudo ufw allow 端口 | 允许端口 |
sudo ufw deny 端口 | 拒绝端口 |
sudo ufw limit 端口 | 限速(防暴力破解) |
sudo ufw delete N | 按编号删除规则 |
sudo ufw delete allow 端口 | 按规则内容删除 |
sudo ufw insert 1 allow 端口 | 在首位插入规则 |
按来源配置
命令 | 说明 |
sudo ufw allow from IP | 允许特定IP所有端口 |
sudo ufw allow from IP to any port 端口 | 允许特定IP访问特定端口 |
sudo ufw allow from 网段/掩码 | 允许整个网段 |
日志
命令 | 说明 |
sudo ufw logging on | 开启日志 |
sudo ufw logging medium | 设置日志级别 |
sudo tail -f /var/log/ufw.log | 实时查看日志 |
sudo grep BLOCK /var/log/ufw.log | 查看被拒绝的连接 |
小结
UFW 的核心逻辑其实很简单:
1.默认入站全拒绝,出站全放行
2.按需开放需要对外的端口
3.数据库等内部服务只允许内网或特定 IP 访问
4.SSH 端口加限速,防暴力破解
5.启用之前先确认 SSH 端口已放行,别把自己锁在外面
防火墙不是万能的,但它是服务器安全的第一道门。配好 UFW,再配合 SSH 密钥登录(不用密码)、定期更新系统,普通 VPS 的安全基线就算达到了。
下一篇:磁盘空间管理与清理,聊一聊 du/df/ncdu找大文件,以及 apt/日志/缓存的清理方法。