服务器 SSH 初始配置指南

2026年2月1日 server 18 分钟阅读 4 次阅读
📖 文章摘要

本文讲解Ubuntu24.04系统UCloud服务器SSH密钥、自定义端口配置,汇总故障排查、安全加固及系统重装恢复流程。

服务器 SSH 配置指南

服务器信息

  • IP: 你的服务器IP
  • 系统: Ubuntu 24.04 LTS
  • SSH端口: 2894(已关闭默认22端口)
  • 登录用户: ubuntu

一、初始配置流程

1.1 首次登录

新服务器购买后,通过 UCloud 控制台的"远程终端"(Web Terminal)首次登录。

# 登录后查看系统信息
uname -a
lsb_release -a
df -h
free -h

1.2 配置 SSH 密钥登录

为什么需要配置密钥?

  • 密码登录不安全,容易被暴力破解
  • 密钥登录更安全,且支持免密自动化
  • 配置后本地 CLI、脚本、自动化工具都能直接连接

SSH 密钥原理

SSH 密钥由两部分组成:

  • 私钥 (~/.ssh/id_ed25519) - 保存在本地电脑,绝对不能泄露
  • 公钥 (~/.ssh/id_ed25519.pub) - 可以放到任何服务器

工作流程:

  1. 本地电脑生成密钥对(公钥 + 私钥)
  2. 把公钥上传到服务器的 ~/.ssh/authorized_keys 文件
  3. SSH 连接时,服务器用公钥加密一个随机数发送给本地
  4. 本地用私钥解密,证明身份
  5. 验证通过,建立连接,无需输入密码

步骤一:检查本地是否已有密钥

ls -la ~/.ssh/ | grep -E "id_ed25519|id_rsa"

如果有 id_ed25519id_rsa 文件,说明已有密钥,跳到步骤二。

如果没有密钥,继续下一步生成。

步骤二:生成密钥对

# 生成 ed25519 类型密钥(更安全,推荐)
ssh-keygen -t ed25519 -C "你的邮箱"

执行后会提示:

Generating public/private ed25519 key pair.
Enter file in which to save the key (/c/Users/你的用户名/.ssh/id_ed25519):

→ 直接回车,使用默认路径

Enter passphrase (empty for no passphrase):

→ 可以直接回车(免密登录),也可以输入密码(更安全,每次连接需要输入这个密码)

Enter same passphrase again:

→ 再次输入密码或直接回车

执行成功后显示:

Your identification has been saved in /c/Users/你的用户名/.ssh/id_ed25519
Your public key has been saved in /c/Users/你的用户名/.ssh/id_ed25519.pub

生成的文件:

  • ~/.ssh/id_ed25519 - 私钥(400权限,不能泄露)
  • ~/.ssh/id_ed25519.pub - 公钥(可以复制到任何服务器)

步骤三:查看公钥内容

cat ~/.ssh/id_ed25519.pub

输出类似:

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... Leap@DESKTOP-U4GIDOS

这一整行就是你的公钥,需要复制到服务器上。

步骤四:上传公钥到服务器

方法一:使用 ssh-copy-id(推荐)

ssh-copy-id -i ~/.ssh/id_ed25519.pub ubuntu@你的服务器IP

执行后输入服务器密码,完成一次后即为免密登录。

方法二:手动添加(如果 ssh-copy-id 不可用)

# 本地查看公钥
cat ~/.ssh/id_ed25519.pub

# 复制整行公钥内容,然后登录服务器执行
mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "粘贴你的公钥内容" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

方法三:通过 Web Terminal 复制粘贴

  1. 本地查看公钥:cat ~/.ssh/id_ed25519.pub
  2. 复制整行公钥内容
  3. 登录 UCloud 控制台 → Web Terminal
  4. 执行上面的 mkdir 和 echo 命令

步骤五:验证免密登录

ssh ubuntu@你的服务器IP "echo '密钥登录成功'"

如果不提示输入密码就成功了。

密钥文件权限说明

  • ~/.ssh/ 目录权限应为 700
  • ~/.ssh/id_ed25519 私钥权限应为 400 或 600
  • ~/.ssh/authorized_keys 公钥文件权限应为 600

如果权限不对,执行:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 600 ~/.ssh/authorized_keys

密钥丢失恢复方案

情况一:本地私钥丢失,服务器还能登录

# 1. 重新生成新密钥对
ssh-keygen -t ed25519 -C "你的邮箱"

# 2. 删除服务器上的旧公钥(可选)
ssh ubuntu@服务器IP "sed -i '/你的旧公钥/d' ~/.ssh/authorized_keys"

# 3. 上传新公钥
ssh-copy-id -i ~/.ssh/id_ed25519.pub ubuntu@服务器IP

情况二:本地私钥丢失,服务器无法登录

  1. 登录 UCloud 控制台 → Web Terminal
  2. 执行以下命令:
# 删除旧公钥
sed -i '/你的旧公钥/d' ~/.ssh/authorized_keys

