概述
买完 VPS 第一件事不是装软件,而是开防火墙。裸奔的服务器每天会被扫描数百次,弱密码一旦中招就是挖矿木马或数据泄露。
UFW(Uncomplicated Firewall)是 Ubuntu/Debian 自带的防火墙工具,比 iptables 简单十倍,但功能足够用。本文带你从零配置一套生产可用的防火墙策略。
准备工作
你需要以下条件:
- 一台运行 Ubuntu 20.04+ 或 Debian 11+ 的 VPS
- SSH 登录权限(root 或 sudo 用户)
- 你的 VPS IP 地址(防止把自己锁在外面)
- 约 2 分钟操作时间
关键提醒:在断开 SSH 之前,一定要确保允许了 SSH 端口(默认 22),否则你会被自己关在门外。
步骤
第一步:安装并检查 UFW 状态
大多数 Ubuntu 镜像已经预装了 UFW。如果没有,手动装一下:
sudo apt update
sudo apt install ufw -y
查看当前状态:
sudo ufw status verbose
刚装好的输出通常是 Status: inactive,说明防火墙没生效,服务器处于开放状态。
第二步:设置默认策略
先定规矩:默认拒绝所有入站连接,默认允许所有出站连接。
sudo ufw default deny incoming
sudo ufw default allow outgoing
这样只有你明确放行的端口才能被外部访问。出站全开是因为你的服务器需要正常上网——拉代码、调 API、更新软件。
第三步:放行必要端口
按顺序放行以下端口:
SSH 端口(必须最先放行)
sudo ufw allow 22/tcp
如果你改了 SSH 端口(比如改成了 2222),就放行新端口:
sudo ufw allow 2222/tcp
Web 服务端口
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
其他常用端口(按需放行)
# Docker 映射的自定义端口
sudo ufw allow 8080/tcp
# Redis(建议只允许内网访问,见下面 IP 限制部分)
sudo ufw allow 6379/tcp
# PostgreSQL
sudo ufw allow 5432/tcp
第四步:限制 SSH 登录来源(强烈推荐)
如果你的 VPS 公网暴露 SSH,每天会有大量暴力破解尝试。加一个 IP 白名单:
# 假设你的家庭或公司 IP 是 123.45.67.89
sudo ufw delete allow 22/tcp
sudo ufw allow from 123.45.67.89 port 22 proto tcp
这样只有你的 IP 能连 SSH。换网络时记得更新规则。
不知道自己的 IP?去浏览器访问 https://ifconfig.me 查看。
第五步:启用 UFW
所有规则配好后,正式开启防火墙:
sudo ufw enable
会提示 Command may disrupt existing ssh connections. Proceed with operation (y|n)?,输入 y 回车。
再次检查状态:
sudo ufw status verbose
你应该看到类似这样的输出:
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp ALLOW IN 123.45.67.89
80/tcp ALLOW IN Anywhere
443/tcp ALLOW IN Anywhere
2222/tcp ALLOW IN Anywhere
第六步:日常维护命令
记住这几个常用命令,够用了:
# 查看完整规则列表(含编号)
sudo ufw status numbered
# 删除某条规则(按编号删除最方便)
sudo ufw delete 3
# 放行一个范围端口(比如 3000-3010)
sudo ufw allow 3000:3010/tcp
# 阻止某个 IP(比如发现暴力破解)
sudo ufw deny from 192.168.1.100
# 重置所有规则(慎用!)
sudo ufw reset
第七步:配合 fail2ban 自动封 IP
UFW 管规则,fail2ban 管自动封禁。两者搭配效果最好:
sudo apt install fail2ban -y
# 创建自定义配置
sudo mkdir -p /etc/fail2ban/jail.d/
sudo tee /etc/fail2ban/jail.d/ufw-custom > /dev/null << 'EOF'
[sshd]
enabled = true
port = 22
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
findtime = 600
EOF
sudo systemctl enable fail2ban
sudo systemctl restart fail2ban
连续 3 次 SSH 登录失败,fail2ban 会通过 UFW 自动封禁该 IP 一小时。
验证
配置完成后,用以下步骤确认防火墙正常工作:
# 1. 确认 UFW 处于 active 状态
sudo ufw status | grep "Status: active"
# 2. 从另一台机器测试 SSH 连接
ssh user@your-vps-ip
# 3. 测试 Web 端口是否可达
curl -I http://your-vps-ip:80
# 4. 测试一个未放行的端口(应该被拒绝)
telnet your-vps-ip 9999
# 如果连接被拒或超时,说明防火墙生效了
# 5. 查看 fail2ban 封禁记录
sudo fail2ban-client status sshd
第 4 步是最关键的验证——如果 9999 端口能被连上,说明 UFW 没生效,需要回头检查。
常见问题
问:我把 SSH 端口改了,忘了放行,现在连不上了怎么办?
登录云服务商的控制台,用 VNC 或"串行控制台"登录服务器,执行:
sudo ufw allow 你的新端口/tcp
sudo ufw reload
VNC 走的是虚拟控制台,不走防火墙,所以永远能用。
问:Docker 容器端口为什么没生效?
Docker 会直接修改 iptables 底层链,可能绕过 UFW。解决方法:
# 编辑 Docker 配置
sudo tee /etc/docker/daemon.json > /dev/null << 'EOF'
{
"iptables": false
}
EOF
sudo systemctl restart docker
sudo systemctl restart ufw
然后手动用 UFW 放行 Docker 端口。
问:UFW 会影响服务器性能吗?
基本不会。UFW 只是 iptables 的前端封装,规则匹配在毫秒级别。除非你有上百万条规则,否则完全感知不到延迟。
问:CentOS/RHEL 用什么代替 UFW?
CentOS 用 firewalld 或直接配 iptables。命令不一样但思路相同:默认拒绝入站,逐个放行需要的端口。
问:怎么备份 UFW 规则?
# 备份
sudo cp /etc/ufw/user.rules /etc/ufw/user.rules.bak
sudo cp /etc/ufw/user6.rules /etc/ufw/user6.rules.bak
# 恢复
sudo ufw disable
sudo cp /etc/ufw/user.rules.bak /etc/ufw/user.rules
sudo ufw reload
sudo ufw enable
防火墙不是装完就完了的事。每周花两分钟跑一次 sudo ufw status 看看有没有多余的开放端口,养成好习惯比任何安全软件都管用。你的 VPS 开了哪些端口?有没有漏掉的?