VPS安全:UFW防火墙配置于fail2ban配置
从旧博客迁移,原文写于2025/12/15,ai润色
恰逢黑色星期五,各大云服务器厂商都在打折,配置VPS的过程中难免涉及到服务器安全这里介绍两个常用的配置(以下内容经过验证并由AI辅助写作整理)
防火墙UFW
UFW (Uncomplicated Firewall) 是保护 VPS 的一道防线。通常来说暴露在公网的VPS需要禁用密码登入使用密钥登入
以下是配置 UFW 保护 SSH 端口的最佳实践步骤。
⚠️ 重要原则:顺序不能乱
一定要先允许 SSH 连接,然后再开启防火墙。 如果顺序反了,你一旦开启防火墙,SSH 连接会被立即切断,你就彻底无法登录了。
1. 检查 UFW 状态
Ubuntu 通常默认安装了 UFW,但处于关闭状态。先检查一下:
sudo ufw status
如果显示 Status: inactive,说明它还没开启,这是正常的。
2. 设置默认策略 (Base Policy)
在添加具体规则前,我们先设置“默认拒绝所有进入,默认允许所有出去”。这是最安全的策略。
sudo ufw default deny incoming
sudo ufw default allow outgoing
3. 配置 SSH 规则 (关键步骤)
对于 SSH 端口,有两种配置方式,强烈推荐第二种。
方式 A:普通允许 (Allow)
这是最基本的,允许所有 IP 连接 22 端口。
sudo ufw allow ssh
🌟 方式 B:限制频率 (Limit) —— 推荐!
limit 命令比 allow 更聪明。它允许连接,但如果同一个 IP 地址在 30 秒内尝试连接 6 次以上,就会自动拒绝该 IP。
这对于防止暴力破解(Brute-force attacks)非常有效,即使你已经用了密钥,这也能防止你的日志被大量的垃圾登录尝试填满。
sudo ufw limit ssh
注意: 如果你修改过 SSH 端口(比如改成了 2222),上面这两条命令要改成 sudo ufw limit 2222/tcp。
4. 开放其他必要端口
如果你的 VPS 是用来做网站的,别忘了开放 Web 服务的端口,否则别人打不开你的网页:
-
**HTTP (80):**Bash
sudo ufw allow 80/tcp -
**HTTPS (443):**Bash
sudo ufw allow 443/tcp
5. 启用防火墙
确认上面的 SSH 规则添加成功后,就可以正式启动防火墙了。
sudo ufw enable
- 系统会提示你:
Command may disrupt existing ssh connections. Proceed with operation (y|n)? - 输入
y并回车。只要你前面正确执行了第 3 步,当前的连接不会断开。
6. 验证状态
最后,检查一下所有规则是否生效:
sudo ufw status numbered
你应该能看到类似这样的输出:
Status: active
To Action From
-- ------ ----
[ 1] 22/tcp (Limit) LIMIT IN Anywhere
[ 2] 80/tcp ALLOW IN Anywhere
[ 3] 443/tcp ALLOW IN Anywhere
💡 进阶:如果你要把自己“反锁”了怎么办?
虽然概率很小,但如果你不小心配置错误导致无法 SSH 登录:
- 登录你的 VPS 提供商(如 AWS, DigitalOcean, Vultr, 阿里云等)的网页控制台。
- 找到 VNC Console 或 Web Console 功能(这相当于给服务器插上了显示器和键盘)。
- 通过网页控制台登录进去,输入
sudo ufw disable关闭防火墙,救回自己。
Fail2Ban
Fail2Ban 是服务器安全的最后一块重要拼图。如果说 SSH 密钥是“防盗门”,UFW 是“门卫”,那么 Fail2Ban 就是“智能监控系统”。
它会实时盯着服务器的日志,一旦发现某个 IP 在短时间内有多次可疑行为(比如试密码失败),它就会自动通知防火墙把这个 IP 关进“小黑屋”(Ban 掉)。
以下是快速安装和配置 Fail2Ban 的最佳实践。
1. 安装 Fail2Ban
首先更新软件源并安装:
sudo apt update
sudo apt install fail2ban -y
2. 复制配置文件 (关键步骤)
Fail2Ban 的默认配置文件在 /etc/fail2ban/jail.conf。
千万不要直接修改这个文件! 因为软件更新时它会被覆盖。我们需要复制一份名为 jail.local 的副本,系统会优先读取副本。
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
3. 配置规则
使用编辑器打开刚才复制的 jail.local 文件:
sudo nano /etc/fail2ban/jail.local
这里内容很多,不需要全看。请按 Ctrl + W 搜索以下关键词进行修改(或者直接在文件开头部分的 [DEFAULT] 区域找):
A. 基础设置 (Default)
找到 [DEFAULT] 区块,建议修改以下参数使其更严格:
-
bantime (封禁时间): 默认通常是
10m(10分钟)。对于恶意扫描,建议设长一点,比如 1天。bantime = 1d -
findtime (检测时间窗口):在此时间内重试次数达到上限则封禁
findtime = 10m -
maxretry (最大尝试次数): 允许失败几次?默认是 5。如果已经用了密钥,正常情况下不会输错密码,建议设为 3。
maxretry = 3
B. 联动 UFW (可选但推荐)
为了让 Fail2Ban 能够更干净地配合你刚才设置的 UFW,建议搜索 banaction 并修改:
banaction = ufw
(默认通常是 iptables-multiport,其实也能用,因为 UFW 底层也是 iptables,但改为 ufw 会让你在查看 ufw status 时看得到被封禁的 IP,更直观。)
C. 确认 SSH 监控开启
继续向下滚动(或搜索 [sshd]),找到 SSH 的专属配置区。确认它包含 enabled = true。通常 Ubuntu 默认已经开启了,但检查一下无妨:
[sshd]
enabled = true
# 这里的端口如果是默认22就不用动,如果你改过SSH端口,这里要写你的新端口,如 port = 2222
保存并退出 (Ctrl + O, Enter, Ctrl + X)。
4. 启动服务
配置完成后,启动 Fail2Ban 并设置为开机自启:
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
5. 验证是否生效
查看运行状态
输入以下命令查看 SSH 监狱(Jail)的状态:
sudo fail2ban-client status sshd
你会看到类似这样的输出: 比如在我的服务器上,刚刚配置完毕就发现了12次失败的登入,2个ip被拉黑了,通过反查发现这个ip是来自DigitalOcean,通常是控制的肉鸡服务器或自动扫描脚本。它正在互联网上无差别地扫描所有开放 22 端口的服务器。所以说暴露在公网中是十分不安全的。
~# sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 1
| |- Total failed: 12
| `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
|- Currently banned: 1
|- Total banned: 2
`- Banned IP list: 146.190.***.***
查看防火墙状态
如果你刚才设置了 banaction = ufw,你可以通过 UFW 看到被封禁的规则:
sudo ufw status
你会在底部看到类似 Anywhere (v6) DENY IN 192.168.1.100 的规则。
🚨 救命锦囊:如何解封 IP?
万一(虽然概率很小)你自己因为网络波动或其他原因被误封了,或者你想解封某个测试 IP,使用这个命令:
# 语法: sudo fail2ban-client set [监狱名] unbanip [IP地址]
sudo fail2ban-client set sshd unbanip 123.123.123.123
自动更新
设置“无人值守自动更新”(Unattended Upgrades)是一个非常明智的决定。它能确保你的服务器在第一时间修补最新的安全漏洞,而不需要你每天登录去检查。
在 Ubuntu 上,最标准的工具就是 unattended-upgrades。以下是配置它的完整步骤:
1. 安装与启用
大多数 Ubuntu VPS 默认已经安装了它,但为了保险起见,我们先确认安装并启动向导。
sudo apt update
sudo apt install unattended-upgrades
接下来,运行自动配置向导(这是最简单的方法):
sudo dpkg-reconfigure -plow unattended-upgrades
- 界面提示: 你会看到一个紫色的界面,问你是否要自动下载并安装稳定的更新。
- 操作: 选择 Yes 然后回车。
此时,系统已经配置好每天检查并安装安全类的更新了。
2. 进阶配置 (强烈推荐)
默认配置比较保守(不重启、不清理)。为了让服务器真正“省心”,我们需要编辑配置文件来开启自动重启和自动清理。
打开配置文件:
sudo nano /etc/apt/apt.conf.d/50unattended-upgrades
请在文件中找到以下几项,去掉前面的 //(注释符),并修改参数:
A. 开启自动重启 (关键)
很多内核级的安全漏洞(Kernel Security Update)必须重启才能生效。如果不自动重启,修补就不完整。
找到 Unattended-Upgrade::Automatic-Reboot 这一块:
// 启用自动重启
Unattended-Upgrade::Automatic-Reboot "true";
// 设置重启时间(建议设为凌晨业务低谷期,例如 04:00
// 如果服务器在国外最好换算到北京时间)
Unattended-Upgrade::Automatic-Reboot-Time "4:00";
(注意:这会导致你的服务器在凌晨短暂离线几分钟,请确保你的业务允许这样做。)
B. 自动清理旧内核 (防止磁盘撑爆)
VPS 的磁盘空间通常有限。每次内核更新都会留下旧文件,时间久了会把 /boot 分区占满。
找到 Unattended-Upgrade::Remove-Unused-Kernel-Packages:
// 更新后自动删除旧内核
Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";
同时也建议开启依赖清理:
Unattended-Upgrade::Remove-Unused-Dependencies "true";
修改完成后,保存并退出 (Ctrl+O, Enter, Ctrl+X)。
3. 调整更新频率 (可选)
检查一下 /etc/apt/apt.conf.d/20auto-upgrades 文件,确认里面的数字是 1。
cat /etc/apt/apt.conf.d/20auto-upgrades
你应该看到如下内容(如果没有,可以手动创建):
APT::Periodic::Update-Package-Lists "1"; // 每天更新软件列表
APT::Periodic::Unattended-Upgrade "1"; // 每天执行自动安装
如果是 0 表示禁用,7 表示每7天一次。1 是最佳实践。
4. 测试配置
配置完了,怎么知道它灵不灵?我们可以进行一次“空跑”测试(Dry Run),它会模拟运行但不会真的安装东西。
sudo unattended-upgrades --dry-run --debug
- 屏幕会滚动很多日志。
- 只要最后没有报错,并且看到类似
All upgrades installed或No packages found that can be upgraded的字样,说明配置成功了。
5. 查看日志
以后如果你想知道最近系统到底背着你偷偷更新了什么,可以查看日志文件:
cat /var/log/unattended-upgrades/unattended-upgrades.log
或者查看简短的历史记录:
less /var/log/apt/history.log