# 或者清空所有公钥,重新配置
# echo "" > ~/.ssh/authorized_keys
  1. 本地重新生成密钥:ssh-keygen -t ed25519 -C "你的邮箱"
  2. 通过 Web Terminal 手动添加新公钥

情况三:重装系统后密钥丢失

  1. 通过 UCloud 控制台 Web Terminal 登录
  2. 本地重新生成密钥:ssh-keygen -t ed25519 -C "你的邮箱"
  3. 本地查看公钥:cat ~/.ssh/id_ed25519.pub
  4. 复制公钥内容,在 Web Terminal 执行:
mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "粘贴你的公钥内容" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

备份建议

  • 把私钥文件 ~/.ssh/id_ed25519 备份到安全的地方(如加密U盘、密码管理器)
  • 不要把私钥上传到 GitHub、网盘等公共平台
  • 可以把公钥内容保存到文本文件备份

1.3 配置 SSH 别名(可选)

编辑本地 ~/.ssh/config,添加:

Host ucloud-hk
    HostName 你的服务器IP
    Port 2894
    User ubuntu
    IdentityFile ~/.ssh/id_ed25519

之后可直接使用:

ssh ucloud-hk

二、修改 SSH 端口

2.1 为什么要改端口

  • 避免默认 22 端口被扫描和暴力破解
  • 减少 DDoS 攻击面
  • 安全日志更清晰

2.2 修改端口步骤

步骤一:修改配置文件

# 备份原配置
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

# 修改端口(假设改为 2894)
sudo sed -i 's/^#Port 22/Port 2894/' /etc/ssh/sshd_config
sudo sed -i 's/^Port 22$/Port 2894/' /etc/ssh/sshd_config

步骤二:禁用 ssh.socket(重要!)

Ubuntu 24.04 使用 systemd socket 激活机制,必须禁用 ssh.socket 才能让自定义端口生效:

sudo systemctl stop ssh.socket
sudo systemctl disable ssh.socket

步骤三:重启 SSH 服务

sudo systemctl restart ssh

步骤四:验证端口监听

sudo ss -tlnp | grep ssh

输出应显示新端口:

LISTEN 0 128 0.0.0.0:2894 0.0.0.0:* users:(("sshd",...))

步骤五:配置 UCloud 防火墙

  1. 登录 UCloud 控制台
  2. 进入服务器 → 防火墙
  3. 添加规则:
    • 协议: TCP
    • 端口: 2894
    • 来源: 0.0.0.0/0
    • 策略: 接受
  4. 绑定到服务器实例

步骤六:测试新端口连接

ssh -p 2894 ubuntu@你的服务器IP

步骤七:关闭旧端口(确认新端口正常后)

# 删除旧端口配置
sudo sed -i '/^Port 22$/d' /etc/ssh/sshd_config
sudo systemctl restart ssh

三、排查过程详细记录

3.1 初次修改端口失败

操作: 将 /etc/ssh/sshd_config 中的 Port 22 改为 Port 2222,然后重启 SSH

sudo sed -i 's/^#Port 22/Port 2222/' /etc/ssh/sshd_config
sudo systemctl restart ssh

结果: 执行 sudo ss -tlnp | grep ssh 发现端口仍在 22 监听,2222 未生效

排查思路:

  1. 检查配置文件是否修改成功

    grep -n 'Port' /etc/ssh/sshd_config
    

    结果显示 Port 2222 已写入,配置文件没问题

  2. 检查 SSH 服务状态

    sudo systemctl status ssh
    

    显示服务 active,但端口没变

  3. 检查端口监听情况

    sudo ss -tlnp | grep ssh
    

    发现是 sshd 在监听 22 端口

  4. 发现关键线索: 检查 systemd 服务时发现 ssh.socket

    systemctl list-units --type=service | grep ssh
    

    输出: ssh.servicessh.socket

  5. 理解 Ubuntu 24.04 的 socket 激活机制:

    • 传统方式: sshd 进程直接监听端口
    • Ubuntu 24.04 方式: ssh.socket 监听端口,收到连接后触发 sshd 启动
    • 这就是为什么修改 sshd_config 不生效 —— 端口由 ssh.socket 控制,不是 sshd

根本原因: Ubuntu 24.04 使用 systemd 的 socket 激活机制,ssh.socket 负责监听端口,即使修改了 sshd_config,ssh.socket 仍然监听原来的端口

解决方案:

# 停止并禁用 ssh.socket
sudo systemctl stop ssh.socket
sudo systemctl disable ssh.socket

# 重启 ssh 服务
sudo systemctl restart ssh

# 验证
sudo ss -tlnp | grep ssh

禁用 ssh.socket 后,sshd 直接监听端口,自定义端口生效

3.2 安全组/防火墙问题

现象: 端口服务器内部监听正常(ss -tlnp 显示新端口),但外部无法连接

