一份实用的分步指南,教你用 UFW 防火墙和 Fail2ban 入侵防御加固 Linux 服务器——关闭闲置端口、限速 SSH,并自动封禁暴力破解攻击者。
你将搭建什么
互联网上每一台对外开放的服务器,上线几分钟内就会被探测——自动化机器人会扫描开放端口,并不停地对 SSH 进行凭据猜测。两款轻量、久经考验的工具就能为你应对其中绝大部分情况:
- UFW(Uncomplicated Firewall,简易防火墙)——
iptables/nftables的友好前端,用于控制哪些端口处于开放状态。 - Fail2ban——监视日志文件中反复出现的登录失败,并临时封禁发起攻击的 IP 地址。
本教程将带你在 Debian 或 Ubuntu 服务器上完成这两款工具的配置(在其他发行版上的命令也几乎相同)。无论你运行的是云服务器、VPS 还是独立主机都同样适用,本文也是我们沙特阿拉伯 VPS 与云服务器知识专题的一部分。
前置条件
- 一台你能通过 SSH 访问的 Linux 服务器。
- 一个具备
sudo权限的用户(切勿在没有备用恢复手段的情况下,通过对外暴露的连接以root身份执行这些操作)。 - 你的 SSH 端口(默认是
22;如果你修改过,请在全文中使用你的实际端口值)。
警告: 防火墙可能把你自己挡在门外。在启用 UFW 之前,请确保放行 SSH 的规则已经就位。如果你使用云服务商,请保持其网页控制台或恢复访问通道处于可用状态,以便在操作失误时能够恢复。
步骤 1 — 安装并配置 UFW
大多数 Ubuntu 镜像都自带 UFW。如有需要可按如下方式安装:
sudo apt update
sudo apt install ufw
设置合理的默认策略——拒绝所有入站流量,放行所有出站流量:
sudo ufw default deny incoming
sudo ufw default allow outgoing
这是良好防火墙策略的核心:除非你明确放行,否则没有任何流量能够到达你的服务。
步骤 2 — 放行你确实需要的服务
在开启防火墙之前,先打开服务器所使用的端口。务必首先放行 SSH,否则你会被断开连接:
sudo ufw allow OpenSSH
UFW 会从 /etc/ufw/applications.d 读取命名的应用配置文件。使用 sudo ufw app list 可列出可用的配置。如果你修改过 SSH 端口,请改为显式放行该端口:
sudo ufw allow 2222/tcp
如果你运行网站或商务邮件与 Web 服务,请放行 Web 流量:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
你可以将某条规则限制为仅允许受信任的来源——例如,只允许从你的应用服务器访问数据库:
sudo ufw allow from 10.0.0.5 to any port 3306 proto tcp
步骤 3 — 对 SSH 限速并启用防火墙
UFW 的 limit 规则会对任何在 30 秒内尝试连接超过 6 次的 IP 进行限流——这是一道成本低廉却行之有效的减速带,可用来对抗暴力破解工具:
sudo ufw limit OpenSSH
现在启用防火墙:
sudo ufw enable
通过带编号的列表确认你的规则:
sudo ufw status numbered
预期输出类似如下:
Status: active
To Action From
-- ------ ----
[ 1] OpenSSH LIMIT Anywhere
[ 2] 80/tcp ALLOW Anywhere
[ 3] 443/tcp ALLOW Anywhere
要删除某条规则,引用其编号即可:sudo ufw delete 2。
步骤 4 — 安装 Fail2ban
UFW 负责关闭端口,但那些你必须保持开放的端口(比如 SSH)仍然暴露在猜测攻击之下。Fail2ban 会监视日志并封禁屡次作案者:
sudo apt install fail2ban
在现代系统上,Fail2ban 通过 systemd 读取日志,因此开箱即用。确认服务正在运行:
sudo systemctl status fail2ban
步骤 5 — 使用 jail.local 文件配置 Fail2ban
切勿直接编辑 jail.conf——它会在升级时被覆盖。请改为创建一个本地覆盖文件:
sudo nano /etc/fail2ban/jail.local
添加以下内容:
[DEFAULT]
# Don't ban your own trusted networks. Add your office/home IP.
ignoreip = 127.0.0.1/8 ::1
# How long a ban lasts (10 minutes).
bantime = 10m
# Time window for counting failures.
findtime = 10m
# Failures allowed before a ban.
maxretry = 5
# Tell Fail2ban to act through UFW.
banaction = ufw
[sshd]
enabled = true
[sshd] jail 使用位于 /etc/fail2ban/filter.d/sshd.conf 的内置 sshd 过滤器。设置 banaction = ufw 会让 Fail2ban 通过你现有的防火墙插入拒绝规则,而不是直接操作原始的 iptables。
重启以使配置生效:
sudo systemctl restart fail2ban
步骤 6 — 验证与监控
检查整体状态,以及专门查看 SSH jail 的状态:
sudo fail2ban-client status
sudo fail2ban-client status sshd
jail 状态会显示当前失败和被封禁的 IP:
Status for the jail: sshd
|- Filter
| |- Currently failed: 1
| |- Total failed: 23
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 1
|- Total banned: 4
`- Banned IP list: 203.0.113.42
要手动解封某个地址:
sudo fail2ban-client set sshd unbanip 203.0.113.42
推荐的基线配置
| 设置项 | 取值 | 原因 |
|---|---|---|
| UFW 入站默认策略 | deny |
默认全部关闭 |
| SSH 规则 | limit |
减缓暴力破解 |
bantime |
10m–1h |
惩罚屡次作案者 |
maxretry |
3–5 |
严格但能容忍手误 |
ignoreip |
你的管理 IP | 避免把自己锁在门外 |
更进一步
对于生产服务器,还应为你所暴露的任何服务启用相应的 jail(例如 nginx-http-auth 或你的邮件栈),使用 SSH 密钥代替密码,并考虑设置更长或递增的 bantime。UFW 和 Fail2ban 是一套强有力的基线,而非完整的安全方案——请保持软件包持续打补丁,并使用云备份定期备份。
将你的业务负载托管在沙特境内,对性能以及满足 PDPL、NCA 和 SDAIA 的数据本地化要求都至关重要。Skyline Cloud 在沙特阿拉伯境内运营云服务器、VPS 和独立硬件,提供本地阿拉伯语支持和透明的定价。
准备好部署一台已加固的服务器了吗? 创建你的 Skyline Cloud 账户,几分钟即可启动一台 VPS。
Comments
0 total · 0 threads