服务器 SSH 初始配置指南
本文讲解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) - 可以放到任何服务器
工作流程:
- 本地电脑生成密钥对(公钥 + 私钥)
- 把公钥上传到服务器的
~/.ssh/authorized_keys文件 - SSH 连接时,服务器用公钥加密一个随机数发送给本地
- 本地用私钥解密,证明身份
- 验证通过,建立连接,无需输入密码
步骤一:检查本地是否已有密钥
ls -la ~/.ssh/ | grep -E "id_ed25519|id_rsa"
如果有 id_ed25519 或 id_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 复制粘贴
- 本地查看公钥:
cat ~/.ssh/id_ed25519.pub - 复制整行公钥内容
- 登录 UCloud 控制台 → Web Terminal
- 执行上面的 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
情况二:本地私钥丢失,服务器无法登录
- 登录 UCloud 控制台 → Web Terminal
- 执行以下命令:
# 删除旧公钥
sed -i '/你的旧公钥/d' ~/.ssh/authorized_keys
# 或者清空所有公钥,重新配置
# echo "" > ~/.ssh/authorized_keys
- 本地重新生成密钥:
ssh-keygen -t ed25519 -C "你的邮箱" - 通过 Web Terminal 手动添加新公钥
情况三:重装系统后密钥丢失
- 通过 UCloud 控制台 Web Terminal 登录
- 本地重新生成密钥:
ssh-keygen -t ed25519 -C "你的邮箱" - 本地查看公钥:
cat ~/.ssh/id_ed25519.pub - 复制公钥内容,在 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 防火墙
- 登录 UCloud 控制台
- 进入服务器 → 防火墙
- 添加规则:
- 协议: TCP
- 端口: 2894
- 来源: 0.0.0.0/0
- 策略: 接受
- 绑定到服务器实例
步骤六:测试新端口连接
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 未生效
排查思路:
检查配置文件是否修改成功
grep -n 'Port' /etc/ssh/sshd_config结果显示 Port 2222 已写入,配置文件没问题
检查 SSH 服务状态
sudo systemctl status ssh显示服务 active,但端口没变
检查端口监听情况
sudo ss -tlnp | grep ssh发现是 sshd 在监听 22 端口
发现关键线索: 检查 systemd 服务时发现 ssh.socket
systemctl list-units --type=service | grep ssh输出:
ssh.service和ssh.socket理解 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 显示新端口),但外部无法连接
排查思路:
检查服务器内部防火墙
sudo ufw status结果:
Status: inactive,排除服务器内部防火墙问题检查网络连通性
ping 你的服务器IP结果: 能 ping 通,排除网络问题
检查 UCloud 控制台防火墙规则
- 进入 UCloud 控制台 → 服务器 → 防火墙
- 发现规则已添加(TCP 2894),但"绑定资源数量"为 0
发现问题: UCloud 防火墙规则创建后,需要手动绑定到服务器实例才能生效
解决: 在防火墙规则页面,将规则绑定到服务器
经验: UCloud 的防火墙机制是"规则"和"实例"分离的,创建规则后必须绑定到具体服务器
3.3 多端口监听问题
需求: 同时监听 22 和 2894 端口,避免改错端口导致无法连接
问题: 配置文件添加了两行 Port(Port 22 和 Port 2894),重启后只监听 22
排查思路:
检查配置文件
grep -n 'Port' /etc/ssh/sshd_config结果: 两行都在(Port 22 和 Port 2894)
检查日志
sudo journalctl -u ssh --no-pager -n 20发现日志中只显示 "Server listening on :: port 22",没有 2894
检查 ssh.socket 状态
sudo systemctl status ssh.socket发现 ssh.socket 仍然 active
理解问题: 即使在 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
评论
暂无评论,来写第一条吧