排查思路:

  1. 检查服务器内部防火墙

    sudo ufw status
    

    结果: Status: inactive,排除服务器内部防火墙问题

  2. 检查网络连通性

    ping 你的服务器IP
    

    结果: 能 ping 通,排除网络问题

  3. 检查 UCloud 控制台防火墙规则

    • 进入 UCloud 控制台 → 服务器 → 防火墙
    • 发现规则已添加(TCP 2894),但"绑定资源数量"为 0
  4. 发现问题: UCloud 防火墙规则创建后,需要手动绑定到服务器实例才能生效

解决: 在防火墙规则页面,将规则绑定到服务器

经验: UCloud 的防火墙机制是"规则"和"实例"分离的,创建规则后必须绑定到具体服务器

3.3 多端口监听问题

需求: 同时监听 22 和 2894 端口,避免改错端口导致无法连接

问题: 配置文件添加了两行 Port(Port 22 和 Port 2894),重启后只监听 22

排查思路:

  1. 检查配置文件

    grep -n 'Port' /etc/ssh/sshd_config
    

    结果: 两行都在(Port 22 和 Port 2894)

  2. 检查日志

    sudo journalctl -u ssh --no-pager -n 20
    

    发现日志中只显示 "Server listening on :: port 22",没有 2894

  3. 检查 ssh.socket 状态

    sudo systemctl status ssh.socket
    

    发现 ssh.socket 仍然 active

  4. 理解问题: 即使在 sshd_config 中配置了多个端口,ssh.socket 仍然只监听它配置的端口(22)

解决方案: 完全禁用 ssh.socket,让 sshd 直接监听所有配置的端口

sudo systemctl stop ssh.socket
sudo systemctl disable ssh.socket
sudo systemctl stop ssh
sudo systemctl start ssh

禁用后验证:

sudo ss -tlnp | grep ssh

输出显示 22 和 2894 都在监听


四、安全加固

4.1 禁用密码登录

配置密钥登录后,禁用密码登录:

sudo nano /etc/ssh/sshd_config

修改或添加:

PasswordAuthentication no
PubkeyAuthentication yes

重启 SSH:

sudo systemctl restart ssh

4.2 禁用 root 登录

PermitRootLogin no

4.3 限制登录用户

AllowUsers ubuntu

4.4 配置 fail2ban

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

五、常用连接方式

5.1 SSH 登录

ssh -p 2894 ubuntu@你的服务器IP
# 或使用别名
ssh ucloud-hk

5.2 文件传输

# 上传文件
scp -P 2894 本地文件 ubuntu@你的服务器IP:/远程路径/

# 下载文件
scp -P 2894 ubuntu@你的服务器IP:/远程文件 本地路径/

5.3 远程执行命令

ssh -p 2894 ubuntu@你的服务器IP "命令"

六、故障排查速查

问题 排查命令 可能原因
端口修改不生效 sudo ss -tlnp | grep ssh ssh.socket 未禁用
外部无法连接 检查 UCloud 防火墙是否绑定资源 防火墙规则未绑定服务器
配置文件不生效 sudo journalctl -u ssh --no-pager -n 20 配置语法错误
密钥登录失败 检查 ~/.ssh/authorized_keys 权限 权限应为 600
连接超时 ping 你的服务器IP 网络不通或防火墙拦截

七、重装系统后的恢复流程

7.1 现象

UCloud 重装系统后:

  • 服务器变为全新 Ubuntu 系统
  • 之前的 SSH 密钥认证失效(authorized_keys 被清空)
  • SSH 端口恢复默认 22
  • 之前部署的应用全部丢失

7.2 恢复步骤

步骤一:删除本地旧的 host key

重装后服务器的 host key 变了,本地 known_hosts 还保存着旧的,SSH 会报错 "REMOTE HOST IDENTIFICATION HAS CHANGED":

ssh-keygen -R 你的服务器IP

步骤二:用密码登录一次

ssh -p 22 ubuntu@你的服务器IP
# 输入你的服务器密码

步骤三:上传公钥

mkdir -p ~/.ssh && chmod 700 ~/.ssh
echo "你的公钥内容" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

或在本地执行(需输入密码):

ssh-copy-id -p 22 ubuntu@你的服务器IP

步骤四:重新配置 SSH 端口

按本文档"第二节 修改 SSH 端口"的步骤操作:

# 1. 修改配置文件
sudo sed -i 's/^#Port 22/Port 2894/' /etc/ssh/sshd_config
echo 'Port 2894' | sudo tee -a /etc/ssh/sshd_config

# 2. 禁用 ssh.socket
sudo systemctl stop ssh.socket
sudo systemctl disable ssh.socket

# 3. 重启 SSH
sudo systemctl restart ssh

# 4. 验证
ss -tlnp | grep 2894

步骤五:验证新端口连接

ssh -p 2894 ubuntu@你的服务器IP

确认可以连接后,在 UCloud 控制台关闭 22 端口的安全组规则(可选)。


维护者: leap

最后更新:2026年7月8日CC BY-NC-SA 4.0

评论

暂无评论,来写第一条吧

© 2026 My Blog. Built with Nuxt.js + FastAPI.