开门见山地说,只要你在跑 Linux 服务器,SSH 基本就是每天都要打交道的工具。Ubuntu 22.04 的默认安装里通常带有 SSH 客户端,但服务端不一定装好,更别谈开箱即用的安全配置。很多人装上 openssh-server 能连上就以为完工了,等到服务器被扫、被爆破、被塞进挖矿脚本,才回头补安全策略,这种体验我太熟悉了。这篇文章不是简单教你敲几条 systemctl 命令,而是把 Ubuntu 22.04 里从安装、启用、加固到日常排障的完整链路讲清楚,重点放在“安全远程访问”这六个字上。内容覆盖密钥认证、禁止 root 直接登录、用 AllowGroups 精确控制可登录用户、防火墙配合、VSCode Remote-SSH 连接等真实场景,新手可以照抄,有基础的朋友也能查漏补缺。
1. SSH 的核心作用,以及 Ubuntu 22.04 里哪些默认行为要先搞清楚
1.1 SSH 解决的到底是什么问题
服务器通常放在机房、云平台或者家里某个角落,你不可能每次都跑到屏幕前敲键盘。SSH(Secure Shell)的价值就是在不安全的网络上建立一条加密通道,让你远程登录、执行命令、传文件都像是坐在本机前操作一样。换个生活化的类比:你家的门锁原本只能从里面插钥匙,SSH 相当于给这扇门装了一个远程遥控锁,钥匙是加密后的身份凭证,别人即使看到你在门外按密码,也无法复制出这把钥匙。
在 Ubuntu 22.04 上,系统自带的 OpenSSH 分为客户端和服务端两个部分。客户端用来连接别人,服务端用来被别人连。很多人用 ssh user@host 能连到别的机器,就以为本机也“开了 SSH”,这是个常见的误区。本机默认不一定安装了 openssh-server,所以我下面把服务端的安装和启动单独拎出来讲。
1.2 22.04 的配置方式相比老版本有什么要注意的地方
Ubuntu 22.04 的 SSH 主配置文件仍然是 /etc/ssh/sshd_config,但有个容易被忽略的关键细节:这个文件底部默认带着一行 Include /etc/ssh/sshd_config.d/*.conf。也就是说,系统会读取 sshd_config.d 目录下所有以 .conf 结尾的文件,并把它们的配置合并进来。官方建议自定义配置放在这个目录里新建独立文件,而不是直接改动主配置,好处是升级系统时不容易被覆盖,排查时也一目了然。
但这里有个隐藏的坑:如果你用的是云服务器镜像,/etc/ssh/sshd_config.d/ 里可能已经存在 cloud-init 生成的配置(比如 50-cloud-init.conf)。这些文件里的某项设置可能和你的预期冲突,修改后明明保存了却不生效,多半就是被后读取的同名配置顶掉了。判断规则是:sshd 按顺序读取配置,同一条指令以先到先得的第一条为准,后面的会被忽略。所以自定义文件名建议用 99- 开头,比如 99-hardening.conf,确保排在最后,这样遇到同名的旧配置时可以保证你的策略生效。
还有一个 Ubuntu 22.04 相关的特性:如果云平台的初始化工具修改过 SSH 配置,重启后你的改动可能会被复原。虽然这种情况主要出现在云镜像里,但本地虚拟机安装时也可能遇到残留的 cloud-init 包,如果你发现自己改的 sshd 配置总是莫名其妙丢失,可以执行 sudo cloud-init clean 或者干脆卸载 cloud-init,这个后面排查章节会再提。
1.3 动手前的准备清单
在开始配置之前,先花两分钟确认几件事,能避免后边把自己锁在门外:
- 你有一个非 root 的 sudo 用户,并且知道密码。
- 当前机器的 IP 地址固定(DHCP 分配的地址重启后可能变化,如果是虚拟机建议在路由器里做地址保留,或者用 netplan 配静态 IP)。
- 你当前用什么方式访问这台机器:如果是物理机,确保你能走到它面前操作;如果是云服务器,确保厂商控制台的 VNC 或者网页终端可用,这是最后一条保命通道。
- 系统时间要准确,密钥认证和日志排查都依赖时间一致性,时间差太远可能导致连接异常。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 安装、启用 SSH 服务端,并完成第一次连接验证
2.1 安装 openssh-server,为什么还要顺带确认客户端
登录到 Ubuntu 22.04 后,先执行系统更新。
bash复制sudo apt update && sudo apt upgrade -y
然后安装 SSH 服务端。
bash复制sudo apt install -y openssh-server openssh-client
大部分 Ubuntu 22.04 的最小安装已经带有 OpenSSH 客户端,但这里再装一次也无妨。客户端和服务端是两个独立包,openssh-client 提供 ssh、scp、sftp 等命令,openssh-server 才提供 sshd 服务。如果你只打算让别人连这台机器,那么只装 server 也够;但通常运维人员会在这台机器上再连别的服务器,所以两个都装更实用。
安装完成后,OpenSSH 服务端会自动启动吗?在 Ubuntu 22.04 上,openssh-server 安装后会自动创建 systemd 服务 ssh.service,但启动状态取决于安装包的行为。别猜,直接查看:
bash复制systemctl status ssh
如果显示 active (running),说明已经起来了。如果没起来,手动启动并设置开机自启:
bash复制sudo systemctl enable --now ssh
注意这里服务名是 ssh,不是 sshd。Ubuntu 的 Debian 系列风格里,systemd 服务名叫 ssh,不要下意识敲成 sudo systemctl start sshd 然后报错。
2.2 确认端口监听,以及如何找到自己的 IP
服务启动后,用 ss 命令确认端口监听状态:
bash复制sudo ss -tlnp | grep ssh
正常你会看到类似这样的输出:
text复制LISTEN 0 4096 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1234,fd=3))
这说明 sshd 已经在所有 IPv4 地址的 22 端口上监听。如果没有看到输出,要么服务没起来,要么端口被其他配置改过。
接着确认本机 IP:
b复制
