切换语言
切换主题

Ubuntu 初始化全流程:用户、SSH、fail2ban 安全配置

引言

凌晨三点,我盯着终端里那行 “Permission denied” 的错误提示,背后直冒冷汗。

服务器进不去了。就因为我随手改了个 SSH 配置,忘了留个后路。

那是三年前我刚买第一台 VPS 的时候。现在想想,当时的操作简直就是教科书级别的反面教材:直接用 root 登录,密码设成生日,SSH 用默认 22 端口,防火墙?没听过。结果呢,服务器跑了不到两周就被扫爆了,日志里全是暴力破解的痕迹。

说实话,很多新手买完 VPS 后的第一反应是——赶紧装东西、部署项目。用户管理?SSH 加固?太麻烦了,以后再说吧。但偏偏这些”以后再说”的事,决定了你服务器能活多久。

这篇文章就干一件事:从零开始,把一台刚买的 Ubuntu 服务器(22.04 或 24.04)配置成安全可用的状态。用户权限、SSH 加固、fail2ban 自动封禁,一个不落。每一步我都会解释”为什么要这么做”,不只是给你一堆命令复制粘贴。

大概 10 分钟,你能走完这套流程。走完之后,你的服务器安全等级能超过网上 80% 的裸奔机器。

一、初始化前的准备工作

动工之前,先把工具备齐。你需要在本地生成一对 SSH 密钥。

为什么用密钥而不是密码? 简单说,密码能被暴力破解,密钥基本不可能。一个 256 位的 Ed25519 密钥,暴力破解的时间比宇宙年龄还长。

密钥生成

现在推荐用 Ed25519 算法,比老的 RSA 更安全,密钥也更短。生成命令很简单:

# macOS / Linux
ssh-keygen -t ed25519 -C "[email protected]"

# Windows(PowerShell,需要 OpenSSH 客户端)
ssh-keygen -t ed25519 -C "[email protected]"

运行后会问你密钥存在哪、要不要设密码。直接回车用默认路径就行,密码看你自己需求——设了更安全,但每次连接都要输。

生成完之后,本地会有两个文件:

  • ~/.ssh/id_ed25519 —— 私钥,打死不能泄露
  • ~/.ssh/id_ed25519.pub —— 公钥,待会儿要传到服务器

终端工具的话,macOS 自带的 Terminal 就够用,Windows 推荐 Windows Terminal 或者 MobaXterm。这不是重点,就不展开了。

二、用户与权限管理

先用 root 登录你的服务器(这是最后一次用 root 直接登录,后面就禁掉了):

ssh root@你的服务器IP

为什么不用 root?

一个字:后果太严重。

root 权限太大,删错一个文件、改错一个配置,整个系统就废了。更麻烦的是,很多攻击脚本专门盯着 root 账号爆破。你把 root 暴露在 SSH 登录里,等于给黑客留了个大靶子。

日常操作用普通账号,需要权限的时候再 sudo。这是 Linux 的基本安全原则。

创建部署用户

我喜欢用 deploy 这个名字,意思是”部署专用”。你也可以用自己喜欢的名字:

# 创建用户(会提示设置密码和一些信息)
adduser deploy

# 给 sudo 权限
usermod -aG sudo deploy

Ubuntu 会问你设置密码、填写用户信息。密码设一个你能记住的,其他信息直接回车跳过就行。

上传公钥到新用户

现在要把你本地的公钥上传到这个新账号里。在你本地机器执行:

# macOS / Linux
ssh-copy-id deploy@你的服务器IP

# Windows(PowerShell)
type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh deploy@你的服务器IP "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

然后测试一下能不能用 deploy 登录:

ssh deploy@你的服务器IP

能登录?好,接下来用 deploy 操作,不要再切回 root 了。需要 root 权限就加 sudo

多用户场景

如果你的服务器要给团队多人使用,可以为每个人创建独立账号。比如:

# 给同事张三开账号
adduser zhangsan
usermod -aG sudo zhangsan

# 给他上传公钥(他自己本地执行)
ssh-copy-id zhangsan@你的服务器IP

每个人用自己的账号,操作记录都能追溯,出了问题也好排查。

三、SSH 安全加固

这一步是整个初始化里最核心的部分,也是最容易出现”把自己关在门外”惨剧的地方。

警告:改 SSH 配置之前,一定要保持当前连接不关,同时另开一个终端窗口测试。这样改错了还能从另一个窗口补救。

编辑 SSH 配置文件

sudo nano /etc/ssh/sshd_config

核心参数逐行解读

1. Port 端口

Port 22    # 默认值,建议改掉

22 端口是全网扫描的首选目标。改成高位端口(比如 22222 或 54321)能避开大部分无差别的扫描。

Port 54321

