拒绝裸奔!Ubuntu 服务器 SSH 安全加固终极指南(修改端口 + UFW + Fail2ban)

前言:你的服务器正在被“暴力破解”吗?

如果你有一台刚刚开通的云服务器,并且还在使用默认的 22 端口,那么我很遗憾地告诉你:你的服务器此刻正遭受着来自全球各地的机器人脚本扫描。

不信?打开终端输入以下命令,看看是不是满屏的红色报警?

Bash
sudo grep "Failed password" /var/log/auth.log

虽然强密码可以抵挡大部分攻击,但这种无休止的骚扰会消耗服务器资源,且总有“万一”被撞库成功的风险。今天,我将手把手带你给 Ubuntu 服务器穿上“三级防弹衣”:

  1. 修改 SSH 默认端口(隐身术)
  2. 配置 UFW 防火墙(门卫)
  3. 部署 Fail2ban(自动反击系统)

⚠️ 核心警告(操作前必读)

在进行任何网络和 SSH 配置修改时,请务必遵循**“留后门”原则**:在确认新配置 100% 生效前,**绝对不要关闭当前的 SSH 终端连接!**建议始终保持一个“保命”窗口开启。


第一步:配置 UFW 防火墙(先开门,再换锁)

很多新手容易犯的错误是先改 SSH 端口,重启服务后发现连不上了——因为防火墙没放行新端口。所以,我们的策略是:防火墙先行。

1.1 安装与初始化

Ubuntu 通常自带 UFW (Uncomplicated Firewall),如果没有,请安装:

Bash
sudo apt update && sudo apt install ufw -y

接下来设置默认策略:拒绝所有入站,允许所有出站。这是最安全的“白名单”模式。

Bash
sudo ufw default deny incoming
sudo ufw default allow outgoing

1.2 放行关键端口

假设我们要将 SSH 端口改为 2222(你可以选择 1024-65535 之间的任意未占用端口)。

关键操作: 同时放行新旧两个端口,防止后续配置失误导致失联。

放行未来的新端口

Bash
sudo ufw allow 2222/tcp

临时保留当前的 22 端口(保命用)

Bash
sudo ufw allow 22/tcp

如果你有 Web 服务,别忘了放行 80 和 443

Bash
sudo ufw allow 80/tcp

如果你有 Web 服务,别忘了放行 80 和 443

Bash
sudo ufw allow 443/tcp

1.3 启用防火墙

Bash
sudo ufw enable

系统会提示:Command may disrupt existing ssh connections,输入 y 并回车即可。

1.4 查看确认防火墙规则

Bash
sudo ufw status

第二步:修改 SSH 配置文件(隐身术)

默认的 22 端口是黑客脚本的首选目标,改成非标准端口可以过滤掉 99% 的自动化扫描。

2.1 编辑配置文件

使用你喜欢的编辑器(nano 或 vim)打开 SSH 配置:

Bash
sudo nano /etc/ssh/sshd_config

2.2 修改核心参数

找到以下几项进行修改(如果前面有 # 号,请去掉):

  1. 修改端口:找到 Port 22,将其改为 Port 2222
  2. 禁止 Root 直接登录(可选但推荐):找到 PermitRootLogin,改为 no

注意:请确保你已经创建了一个拥有 sudo 权限的普通用户,否则你会把自己锁在外面!

2.3 重启 SSH 服务

Bash
sudo systemctl restart ssh

🚨 2.4 生死攸关的测试

此时千万不要关闭当前窗口! 请新开一个终端(或 Putty)窗口,尝试用新端口连接:

Bash
ssh -p 2222 用户名@你的服务器IP

如果能成功登录,恭喜你!你可以放心地断开旧连接了。


第三步:部署 Fail2ban(自动反击)

改了端口只是“隐身”,如果被定向攻击怎么办?我们需要 Fail2ban 这个保安:它会监控日志,发现短时间内多次输错密码的 IP,直接调用防火墙将其封禁。

3.1 安装 Fail2ban

Bash
sudo apt install fail2ban -y

3.2 创建本地配置文件

切记: 不要直接修改 /etc/fail2ban/jail.conf,因为软件更新会覆盖它。我们需要创建一个 .local 副本,它的优先级更高。

Bash
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

3.3 配置监控规则

在文件中找到 [DEFAULT][sshd] 部分,重点修改以下内容。你可以直接复制下面的配置覆盖对应部分:

INI
[DEFAULT]
# 白名单:千万把自己的公网 IP 加进去,防止手抖输错密码把自己封了
ignoreip = 127.0.0.1/8 ::1 你的IP地址

# 封禁时间:1小时
bantime  = 1h

# 统计窗口:10分钟内
findtime  = 10m

# 最大尝试次数:超过 3 次错误即封禁
maxretry = 3

[sshd]
enabled = true
# !!!这里必须改成你刚才修改的新端口!!!
port    = 2222
logpath = %(sshd_log)s
backend = systemd

3.4 启动服务与验证

Bash
sudo systemctl restart fail2ban

检查 Fail2ban 是否正在监控新端口:

Bash
sudo fail2ban-client status sshd

如果你看到 Status for the jail: sshd 且相关数据正常,说明配置成功。


第四步:清理战场与最后检查

既然新端口 2222 已经工作正常,为了安全起见,我们需要关闭旧的 22 端口。

1、删除 UFW 规则

Bash
sudo ufw delete allow 22/tcp

2、再次查看防火墙状态

Bash
sudo ufw status verbose

确认只有 2222、80、443 等必要端口是 ALLOW 状态。


💡 特别提醒:云服务器用户必看

如果你使用的是 阿里云、腾讯云、华为云、AWS (EC2) 等云服务商,仅仅在 Ubuntu 内部配置 UFW 是不够的!

你必须登录云控制台,找到**“安全组” (Security Group)** 或 “防火墙” 设置:

  1. 添加:TCP 协议,端口 2222,源 IP 0.0.0.0/0(允许所有)。
  2. 删除:原有的 TCP 22 端口规则。

如果不做这一步,云厂商的硬件防火墙会直接拦截你的连接请求,导致你无法登录。


总结

现在,你的服务器已经拥有了三重防护:

  1. UFW 挡住了所有非必须的端口访问。
  2. 非标端口 躲过了 99% 的全网批量扫描。
  3. Fail2ban 像个狙击手一样,谁敢暴力破解就封谁的 IP。

安全是一个动态的过程,没有绝对的安全,只有更高的攻击成本。希望这份教程能帮你的服务器“稳如泰山”!

Comments

No comments yet. Why don’t you start the discussion?

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注