☰
Ubuntu远程连接实战:SSH配置、密钥认证与常见故障排查
2026/10/14 4:24:00 网站建设 项目流程

用 Ubuntu 当服务器,或者拿手头闲置电脑装个 Ubuntu 当家用小主机的人,最先要解决的那个事基本都一样:身边没有显示器、没有键盘的时候,怎么稳定登录进去操作。装系统偶尔还能搬一次显示器凑合,可系统起来之后总不能每回都搬台屏幕过去。远程连接就是干这个的,Ubuntu 远程连接最主流的答案,就是 SSH(Secure Shell,安全外壳协议)。

这篇文章不整那些学院派理论,就按我这些年连服务器、连家里小主机、帮别人排查各种连不上的实际经历,把 Ubuntu 这边怎么装服务端、客户端怎么连、怎么配密钥免密、怎么加固、以及踩过的那些坑一次性讲清楚。写之前说个适用范围:适合刚接触 Linux 的新手,也适合配完能连上但想搞清楚“为什么这么配”的人。命令行我尽量掰开揉碎讲,但别指望我手把手教完所有基础命令,那篇幅就收不住了。

1. 远程连接 Ubuntu 的本质:SSH 到底解决了什么问题

1.1 SSH 协议的核心价值

SSH 就是一个用于远程登录和远程命令执行的网络协议,默认走 22 端口。它解决了远程管理中最致命的问题:网络传输安全。你通过终端敲进去的密码、执行的命令、脚本回传的数据,全部经过加密,中间有人抓包也拿不到明文。早年的 Telnet 远程登录就是明文传输,密码裸奔在网上还不自知,现在谁再这么干我建议先抽自己两巴掌再改。

SSH 的工作逻辑可以简化成一个递进过程:客户端连上服务器后,双方先通过非对称加密完成身份验证和协商,确认“你就是那台机器”“对方确实是目标服务器”,再生成一个临时的会话密钥,之后的所有数据都用这个会话密钥做对称加密传输。打个比方就是:进门之前先亮身份证,确认身份后才发一把临时钥匙,之后整栋楼随便进,但进出记录全是加密的。非对称加密负责开头的信任建立,对称加密负责后续的高效传输,这套组合到今天依然是远程登录的事实标准。

也正因为 SSH 是标准协议,Ubuntu 才不只是“支持”它,而是把它做进了基础体系里。镜像安装时如果你勾选了 OpenSSH server,装完就能直接连;就算没勾,一条 apt 命令也能搞定。所以比起各种远程桌面、第三方管理工具,SSH 是我个人最推荐的首选方案——轻量、稳定、不依赖图形界面、脚本友好。

1.2 谁在用 SSH:几个典型场景

说几个我实际遇到的场景,你对照一下就知道自己在不在圈里。

第一种是云服务器用户。买完一台 Ubuntu 云主机,厂商只给你公网 IP 和账号,没有显示器,唯一的入口就是 SSH。这种场景对 SSH 的依赖是刚需,而且通常还要处理安全组、防火墙规则这些东西。

第二种是家用小主机或者旧电脑装 Ubuntu。有人拿它做 NAS、跑 Docker、挂下载任务,机器丢在弱电箱或者角落里,平时靠 SSH 登录维护。我个人的习惯是“能 SSH 就不上楼搬显示器”,甚至整套维护流程都是纯命令行完成:改配置、看日志、重启服务,连远程桌面都不需要。

第三种是开发调试。本地电脑通过 SSH 连到一台 Ubuntu 机器上跑编译、跑测试、看日志,或者把本地的某个开发服务临时绑定到服务器端口上,方便联调。

这三种场景覆盖面已经很广了,但它们的共同点都是同一个:你手里只有命令行,服务器在远方,你需要在安全、可控的前提下完成管理。所以下面整套内容,都围绕“怎么把 SSH 这条通道搭好、用顺、加固到位”展开。

2. 服务端准备:让 Ubuntu 可以被远程访问

2.1 安装与启动 OpenSSH 服务

很多人第一次配 SSH 就卡在第一步:明明 Ubuntu 装着,ping 也通,为什么连不上?大概率是压根没装服务端。Ubuntu 桌面版默认只装 SSH 客户端,不带 sshd 服务端,所以你必须手动安装。

sudo apt update sudo apt install -y openssh-server

装完先确认服务状态:

sudo systemctl status ssh

如果显示 active (running),说明 sshd 已经在跑。如果没跑,用下面这条启动并设为开机自启:

sudo systemctl enable --now ssh