注意:如果你用的是云服务商(阿里云、腾讯云、AWS 等),改完端口记得去安全组/防火墙放行新端口,否则连不上。

2. PermitRootLogin 禁止 root 登录

PermitRootLogin no    # 必须改

为什么?前面说过了,root 是黑客的头号目标。禁掉它,攻击面直接少一大块。

3. PasswordAuthentication 禁用密码登录

PasswordAuthentication no    # 只允许密钥登录

这是防止暴力破解的关键。只要你的私钥不泄露,别人就算知道密码也登不进去。

4. 其他安全参数

MaxAuthTries 3              # 最多试 3 次密码
ClientAliveInterval 300     # 5 分钟无操作断开
ClientAliveCountMax 2       # 最多 2 次无响应

这些参数能防止长时间空闲连接占资源,也能限制暴力破解的尝试次数。

配置验证三步走

改完配置别急着重启,先验证:

第一步:测试配置语法

sudo sshd -t

没输出就是好消息,说明语法没问题。

第二步:新开窗口测试连接

保持当前窗口不动,另开一个终端窗口,用新端口和 deploy 账号连接:

ssh -p 54321 deploy@你的服务器IP

能连上?说明配置生效了,而且你没把自己关在门外。

第三步:确认无误后重启服务

sudo systemctl restart sshd
# 或者
sudo systemctl restart ssh

重启后,再用新窗口测试一次。确认能正常登录,这一步才算真正完成。

小贴士

如果改完发现连不上了,别慌。去云服务商控制台用 VNC 登录,把配置改回来,重启服务就行。这也是为什么我一直强调——改 SSH 配置前先保持一个连接不关。

四、fail2ban 自动封禁

前面说的 SSH 配置,主要是防暴力破解。但如果有人锲而不舍地试密码呢?这时候就需要 fail2ban 出场了。

fail2ban 是什么? 一个自动监控日志、封禁可疑 IP 的工具。有人连续输错几次密码?自动拉黑一段时间。简单粗暴,效果拔群。

安装与启动

sudo apt update
sudo apt install fail2ban -y
sudo systemctl enable fail2ban
sudo systemctl start fail2ban

配置 sshd 监狱

fail2ban 用”监狱”(jail)的概念来管理不同服务的监控规则。SSH 默认就有个 sshd 监狱。

创建本地配置文件(不要直接改默认配置,升级会覆盖):

sudo nano /etc/fail2ban/jail.local

写入以下内容:

[sshd]
enabled = true
port = 54321          # 改成你的 SSH 端口
maxretry = 3          # 3 次失败就封
findtime = 600        # 10 分钟内
bantime = 3600        # 封 1 小时

参数解释

  • maxretry:最多允许失败几次。默认是 5,我改成 3 更严格。
  • findtime:时间窗口,单位秒。600 秒 = 10 分钟内失败 3 次就触发。
  • bantime:封禁时长,单位秒。3600 = 1 小时。你可以设成 86400(一天)或者更长。

改完重启服务:

sudo systemctl restart fail2ban

查看封禁状态

# 查看所有监狱状态
sudo fail2ban-client status

# 查看 sshd 监狱详情
sudo fail2ban-client status sshd

你会看到当前被封禁的 IP 列表。

解封 IP

如果你自己被误封了(比如调试时密码输错太多次),可以这样解封:

sudo fail2ban-client set sshd unbanip 你的IP

进阶:自定义规则

fail2ban 不止能保护 SSH,还能保护 Nginx、Apache、MySQL 等服务。配置方式类似,创建对应的监狱就行。这个展开讲就长了,先点到为止。

五、版本差异速查表

Ubuntu 22.04 和 24.04 这两版本,初始化流程大体一致,但有些细节差异。

核心差异对照

项目Ubuntu 22.04 LTSUbuntu 24.04 LTS
内核版本5.156.8
OpenSSH 版本8.99.6
默认 Python3.103.12
systemd 版本249255
支持周期到 2027 年 4 月到 2029 年 4 月

实际影响

好消息:本文的初始化流程,在两个版本上完全通用。SSH 配置路径、fail2ban 安装方式、用户管理命令,都没有变化。

需要注意的点

  1. OpenSSH 9.x(24.04) 默认配置更严格一些,某些老旧的加密算法被禁用了。如果你用老版本的 SSH 客户端连 24.04 可能会遇到问题,升级客户端就好。

  2. 云服务商镜像:有些云服务商的 22.04 镜像预装了一些监控或管理脚本,可能和你的配置冲突。建议用官方纯净镜像,或者初始化前先检查一下已有的服务。

  3. 升级问题:如果你已经有在跑的 22.04 服务器,升级到 24.04 前最好做个快照。虽然 do-release-upgrade 大部分时候能成功,但安全配置这种东西,还是稳妥点好。

