第一部分:核心概念与安装检查
1. UFW 状态检查
首先,检查 UFW 是否已安装及当前状态。
bash
# 查看状态 (Status: inactive 表示未启用,active 表示已启用)
sudo ufw status verbose
# 如果命令未找到,请先安装
# Ubuntu/Debian:
sudo apt update && sudo apt install ufw
# CentOS/RHEL (通常需要先启用EPEL仓库):
sudo yum install epel-release
sudo yum install ufw
sudo systemctl enable ufw --now
2. 云服务器的关键警告:确保不会锁死自己!
在云服务器上配置防火墙,最重要的一条原则 是:在启用 UFW 之前,必须确保允许你当前 SSH 连接的端口! 否则规则一旦生效,你会立刻被断开连接并无法再登录。
大多数云服务商(如 AWS、Azure、Google Cloud、阿里云、腾讯云)都有自己的安全组(Security Group) 机制。这是一个运行在云平台网络层面的防火墙,独立于你服务器内部的 UFW 或 iptables。
最佳实践建议:
-
方法一(推荐): 优先使用云平台的安全组来设置主要的访问控制(如只允许你的IP访问SSH端口)。然后使用 UFW 作为服务器内部的第二道防线,管理应用层面的端口(如HTTP/HTTPS)。这样可以避免因配置失误导致服务器失联。
-
方法二: 如果只想用 UFW,务必在执行下一步之前,先允许你的 SSH 端口。
第二部分:UFW 基本配置流程
步骤 1:重置为初始状态(可选)
如果你是第一次配置或想重新开始,可以先重置 UFW。
bash
sudo ufw disable # 先禁用
sudo ufw reset # 重置所有规则
步骤 2:设置默认策略
设置默认策略是安全的基础。推荐的策略是默认拒绝所有传入连接,允许所有传出连接。这样服务器主动向外发起的连接是允许的,而外部未经允许的入站连接都会被拒绝。
bash
sudo ufw default deny incoming # 默认拒绝所有入站流量
sudo ufw default allow outgoing # 默认允许所有出站流量
步骤 3:允许必要的端口
根据你的服务器角色,允许特定的服务或端口。
-
允许 SSH 连接(这是第一步,至关重要!)
bash
# 如果你的SSH端口是标准的22(强烈建议更改默认端口) sudo ufw allow ssh # 或者直接指定端口号,例如允许端口 2222 sudo ufw allow 2222/tcp
重要:如果你修改了 SSH 端口,这里一定要指定你实际使用的端口号。
-
允许 Web 服务
bash
# 允许 HTTP (80) 和 HTTPS (443) sudo ufw allow http sudo ufw allow https # 等价于 sudo ufw allow 80/tcp sudo ufw allow 443/tcp
-
允许其他应用(按需)
bash
# 允许 MySQL (3306) sudo ufw allow 3306/tcp # 允许自定义端口,如 3000 端口的Node.js应用 sudo ufw allow 3000/tcp # 允许来自特定IP的访问,例如只允许IP 1.2.3.4 访问SSH sudo ufw allow from 1.2.3.4 to any port 22
步骤 4:启用 UFW
在确认已允许 SSH 端口后,启用防火墙使规则生效。
bash
sudo ufw enable
系统会提示"命令可能会破坏现有的 SSH 连接,是否继续?",因为你已经允许了 SSH 端口,所以输入 y
并回车。
步骤 5:验证规则
再次查看状态,确认规则已按预期添加。
bash
sudo ufw status verbose
# 或者以编号形式显示,便于管理
sudo ufw status numbered
输出示例:
text
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp ALLOW Anywhere
80/tcp ALLOW Anywhere
443/tcp ALLOW Anywhere
2222/tcp ALLOW Anywhere
22/tcp (v6) ALLOW Anywhere (v6)
80/tcp (v6) ALLOW Anywhere (v6)
443/tcp (v6) ALLOW Anywhere (v6)
2222/tcp (v6) ALLOW Anywhere (v6)
第三部分:高级管理与常用命令
1. 拒绝连接
bash
# 明确拒绝某个端口的所有连接(连接方会收到“拒绝”响应)
sudo ufw deny 8000/tcp
2. 删除规则
有两种方法,推荐使用 numbered
方式。
-
方法A(通过规则本身删除):
bash
sudo ufw delete allow http # 删除当初添加的 'allow http' 规则
-
方法B(通过编号删除,更安全直观):
bash
sudo ufw status numbered # 查看带编号的规则列表 sudo ufw delete 2 # 删除编号为 2 的规则
3. 限制访问(模拟fail2ban)
limit
规则可以自动限制某端口的频繁连接,用于防止暴力破解,非常有用。
bash
# 对SSH端口启用limit规则,默认是每分钟最多6次连接,超过则拒绝
sudo ufw limit ssh
# 或者指定端口
sudo ufw limit 2222/tcp
4. 禁用 UFW
如果需要临时关闭防火墙(排查问题等)。
bash
sudo ufw disable
5. 查看 UFW 的日志
UFW 的日志位于 /var/log/ufw.log
。查看被拒绝的连接尝试,有助于排查问题。
bash
sudo tail -f /var/log/ufw.log
第四部分:云服务器特定场景示例
场景:部署一个 Web 应用
假设你的应用使用端口 3000
,并且使用 Nginx 作为反向代理。
-
UFW 配置:
bash
# 设置默认策略 sudo ufw default deny incoming sudo ufw default allow outgoing # 允许SSH(你的自定义端口,例如2222) sudo ufw allow 2222/tcp # 允许HTTP和HTTPS(Nginx将处理这些请求并代理到3000端口) sudo ufw allow http sudo ufw allow https # 通常不需要直接对外开放3000端口,因为Nginx在内部访问它 # 如果你的应用集群需要内部通信,可以允许内网IP段 # sudo ufw allow from 10.0.0.0/8 to any port 3000 # 启用UFW sudo ufw enable
场景:锁紧服务器,只允许特定管理IP访问SSH
bash
# 先清空现有规则
sudo ufw reset
# 设置默认策略
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 假设你的办公室公网IP是 203.0.113.100
sudo ufw allow from 203.0.113.100 to any port 2222
# 允许所有IP访问Web服务
sudo ufw allow http
sudo ufw allow https
# 谨慎地启用UFW,并确保你有其他方式访问服务器(如云控制台的VNC)以防配错
sudo ufw enable
总结
-
顺序是关键 :
默认拒绝 -> 允许SSH -> 允许其他服务 -> 启用
。 -
云平台安全组:理解并利用好云服务商提供的安全组,它与 UFW 是双重保险。
-
切勿锁死自己 :确保在
ufw enable
前,SSH 规则已正确添加。 -
使用
status numbered
来管理规则比回忆规则本身更容易。 -
善用
limit
规则来保护 SSH 等敏感服务。