这里有个细节值得注意:Ubuntu 上这个服务名到底是 ssh 还是 sshd,很多人容易搞混。Ubuntu 的服务名是ssh,对应配置文件是/etc/ssh/sshd_config。用systemctl status ssh查,而不是sshd,后者在部分发行版上能查到,但在 Ubuntu 上经常会报错。我在实际维护中经常遇到有人拿这条命令查完说“服务没了”,其实只是查错了名字。

装完可以顺手确认一下端口监听是否正常:

ss -tlnp | grep 22

出现类似0.0.0.0:22的监听记录就说明 SSH 正在等待连接。到这里服务端其实就是待命状态了,接下来要保证网络层面能放行。

2.2 网络与防火墙的配合

服务端跑起来只是第一步,数据能不能从外部到达 22 端口,还要看防火墙。Ubuntu 默认不开 ufw 防火墙(很多云镜像会提前开好),但你最好还是显式放行一次,避免以后开了防火墙把自己关在门外。

sudo ufw allow ssh

如果你已经在用 ufw 且只打算对特定网段开放,更稳妥的做法是指定来源:

sudo ufw allow from 192.168.1.0/24 to any port 22 proto tcp

云服务器场景下还有个“安全组”的概念。有些厂商的服务器虽然系统内防火墙全开,但安全组没有放行 22 端口,外部连接一样被拦。排查的时候一定要记住:系统防火墙一层、云安全组可能是另一层,两层都要查。我见过太多次“明明服务在跑、本地测试都没问题,偏偏外网连不上”的案例,最后一看就是安全组没放行。

2.3 配置文件里的几个关键参数