如何选择?

  • 新项目:直接用 24.04。支持周期更长,软件版本更新。
  • 老项目:如果依赖某些特定版本(比如 Python 3.10),用 22.04。
  • 追求稳定:22.04 已经成熟,坑都被踩得差不多了。
  • 尝鲜:24.04 有一些新特性,比如更好的硬件支持和性能优化。

总结

说了这么多,来回顾一下这套初始化流程的核心要点:

安全三件套

  • 创建普通用户,禁用 root 登录
  • SSH 改端口、禁密码、只允许密钥
  • fail2ban 自动封禁可疑 IP

操作原则

  • 改配置前保持一个连接不关
  • 每一步都验证,不要急着重启
  • 私钥打死不能泄露

验证清单

  • 能用 deploy 账号通过新端口 SSH 登录
  • root 账号无法登录
  • 密码登录已禁用
  • fail2ban 服务正常运行

这套配置只是服务器安全的第一步。后续你还需要配置防火墙(UFW)、安装 Docker、部署应用……这些话题以后再聊。

如果你按照这篇教程操作遇到问题,欢迎留言讨论。三年前那个凌晨三点把自己关在门外的惨剧,我真心不希望你再经历一次。

Ubuntu 服务器初始化安全配置

从零配置一台安全的 Ubuntu 服务器,包含用户管理、SSH 加固、fail2ban 封禁

⏱️ 预计耗时: 10 分钟

  1. 1

    步骤1: 生成 SSH 密钥

    在本地机器生成 Ed25519 密钥对:

    • 命令:ssh-keygen -t ed25519 -C "[email protected]"
    • 私钥保存在 ~/.ssh/id_ed25519(不可泄露)
    • 公钥保存在 ~/.ssh/id_ed25519.pub(待上传)
  2. 2

    步骤2: 创建普通用户

    登录服务器后创建部署用户:

    • 创建用户:adduser deploy
    • 赋予 sudo 权限:usermod -aG sudo deploy
    • 设置一个你能记住的密码
  3. 3

    步骤3: 上传公钥并测试登录

    在本地机器执行:

    • ssh-copy-id deploy@服务器IP
    • 测试登录:ssh deploy@服务器IP
    • 确认能用 deploy 正常登录后,后续都用此账号操作
  4. 4

    步骤4: 修改 SSH 配置

    编辑 /etc/ssh/sshd_config:

    • Port 54321(改成高位端口)
    • PermitRootLogin no(禁止 root 登录)
    • PasswordAuthentication no(禁用密码登录)
    • MaxAuthTries 3
    • ClientAliveInterval 300

    注意:修改前保持一个连接不关!
  5. 5

    步骤5: 验证并重启 SSH

    三步验证法:

    • 测试语法:sudo sshd -t
    • 新开窗口测试:ssh -p 54321 deploy@服务器IP
    • 确认无误后重启:sudo systemctl restart sshd
  6. 6

    步骤6: 安装配置 fail2ban

    自动封禁暴力破解 IP:

    • 安装:sudo apt install fail2ban -y
    • 配置 /etc/fail2ban/jail.local
    • 设置 maxretry=3, bantime=3600
    • 重启服务:sudo systemctl restart fail2ban

常见问题

SSH 端口改成多少合适?
建议改成 1024-65535 之间的高位端口,比如 22222、54321。避开常用端口(80、443、3306 等),能减少被扫描的概率。改完记得去云服务商安全组放行新端口。
改完 SSH 配置连不上了怎么办?
别慌,去云服务商控制台用 VNC 登录,把配置改回来,重启 sshd 服务就行。这也是为什么强调改配置前要保持一个连接不关,同时新开窗口测试。
fail2ban 会把自己封禁吗?
会的。如果你密码输错太多次,自己的 IP 也会被封。解封命令:sudo fail2ban-client set sshd unbanip 你的IP。建议配置时把自己的 IP 加到白名单(ignoreip)。
Ubuntu 22.04 和 24.04 初始化有什么区别?
本文的流程在两个版本上完全通用。主要区别是 24.04 的 OpenSSH 版本更高(9.6),默认配置更严格,某些老旧加密算法被禁用了。如果你用老 SSH 客户端可能需要升级。
密钥登录比密码登录安全多少?
差了好几个数量级。一个 256 位的 Ed25519 密钥,暴力破解的时间比宇宙年龄还长。密码登录则会被字典攻击、暴力破解,尤其弱密码几乎等于裸奔。
可以把 SSH 端口改回 22 吗?
技术上可以,但不推荐。22 端口是全网扫描的首选目标,改成高位端口能避开大部分自动化扫描脚本。配合 fail2ban 和密钥登录,安全得多。

10 分钟阅读 · 发布于: 2026年3月27日 · 修改于: 2026年3月27日

评论

使用 GitHub 账号登录后即可评论

相关文章