ufw 防火墙:关闭不需要的端口
如何在五分钟内配置 ufw:放行必要端口,关闭其余端口,按地址限制访问,以及避免切断自己的 SSH。
更新于 2026年8月23日
在一台全新的机器上,所有监听网络的服务都是开放的。有些服务是您主动安装的,有些则是随软件包一起装上的。防火墙可以一次性解决这个问题:除了您列出的内容,其余全部拒绝。
ufw 是对内核规则的一层简单封装。在绝大多数情况下它已经够用;更复杂的配置请参阅 nftables 一文。
基本配置
apt install -y ufw
ufw default deny incoming
ufw default allow outgoing
ufw allow 22/tcp
ufw enable
ufw status verbose
这里的顺序很重要:SSH 规则要在启用之前添加。否则 ufw enable 会切断您的连接,您只能通过面板控制台 /hosting/vds/m/<id> 或救援模式重新进入。
面板中的控制台独立于网络运行,所以您不会把自己彻底锁在外面——但这会浪费时间。
常用规则
ufw allow 80/tcp
ufw allow 443/tcp
ufw allow from 203.0.113.5 to any port 22 proto tcp
ufw limit 22/tcp
ufw delete allow 80/tcp
ufw status numbered
ufw delete 3
ufw limit 会限制在 30 秒内发起超过六个连接的来源——这是防范密码暴力破解的廉价手段。完成同样任务且更精细的工具是 fail2ban。
allow from 规则适用于不应公开的服务:数据库、管理面板、指标导出器。
ufw allow from 203.0.113.5 to any port 5432 proto tcp
验证结果
ufw status verbose
ss -tulpn
ss 显示系统正在监听什么,ufw status 显示外部允许通过什么。两个列表的差集就是您已关闭的服务,这很正常。反过来才糟糕:某个端口在 ufw 中是开放的,却没有监听者。
从外部检查时,请用端口而不是 ping:
nc -vz <address> 443
Docker 与 ufw
如果机器上运行着 Docker,请注意:容器端口转发在内核链中处理,早于 ufw 规则。用 -p 5432:5432 启动的容器,即使 ufw status 显示 deny,也能从外部访问。请把这类端口绑定到本地接口:
docker run -p 127.0.0.1:5432:5432 postgres
常见错误
| 错误 | 后果 | 解决方法 |
|---|---|---|
未添加 SSH 规则就执行 ufw enable | 失去网络访问 | 通过面板控制台进入,执行 ufw allow 22/tcp |
| 修改了 SSH 端口,却保留了旧规则 | 同样的问题 | 先加规则,再改端口 |
| 端口开放,服务却不响应 | 服务监听在 127.0.0.1 | 修改绑定地址 |
| 尽管是 deny,容器仍可访问 | Docker 绕过了 ufw | 绑定到 127.0.0.1 |
在关闭某个端口之前,先运行
ss -tulpn,确认您清楚上面运行着什么。被关掉的监控端口,之后看起来就像“服务挂了”。