SSH 完整配置指南(Debian / Ubuntu)
本文档面向从零开始配置 SSH 的新手,涵盖服务器端创建用户、修改配置、密钥登录,以及客户端连接的全流程。 适用系统: Debian 11+ / Ubuntu 20.04+
适用平台: 腾讯云 CVM / 任何支持 SSH 的 Linux 服务器
目录
- 前置检查:确认 SSH 服务状态
- 创建普通用户(禁止 root 登录)
- 修改 SSH 配置文件
- 防火墙与安全组
- 客户端连接测试
- 密钥登录(比密码更安全)
- 高级配置选项
- 故障排查
- Windows 安装 SSH 客户端
- 删除用户
- 完整命令速查表
1. 前置检查:确认 SSH 服务状态
1.1 检查 SSH 是否运行
sudo systemctl status ssh输出解读:
● ssh.service - OpenSSH server Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2026-07-13 02:55:39 UTC; 5min ago| 字段 | 含义 |
|---|---|
Active: active (running) | ✅ SSH 服务正在运行 |
Loaded: ... enabled | ✅ 开机自启动已启用 |
vendor preset: enabled | 系统默认就启用了 |
如果显示 inactive(未运行):
# 安装 OpenSSH 服务端(Debian 默认已装)sudo apt updatesudo apt install openssh-server
# 启动并设置开机自启sudo systemctl enable ssh --now
# 再次检查sudo systemctl status ssh-now 是 --now 的简写,等价于先 enable 再 start,一步完成。
2. 创建普通用户(禁止 root 登录)
2.1 为什么不能用 root 登录?
- root 是超级管理员,权限过大,误操作会直接毁掉系统
- root 用户名是公开的,黑客扫描时第一个尝试的就是 root + 弱密码
- 日志审计困难,所有 root 操作混在一起,无法区分是谁干的
2.2 创建用户
sudo adduser qtfy交互过程:
Adding user 'qtfy' ...Adding new group 'qtfy' (1000) ...Adding new user 'qtfy' (1000) with group 'qtfy' ...Creating home directory '/home/qtfy' ...Copying files from '/etc/skel' ...New password: ← 输入密码(不显示字符)Retype new password: ← 再次输入确认passwd: password updated successfully
Changing the user information for qtfyFull Name []: ← 按回车跳过Room Number []: ← 按回车跳过Work Phone []: ← 按回车跳过Home Phone []: ← 按回车跳过Other []: ← 按回车跳过
Is the information correct? [Y/n] ← 按回车确认(默认 Y)命令详解:
| 命令 | 作用 | 与 useradd 的区别 |
|---|---|---|
adduser | 交互式创建用户,自动创建家目录、复制配置文件 | 更友好,推荐新手使用 |
useradd | 底层命令,只创建用户条目,不创建家目录 | 需要额外参数 -m 才创建家目录 |
adduser 自动做了什么:
- 创建用户账户
/etc/passwd - 创建用户组
/etc/group - 创建家目录
/home/qtfy - 从
/etc/skel复制默认配置文件(如.bashrc) - 设置密码
2.3 赋予 sudo 权限
sudo usermod -aG sudo qtfy参数详解:
| 参数 | 全称 | 含义 |
|---|---|---|
-a | --append | 追加到组,而不是覆盖原有组 |
-G | --groups | 指定要加入的附加组 |
sudo | 组名 | Debian 中拥有 sudo 权限的默认组 |
如果不加 -a,-G 会覆盖用户的所有附加组,导致用户从其他组中被移除。
验证 sudo 权限:
su - qtfy # 切换到 qtfy 用户sudo whoami # 测试 sudo# 输出:root(表示 sudo 生效)exit # 返回 root3. 修改 SSH 配置文件
3.1 打开配置文件
sudo nano /etc/ssh/sshd_config
sshd_config是 SSH 服务端(daemon)的配置文件。还有一个ssh_config是客户端配置,不要搞混。
3.2 关键配置项详解
① Port —— 修改监听端口
# 找到这行(默认被注释)#Port 22
# 修改为(1024-65535 之间任意未占用端口)Port 2222| 选项 | 说明 |
|---|---|
Port 22 | 默认端口,全球扫描器都在扫这个端口 |
Port 2222 | 常见替代端口,仍有一定扫描量 |
Port 49152 | 动态/私有端口范围,扫描量更低 |
Port 22 + 密钥登录 | 如果必须用 22,建议配合密钥 + fail2ban |
查看端口是否被占用:
sudo ss -tlnp | grep 2222
② PermitRootLogin —— 是否允许 root 登录
# 找到这行#PermitRootLogin prohibit-password
# 修改为PermitRootLogin no| 值 | 含义 |
|---|---|
yes | 允许 root 用密码或密钥登录(最危险) |
no | 完全禁止 root 登录(推荐) |
prohibit-password | 允许 root 用密钥登录,禁止密码登录 |
without-password | 同 prohibit-password(旧写法) |
forced-commands-only | 只允许 root 执行预定义命令 |
③ PasswordAuthentication —— 是否允许密码登录
PasswordAuthentication yes| 阶段 | 建议值 | 原因 |
|---|---|---|
| 初始配置 | yes | 先确保能用密码连上,再配密钥 |
| 密钥配好后 | no | 关闭密码,只接受密钥登录 |
先配好密钥并测试成功,再改
no。否则可能把自己锁在服务器外。
④ PubkeyAuthentication —— 是否允许密钥登录
PubkeyAuthentication yes默认就是 yes,确保这行没有被注释或改成 no。
⑤ AllowUsers —— 只允许特定用户登录(可选)
AllowUsers qtfy作用: 即使有人知道其他用户名(如 test、admin),也无法通过 SSH 登录。是最后一道防线。
多个用户:
AllowUsers qtfy alice bob⑥ MaxAuthTries —— 最大尝试次数(防暴力破解)
MaxAuthTries 3连续输错 3 次密码后,当前连接会被断开。
⑦ ClientAliveInterval —— 保持连接(防超时断开)
ClientAliveInterval 60ClientAliveCountMax 3每 60 秒发送一次心跳包,连续 3 次无响应才断开。适合长时间操作(如编译、传输大文件)。
3.3 配置示例(推荐的安全配置)
# 基础设置Port 2222ListenAddress 0.0.0.0
# 认证设置PermitRootLogin noPasswordAuthentication yes # 初始阶段用 yes,密钥配好后改 noPubkeyAuthentication yesMaxAuthTries 3
# 可选:只允许特定用户AllowUsers qtfy
# 会话保持ClientAliveInterval 60ClientAliveCountMax 3
# 禁用不安全的算法(可选,高级)Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.comMACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.comKexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org3.4 保存并重启 SSH
# 检查配置文件语法是否正确(重要!)sudo sshd -t# 无输出 = 语法正确
# 重启 SSH 服务sudo systemctl restart ssh
# 确认重启后状态正常sudo systemctl status sshsshd -t 是测试模式,只检查语法不启动服务。如果配置有错,它会报错并拒绝重启,避免把自己锁在外面。
4. 防火墙与安全组
4.1 服务器本地防火墙(ufw)
# 安装 ufw(Debian 默认可能没装)sudo apt install ufw
# 默认策略:拒绝所有入站,允许所有出站sudo ufw default deny incomingsudo ufw default allow outgoing
# 放行 SSH 端口(如果你改成了 2222)sudo ufw allow 2222/tcp
# 如果还开了其他服务(如 HTTP)sudo ufw allow 80/tcpsudo ufw allow 443/tcp
# 启用防火墙sudo ufw enable
# 查看状态sudo ufw status verboseufw 常用命令:
| 命令 | 作用 |
|---|---|
sudo ufw allow 2222/tcp | 放行 TCP 2222 端口 |
sudo ufw allow from 192.168.1.0/24 to any port 2222 | 只允许特定网段访问 |
sudo ufw delete allow 2222/tcp | 删除规则 |
sudo ufw disable | 临时关闭防火墙 |
sudo ufw reset | 重置所有规则 |
4.2 腾讯云安全组(必须!)
这是云服务商层面的防火墙,优先级高于 ufw。如果安全组没放行,ufw 放行了也连不上。
配置路径:
腾讯云控制台 → 云服务器 CVM → 实例详情 → 安全组 → 入站规则 → 添加规则
| 配置项 | 值 |
|---|---|
| 来源 | 0.0.0.0/0(任何 IP)或你的公网 IP |
| 协议端口 | 自定义 TCP,端口 2222(或你设的端口) |
| 策略 | 允许 |
| 备注 | SSH 远程登录 |
建议:来源不要写 0.0.0.0/0,改成你当前网络的公网 IP(查 IP:ip.sb)。这样只有你能连,大幅降低被扫描风险。
5. 客户端连接测试
5.1 Windows(PowerShell / CMD)
# 基础连接ssh -p 2222 qtfy@你的服务器公网IP
# 示例ssh -p 2222 qtfy@123.456.78.90首次连接提示:
The authenticity of host '[123.456.78.90]:2222' can't be established.ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxx.Are you sure you want to continue connecting (yes/no/[fingerprint])?输入 yes 回车。这是把服务器的公钥指纹保存到本地 ~/.ssh/known_hosts。
5.2 macOS / Linux
ssh -p 2222 qtfy@你的服务器公网IP5.3 常用 SSH 客户端参数
| 参数 | 作用 | 示例 |
|---|---|---|
-p | 指定端口 | ssh -p 2222 user@ip |
-i | 指定私钥文件 | ssh -i ~/.ssh/id_ed25519 user@ip |
-v | 详细模式(排查问题) | ssh -v user@ip |
-vv | 更详细 | ssh -vv user@ip |
-N | 不执行远程命令(只做端口转发) | ssh -N -L ... |
-L | 本地端口转发 | ssh -L 8080:localhost:80 user@ip |
6. 密钥登录(比密码更安全)
6.1 客户端生成密钥对
Windows(PowerShell):
ssh-keygen -t ed25519 -C "qtfy@example.com"macOS / Linux:
ssh-keygen -t ed25519 -C "qtfy@example.com"交互过程:
Generating public/private ed25519 key pair.Enter file in which to save the key (/home/qtfy/.ssh/id_ed25519): ← 按回车用默认路径Enter passphrase (empty for no passphrase): ← 可选:设置密码保护私钥Enter same passphrase again:
Your identification has been saved in /home/qtfy/.ssh/id_ed25519Your public key has been saved in /home/qtfy/.ssh/id_ed25519.pub密钥类型选择:
| 类型 | 安全性 | 速度 | 兼容性 | 推荐度 |
|---|---|---|---|---|
ed25519 | ⭐⭐⭐ | 最快 | 现代系统都支持 | ✅ 首选 |
rsa | ⭐⭐⭐ | 慢 | 最广泛 | 旧系统兼容用 |
ecdsa | ⭐⭐ | 中等 | 中等 | 不推荐 |
dsa | ⭐ | 快 | 已废弃 | ❌ 禁用 |
私钥密码(passphrase)的权衡:
- 不设密码:方便,但私钥文件泄露 = 服务器直接沦陷
- 设密码:每次使用私钥都要输密码,但更安全。可用
ssh-agent缓存密码
6.2 把公钥传到服务器
方法一:ssh-copy-id(推荐)
ssh-copy-id -p 2222 -i ~/.ssh/id_ed25519.pub qtfy@你的服务器公网IP输入一次密码后,公钥自动复制到服务器的 ~/.ssh/authorized_keys。
- 需要通过ssh连接后执行,可能需要sudo权限。
方法二:手动复制
# 本地电脑:复制公钥内容cat ~/.ssh/id_ed25519.pub# 复制输出的那一长串
# 服务器上(用密码登录后)mkdir -p ~/.sshchmod 700 ~/.sshecho "粘贴公钥内容" >> ~/.ssh/authorized_keyschmod 600 ~/.ssh/authorized_keys6.3 测试密钥登录
ssh -p 2222 qtfy@你的服务器公网IP如果不需要输密码直接登录成功,密钥配置完成。
6.4 关闭密码登录(密钥确认可用后再执行!)
sudo nano /etc/ssh/sshd_config修改:
PasswordAuthentication noChallengeResponseAuthentication no重启:
sudo systemctl restart ssh警告:确保密钥能正常使用再关闭密码!否则会被永久锁在服务器外,只能通过云服务商的 VNC 控制台救回。
6.5 使用 ssh-agent(避免每次输私钥密码)
# 启动 ssh-agenteval "$(ssh-agent -s)"
# 添加私钥(如果设了 passphrase,这里输一次)ssh-add ~/.ssh/id_ed25519
# 现在连接不需要再输密码ssh -p 2222 qtfy@你的服务器公网IPWindows 自动启动 ssh-agent:
PowerShell 管理员运行:
# 确保 ssh-agent 服务自动启动Get-Service ssh-agent | Set-Service -StartupType AutomaticStart-Service ssh-agentssh-add $env:USERPROFILE\.ssh\id_ed255197. 高级配置选项
7.1 SSH 配置文件(客户端)
在本地电脑创建 ~/.ssh/config(Windows 是 %USERPROFILE%\.ssh\config):
Host myserver HostName 123.456.78.90 User qtfy Port 2222 IdentityFile ~/.ssh/id_ed25519 ServerAliveInterval 60 ServerAliveCountMax 3然后简化为:
ssh myserver7.2 禁止空密码登录
PermitEmptyPasswords no7.3 设置登录欢迎信息
sudo nano /etc/ssh/sshd_config添加:
Banner /etc/ssh/banner创建 banner 文件:
sudo nano /etc/ssh/banner# 写入:# =========================================# Authorized access only!# All activity may be monitored.# =========================================7.4 记录详细日志
# 在 sshd_config 中LogLevel VERBOSE查看登录日志:
sudo tail -f /var/log/auth.log7.5 使用 fail2ban(自动封禁暴力破解 IP)
sudo apt install fail2ban
sudo systemctl enable fail2ban --now
# 查看被禁 IPsudo fail2ban-client status sshd8. 故障排查
8.1 连接被拒绝(Connection refused)
ssh: connect to host 123.456.78.90 port 2222: Connection refused排查步骤:
- 检查 SSH 服务是否运行:
sudo systemctl status ssh - 检查端口是否监听:
sudo ss -tlnp | grep ssh - 检查配置文件语法:
sudo sshd -t - 检查 ufw 是否放行:
sudo ufw status - 检查腾讯云安全组!(最常见原因)
8.2 权限拒绝(Permission denied)
Permission denied (publickey,password).排查步骤:
- 用户名是否正确?(不是 root,是你创建的普通用户)
- 密码是否正确?
- 如果用了密钥:私钥路径是否正确?
ssh -v查看详细日志 - 服务器端
~/.ssh/authorized_keys权限是否为 600? - 服务器端
~/.ssh目录权限是否为 700?
8.3 连接超时(Connection timed out)
- 检查服务器是否开机
- 检查公网 IP 是否正确
- 检查安全组是否放行对应端口
- 检查本地网络是否允许出站到该端口(公司/学校网络可能限制)
8.4 被锁在服务器外(配置错误导致)
救急方法:
- 登录腾讯云控制台
- 找到你的服务器 → 点击「登录」→ 使用 VNC/控制台登录
- 用 root 密码登录(控制台不受 SSH 配置限制)
- 修复
/etc/ssh/sshd_config sudo systemctl restart ssh
9. Windows 安装 SSH 客户端
9.1 Windows 10 / 11(推荐:内置 OpenSSH)
Windows 10(1809 及以上)和 Windows 11 已内置 OpenSSH 客户端,但默认可能未启用。
方法一:图形界面安装
- 打开「设置」→「应用」→「可选功能」
- 点击「添加功能」
- 搜索「OpenSSH 客户端」
- 勾选并点击「安装」
- 等待安装完成
方法二:PowerShell 命令安装(管理员)
# 检查是否已安装Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH.Client*'
# 如果 State 显示为 NotPresent,则执行安装Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
# 安装完成后验证ssh -V验证安装成功:
ssh -V# 应输出类似:OpenSSH_for_Windows_8.1p1, LibreSSL 3.0.29.2 Windows 7 / 8 / 旧版 Windows 10
这些系统没有内置 OpenSSH,可使用以下替代方案:
方案一:Git for Windows(推荐,自带 Git Bash 和 ssh)
- 访问 https://git-scm.com/download/win
- 下载并安装 Git for Windows
- 安装过程中保持默认选项即可
- 安装完成后,右键桌面选择「Git Bash Here」
- 在 Git Bash 中输入:
ssh -V
方案二:PuTTY(经典 SSH 客户端)
- 访问 PuTTY 官网
- 下载
putty-64bit-0.xx-installer.msi - 安装后打开 PuTTY
- 在 Host Name 输入服务器 IP
- 在 Port 输入 2222(或你设置的端口)
- Connection type 选择 SSH
- 点击 Open 连接
PuTTY 使用密钥的方法:
- 打开 PuTTYgen(随 PuTTY 安装)
- 点击 Generate 生成密钥对
- 保存私钥(.ppk 文件)
- 将公钥内容复制到服务器的
~/.ssh/authorized_keys - 在 PuTTY 中 → Connection → SSH → Auth → Private key file
- 选择你的 .ppk 私钥文件
方案三:MobaXterm(功能强大的终端工具)
- 访问 MobaXterm 官网
- 下载免费版(Home Edition)
- 安装后打开,点击 Session → SSH
- 输入 Remote host 和 Port
- 点击 OK 连接
9.3 Windows 上使用 SSH 的注意事项
- Windows 的 SSH 配置文件路径:
%USERPROFILE%\.ssh\config(例如C:\Users\你的用户名\.ssh\config) - 首次连接时的
known_hosts保存在:%USERPROFILE%\.ssh\known_hosts - 如果提示 “WARNING: UNPROTECTED PRIVATE KEY FILE”,需要右键私钥文件 → 属性 → 安全 → 高级 → 禁用继承 → 删除所有用户,然后只添加当前用户并赋予完全控制权限
- PowerShell 中使用 ssh 时,参数与 Linux/macOS 完全一致
10. 删除用户
10.1 为什么需要删除用户?
- 员工离职,需要清理其服务器账户
- 测试账号不再需要
- 发现异常账户,需要立即禁用或删除
- 系统维护,清理无用账户减少攻击面
10.2 查看系统中所有用户
# 查看所有普通用户(UID >= 1000)awk -F: '$3 >= 1000 {print $1}' /etc/passwd
# 查看所有用户及其 UID、GID、家目录cat /etc/passwd
# 查看当前在线用户whow
# 查看用户最近登录记录last10.3 删除用户(保留家目录)
# 使用 deluser(Debian/Ubuntu 推荐,更友好)sudo deluser qtfy
# 或使用 userdel(通用命令)sudo userdel qtfy效果: 删除用户账户和组,但保留 /home/qtfy 目录
10.4 删除用户及其家目录
# deluser 加 --remove-home 参数sudo deluser --remove-home qtfy
# userdel 加 -r 参数sudo userdel -r qtfy效果: 删除用户账户、组、家目录 /home/qtfy,以及邮件池
10.5 彻底清理用户所有痕迹
# 1. 先强制终止该用户的所有进程sudo pkill -u qtfysudo killall -u qtfy
# 2. 删除用户及其家目录sudo deluser --remove-home qtfy
# 3. 手动检查并删除其他相关文件(如有)sudo rm -rf /var/spool/mail/qtfy # 邮件池(deluser --remove-home 已处理)sudo rm -rf /var/www/html/qtfy # 如有该用户的网站目录sudo rm -rf /tmp/qtfy* # 临时文件
# 4. 从 sudo 权限中移除(如之前加入过)sudo gpasswd -d qtfy sudo
# 5. 检查 crontab 任务sudo crontab -u qtfy -l # 查看该用户的定时任务sudo crontab -u qtfy -r # 删除该用户的定时任务10.6 临时禁用用户(不解删除)
# 方法一:锁定密码(用户无法登录,但数据保留)sudo passwd -l qtfy
# 解锁sudo passwd -u qtfy
# 方法二:设置账户过期日期为昨天(立即失效)sudo usermod --expiredate 1 qtfy
# 恢复账户sudo usermod --expiredate "" qtfy
# 方法三:将用户的 shell 改为 nologin(无法登录但数据保留)sudo usermod -s /usr/sbin/nologin qtfy
# 恢复(假设原 shell 是 bash)sudo usermod -s /bin/bash qtfy10.7 删除用户时的注意事项
- 永远不要删除正在使用的用户! 确保该用户没有正在运行的进程:
ps -u qtfy;确保该用户没有打开的文件:lsof -u qtfy - 删除前备份重要数据! 如果用户家目录有重要文件,先备份:
sudo tar czvf /backup/qtfy_backup.tar.gz /home/qtfy - 检查该用户是否拥有系统服务! 某些服务可能以该用户运行,删除前需确认:
sudo systemctl list-units --type=service | grep qtfy - 不要删除系统内置用户! UID < 1000 的用户通常是系统账户(如 root, www-data, mysql),除非明确知道用途,否则不要删除
11. 完整命令速查表
服务器端
# 检查 SSH 状态sudo systemctl status ssh
# 创建用户sudo adduser qtfysudo usermod -aG sudo qtfy
# 编辑 SSH 配置sudo nano /etc/ssh/sshd_config
# 关键配置项Port 2222PermitRootLogin noPasswordAuthentication yesPubkeyAuthentication yesAllowUsers qtfy
# 测试配置语法sudo sshd -t
# 重启 SSHsudo systemctl restart ssh
# 防火墙sudo ufw allow 2222/tcpsudo ufw enablesudo ufw status
# 查看登录日志sudo tail -f /var/log/auth.log
# 查看所有用户awk -F: '$3 >= 1000 {print $1}' /etc/passwd
# 删除用户(保留家目录)sudo deluser qtfy
# 删除用户及家目录sudo deluser --remove-home qtfy
# 锁定用户sudo passwd -l qtfy
# 强制终止用户进程sudo pkill -u qtfy客户端
# 生成密钥ssh-keygen -t ed25519 -C "qtfy@example.com"
# 复制公钥到服务器ssh-copy-id -p 2222 qtfy@IP
# 连接ssh -p 2222 qtfy@IP
# 详细模式(排错)ssh -v -p 2222 qtfy@IP
# 使用配置文件后简化连接ssh myserverWindows 安装 SSH
# 检查 OpenSSH 客户端是否安装Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH.Client*'
# 安装 OpenSSH 客户端(PowerShell 管理员)Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
# 验证ssh -V文档版本: 2026-07-30
适用系统: Debian 11+ / Ubuntu 20.04+
适用平台: 腾讯云 CVM / 任何支持 SSH 的 Linux 服务器
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!













