~
user@blog:~/posts/ufw-and-fail2ban.mdx
vim ufw-and-fail2ban.mdx

VPS安全:UFW防火墙配置于fail2ban配置

testuser_01
4 min read
706 words
Tags:
["Linux"]

从旧博客迁移,原文写于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 登录:

  1. 登录你的 VPS 提供商(如 AWS, DigitalOcean, Vultr, 阿里云等)的网页控制台。
  2. 找到 VNC ConsoleWeb Console 功能(这相当于给服务器插上了显示器和键盘)。
  3. 通过网页控制台登录进去,输入 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 installedNo packages found that can be upgraded 的字样,说明配置成功了。

5. 查看日志

以后如果你想知道最近系统到底背着你偷偷更新了什么,可以查看日志文件:

cat /var/log/unattended-upgrades/unattended-upgrades.log

或者查看简短的历史记录:

less /var/log/apt/history.log
cd ../ Back to list