SSH 服务端主配置文件是/etc/ssh/sshd_config。需要注意的是新版 Ubuntu 通常在文件末尾有一句Include /etc/ssh/sshd_config.d/*.conf,意思是会额外加载/etc/ssh/sshd_config.d/目录下所有.conf文件。这个机制很实用——你想做的自定义配置可以单独放到一个文件里,比如/etc/ssh/sshd_config.d/99-custom.conf,既不会跟默认配置混在一起,升级系统时也不容易被覆盖。

我建议优先关注这几个参数:

参数推荐值说明
Port22 或自定义端口改端口能减少扫描骚扰,但别指望一劳永逸
PermitRootLoginprohibit-password禁止 root 用密码登录,但允许密钥登录
PasswordAuthentication看需求配好密钥前保持 yes,配好后改 no
PubkeyAuthenticationyes允许公钥认证
MaxAuthTries3~6限制单次连接的认证尝试次数

改完配置一定要先测试语法再重启,这条我能多强调都不嫌多:

sudo sshd -t sudo systemctl restart ssh

sshd -t只检查语法不实际重启,有语法错误会直接报出来。如果配置写得有问题就盲目重启,最坏情况是你把当前这个 SSH 会话搞没,然后彻底连不上了。到那时就只能在服务器本地接显示器修,对一个远程机器来说是很尴尬的事故。

3. 客户端操作实战:从不同终端接入 Ubuntu

3.1 Linux/macOS 下的命令行连接

客户端连接其实特别简单。在 Linux 或者 macOS 上,打开终端直接敲:

ssh 用户名@服务器IP

默认端口是 22,如果你改过端口,加-p参数:

ssh -p 端口号 用户名@服务器IP

第一次连接的时候会看到一条 host key 确认提示,问你是否确认连接。这是 SSH 防止中间人攻击的重要机制:服务器会出示自己的主机密钥指纹,客户端把它记录下来,下次连的时候比对是否一致。我第一次带新手用 SSH 时经常有人直接一路 yes 到底,结果服务器重装系统后指纹变了,又跑来问为什么报 “REMOTE HOST IDENTIFICATION HAS CHANGED”。指纹确认要自己心里有数,尤其在生产环境里,别闭眼无脑回车。

如果连接过程要调试,可以加-v参数输出详细日志,比如ssh -v user@ip。它会逐行打印认证过程:连到哪个地址、加载哪个密钥、服务器接受还是拒绝、密码认证成没成。排查的时候这个参数比什么网上的玄学答案都靠谱。

3.2 Windows 下的连接方式

Windows 现在是越来越省心了。Windows 10 以后的系统自带 OpenSSH 客户端,直接在 PowerShell 或 Terminal 里敲ssh user@ip就行,和 Linux 下的命令几乎一致。不用特地去装第三方软件,这大概是我这几年觉得 Windows 变化里最舒服的一个。

不过 Windows 下有几个细节容易坑人。一是路径问题,~/.ssh对应的实际位置是C:\Users\你的用户名\.ssh,配置密钥、写config文件都在这个目录下。二是换行符问题,如果你把公钥文件用记事本编辑过,可能因为编码和换行问题导致服务器端认证失败,建议用 PowerShell 的命令行工具处理,或者用支持 LF 换行的编辑器。

个人建议把 Windows Terminal 作为主力终端,它对 SSH 会话的管理更顺手,多标签切换也舒服。虽然第三方工具也不错,但系统自带的这套已经足够日常使用。

3.3 连接参数的优化与 SSH 别名配置

如果你经常连同一台机器,每次都敲ssh -p 1234 user@192.168.1.100实在太折磨人。我强烈建议配置~/.ssh/config文件,给常用主机起个“小名”。

Host ubuntu-box HostName 192.168.1.100 Port 22 User myname IdentityFile ~/.ssh/id_ed25519 ServerAliveInterval 60

配置完之后,连接直接就简化成:

ssh ubuntu-box

IdentityFile指定了使用的私钥路径,不再需要每次指定-i。ServerAliveInterval的意思是客户端每 60 秒发一个保活包,防止长时间没操作被中间设备掐断。对长期挂着的会话来说,这条参数救过我很多次。

config 文件还支持Host *这类通配匹配,把通用选项统一写在通配块里,然后把每台机器的独有参数写在具体条目里。注意一个细节:config 文件权限不能太开放,否则 SSH 会直接拒绝加载,甚至报 “bad permissions”。Linux/macOS 上把目录设为700、文件设为600比较稳妥。

4. 密钥认证配置:告别密码输入的安全升级

4.1 生成密钥对的正确姿势

密码登录虽然方便,但密码可以被爆破、可以被嗅探、也可能被自己记错。所以只要条件允许,我都建议切到密钥登录。原理就是一对非对称密钥:私钥留在本地,公钥放到服务器。连接时服务器用公钥验证你的身份,只有持有匹配私钥的客户端才能通过。

生成密钥对在本地客户端上进行,而不是在服务器上:

ssh-keygen -t ed25519 -C "your-email-or-comment"

-t ed25519指定算法。现在新项目我基本都用 Ed25519,它比传统 RSA 更短、更快、安全性也更强。当然如果你要连接的是一些老系统、老库,可能只支持 RSA,那就用ssh-keygen -t rsa -b 4096。在选型上我的建议是:能上 Ed25519 就别犹豫,历史兼容性有要求再退回 RSA。

生成过程中会问你要不要把私钥设置密码(passphrase)。很多人图省事直接回车留空,我个人的习惯是:开发机可以留空图方便,但笔记本电脑这类可能丢失的设备一定要设置。私钥密码可以在系统 keychain 里托管,访问私钥时自动解锁,既安全又不影响体验。

4.2 将公钥部署到 Ubuntu 服务器

部署公钥最标准的方式是用ssh-copy-id:

ssh-copy-id user@server-ip

它会自动把你的公钥追加到服务器的~/.ssh/authorized_keys文件里,同时把相关目录权限修正到位。执行过程中会让你输入一次密码,之后就可以尝试免密登录了。

没有ssh-copy-id的环境(比如 Windows PowerShell 原生没有这个命令),可以手动追加。整个过程就三步:本地查看公钥内容 → 在服务器上把公钥追加到authorized_keys→ 修权限。

# 本地查看公钥 cat ~/.ssh/id_ed25519.pub # 服务器上执行 mkdir -p ~/.ssh chmod 700 ~/.ssh echo "粘贴公钥内容" >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys

权限问题是密钥认证里最经典的坑。如果.ssh目录或者authorized_keys文件的权限过于宽松(比如 group 和 other 可写),sshd 出于安全考虑会直接拒绝使用这个公钥文件,然后退回到密码认证。你会在日志里看到类似 “Authentication refused: bad ownership or modes” 的记录。所以部署完一定要检查权限,步骤里的700和600不是随便写的数值。

4.3 禁用密码登录与最后的加固

密钥部署完成、确认能免密登录之后,就可以把密码登录关掉了,这一步做完 SSH 的安全性会有质的变化。在服务端新建一个配置文件:

sudo nano /etc/ssh/sshd_config.d/99-hardening.conf

写入:

PasswordAuthentication no PermitRootLogin prohibit-password

保存后先测语法再重启:

sudo sshd -t sudo systemctl restart ssh

重启之前务必开一个额外的 SSH 会话验证密钥登录没问题,千万不要把唯一的活动会话关掉再去重启服务。我处理过一起事故:某开发者改完配置马上重启 sshd 并断开旧会话,结果密钥没配好、密码认证又被自己关了,最后只能跑机房接显示器。

PermitRootLogin prohibit-password保留了 root 的密钥登录能力,但禁止密码登录。日常管理我还是建议用普通用户登录,需要提权时再sudo,这样所有操作都有审计,也避免 root 账号直接暴露在外。对于 Fail2ban 这类额外防护,等你有精力再补不迟,它能在多次密码失败后临时封禁来源 IP,对公网机器是值得一上的。

5. 常见故障排查与优化技巧

5.1 连接失败的分层排查思路

SSH 连不上,一定不要慌,更不要一上来就重装系统。我按顺序排查,基本五分钟内能定位。

第一步确认网络通不通:

ping 服务器IP

ping 不通,问题出在网络上:网段不对、路由器隔离、云安全组未放行都是可能原因。ping 得通但 22 端口不通,继续下一步:

nc -zv 服务器IP 22

端口不通,优先检查服务器端 ssh 服务是否在运行,然后查 ufw 防火墙、云安全组。端口是通的但 SSH 认证失败,把日志调出来看:

ssh -v user@server-ip

-v输出里如果出现Connection refused,说明端口根本没在监听;Connection timed out说明包被丢弃,大概率是防火墙;Permission denied (publickey,password)则说明认证环节出问题,可能是密钥没配对、权限错误、密码输错,或者服务器端限制了认证方式。

我还碰到过一个很典型的情况:SSH 服务正常运行、防火墙正常、密钥也没问题,但就是连不上。最后发现是服务器的磁盘满了,sshd 无法写入必要的临时文件,导致连接被中断。遇到诡异的连接问题,顺手查一下磁盘和负载:

df -h uptime

5.2 连接卡顿与频繁掉线怎么办

还有一种很常见的困扰:连接倒是能连上,但用一会儿就卡了,或者闲置几分钟就断开。这种问题多数不是 SSH 本身挂了,而是长连接被网络设备“清理”了。

解决思路分两端。客户端在~/.ssh/config里加保活:

Host * ServerAliveInterval 60 ServerAliveCountMax 3

意思是每 60 秒发一个保活包,如果连续 3 次没回应就判断连接失效。服务端也可以在/etc/ssh/sshd_config里设置ClientAliveInterval和ClientAliveCountMax,不过我更倾向于由客户端主动保活,配置灵活,还不影响其他用户。

如果 SSH 登录本身慢(输密码之前要等好几秒),多半是 DNS 反向解析在拖后腿。在服务端配置里把这两个参数加进去,重启 sshd 就能解决大部分登录慢问题:

UseDNS no GSSAPIAuthentication no

UseDNS让 sshd 不再反向解析客户端 IP 的主机名,省掉一次网络查询;GSSAPIAuthentication关闭用 Kerberos 认证的那套尝试流程,减少不必要的握手等待。

5.3 几个进阶优化建议

到这里 SSH 基本已经能稳定、安全地使用了,最后分享几个我个人常用的进阶技巧。

第一个是 SSH 会话复用。如果你经常需要同时开多个 SSH 窗口连同一台机器,可以在config里加上:

Host ubuntu-box ControlMaster auto ControlPath ~/.ssh/controlmasters/%r@%h:%p ControlPersist 10m

这样第一次连接会建立主连接,之后新开的会话直接复用这条底层通道,不用重复握手认证,连接速度几乎是秒开。ControlPersist 10m的意思是最后一个会话关闭后,主连接继续保留 10 分钟,方便随时再次秒连。

第二个是传输文件。远程管理不只是敲命令,文件往来同样经常发生。scp和rsync都是基于 SSH 通道的工具:

scp ./local-file.txt user@server-ip:/home/user/ rsync -avz ./local-dir/ user@server-ip:/home/user/remote-dir/

rsync适合同步目录,支持增量传输,传大目录比scp高效很多。日常传小文件,scp简单直接也够了。

第三个是对日志的敏感度。SSH 连接出问题,服务端的日志基本能告诉你一切:

sudo tail -f /var/log/auth.log

比如看到Failed password for invalid user刷屏,说明有人在扫你的端口尝试爆破;看到Connection closed by authenticating user则可能说明密钥不被接受。学会看日志比到处搜教程更管用。我自己处理远程连接问题的经验里,八成以上都能从 auth.log 里找到答案,剩下两成才是网络层和配置层的问题。

SSH 这套东西,用顺了之后你会发现它不只是“远程登录工具”,而是一种管理机器的基本思维方式:所有操作都可以被审计、被脚本化、被安全地自动化。从装上 sshd 那一刻起,这台 Ubuntu 才真正变成了一台“随时在线、随时可控”的服务器。最后再提醒一句,所有修改配置的操作都留一个当前会话别关,确认新配置无误后再清理,这个习惯能让你避免绝大多数远程管理事故。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询