UFW最小权限配置核心是:先执行sudo ufw default deny incoming和allow outgoing设默认策略,再显式开放必需端口(如443/tcp、2222/tcp),严格限制来源IP,最后通过ufw status numbered、ss -tlnp和外部真实测试验证。

直接按最小权限原则操作,UFW 的设计就是为简化这件事。核心思路是:先拒绝所有入站,再逐个放行真正需要的端口,不加多余规则、不依赖默认服务名、不开放整段范围。
第一步:设默认策略,堵死所有入口
这是最关键的起点,不做这步,后续所有 allow 都可能失效或被绕过。
- 执行 sudo ufw default deny incoming —— 所有外部连接默认拒绝
- 执行 sudo ufw default allow outgoing —— 保证服务器能正常发请求(如更新、调用 API)
- 确认设置生效:sudo ufw status verbose 中应看到两行 “Default: deny (incoming), allow (outgoing)”
第二步:只开生产真用的端口,不写服务名
用服务名(如 sudo ufw allow http)看似方便,但实际映射依赖系统配置,容易因环境差异出错。生产环境建议显式指定端口+协议。
- Web 流量:只开 sudo ufw allow 443/tcp(HTTPS),除非明确需要 HTTP,否则不开放 80
- 管理通道:若必须 SSH,用 sudo ufw allow 2222/tcp(非默认端口更安全),并确保已修改
/etc/ssh/sshd_config中的 Port - API 或后台服务:比如 Node.js 应用监听 3001,则只写 sudo ufw allow 3001/tcp
- 避免写
80,443/tcp这类批量语法——万一其中某个端口后期停用,容易遗忘清理
第三步:限制访问来源,缩小暴露面
哪怕开了端口,也不该对全网开放。尤其管理类端口,必须绑定可信 IP。
- SSH 只允运维机访问:sudo ufw allow from 203.122.10.45 to any port 2222 proto tcp
- 监控端点(如 Prometheus)只允许内网采集:sudo ufw allow from 10.0.2.0/24 to any port 9090 proto tcp
- 禁止用
any或省略from—— 没有明确来源的 allow 规则,在生产里等于没设防
第四步:验证与收尾,不靠“看起来正常”
规则写了≠生效了≠服务真能通。必须分层验证:
- 查规则是否写入:sudo ufw status numbered,确认列表中只有你手动加的几条,且顺序合理(allow 在 deny 前)
- 查服务是否监听外网:ss -tlnp | grep ':443',输出中应含
*:443或0.0.0.0:443,而非127.0.0.1:443 - 从外部真实测试:curl -I https://your-domain.com 或用 telnet 测端口连通性,别只信本地
nc -zv 127.0.0.1 443 - 启用前务必留好应急通道(如云平台控制台 VNC),防止误锁

















