资讯动态

Ubuntu远程连接实战:SSH配置、密钥认证与常见故障排查

发布时间:2026/10/14 4:24:09 来源:尧图企业网站定制
用 Ubuntu 当服务器或者拿手头闲置电脑装个 Ubuntu 当家用小主机的人最先要解决的那个事基本都一样身边没有显示器、没有键盘的时候怎么稳定登录进去操作。装系统偶尔还能搬一次显示器凑合可系统起来之后总不能每回都搬台屏幕过去。远程连接就是干这个的Ubuntu 远程连接最主流的答案就是 SSHSecure 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配好后改 noPubkeyAuthenticationyes允许公钥认证MaxAuthTries3~6限制单次连接的认证尝试次数改完配置一定要先测试语法再重启这条我能多强调都不嫌多sudo sshd -t sudo systemctl restart sshsshd -t只检查语法不实际重启有语法错误会直接报出来。如果配置写得有问题就盲目重启最坏情况是你把当前这个 SSH 会话搞没然后彻底连不上了。到那时就只能在服务器本地接显示器修对一个远程机器来说是很尴尬的事故。3. 客户端操作实战从不同终端接入 Ubuntu3.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 userip。它会逐行打印认证过程连到哪个地址、加载哪个密钥、服务器接受还是拒绝、密码认证成没成。排查的时候这个参数比什么网上的玄学答案都靠谱。3.2 Windows 下的连接方式Windows 现在是越来越省心了。Windows 10 以后的系统自带 OpenSSH 客户端直接在 PowerShell 或 Terminal 里敲ssh userip就行和 Linux 下的命令几乎一致。不用特地去装第三方软件这大概是我这几年觉得 Windows 变化里最舒服的一个。不过 Windows 下有几个细节容易坑人。一是路径问题~/.ssh对应的实际位置是C:\Users\你的用户名\.ssh配置密钥、写config文件都在这个目录下。二是换行符问题如果你把公钥文件用记事本编辑过可能因为编码和换行问题导致服务器端认证失败建议用 PowerShell 的命令行工具处理或者用支持 LF 换行的编辑器。个人建议把 Windows Terminal 作为主力终端它对 SSH 会话的管理更顺手多标签切换也舒服。虽然第三方工具也不错但系统自带的这套已经足够日常使用。3.3 连接参数的优化与 SSH 别名配置如果你经常连同一台机器每次都敲ssh -p 1234 user192.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-boxIdentityFile指定了使用的私钥路径不再需要每次指定-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-idssh-copy-id userserver-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 服务器IPping 不通问题出在网络上网段不对、路由器隔离、云安全组未放行都是可能原因。ping 得通但 22 端口不通继续下一步nc -zv 服务器IP 22端口不通优先检查服务器端 ssh 服务是否在运行然后查 ufw 防火墙、云安全组。端口是通的但 SSH 认证失败把日志调出来看ssh -v userserver-ip-v输出里如果出现Connection refused说明端口根本没在监听Connection timed out说明包被丢弃大概率是防火墙Permission denied (publickey,password)则说明认证环节出问题可能是密钥没配对、权限错误、密码输错或者服务器端限制了认证方式。我还碰到过一个很典型的情况SSH 服务正常运行、防火墙正常、密钥也没问题但就是连不上。最后发现是服务器的磁盘满了sshd 无法写入必要的临时文件导致连接被中断。遇到诡异的连接问题顺手查一下磁盘和负载df -h uptime5.2 连接卡顿与频繁掉线怎么办还有一种很常见的困扰连接倒是能连上但用一会儿就卡了或者闲置几分钟就断开。这种问题多数不是 SSH 本身挂了而是长连接被网络设备“清理”了。解决思路分两端。客户端在~/.ssh/config里加保活Host * ServerAliveInterval 60 ServerAliveCountMax 3意思是每 60 秒发一个保活包如果连续 3 次没回应就判断连接失效。服务端也可以在/etc/ssh/sshd_config里设置ClientAliveInterval和ClientAliveCountMax不过我更倾向于由客户端主动保活配置灵活还不影响其他用户。如果 SSH 登录本身慢输密码之前要等好几秒多半是 DNS 反向解析在拖后腿。在服务端配置里把这两个参数加进去重启 sshd 就能解决大部分登录慢问题UseDNS no GSSAPIAuthentication noUseDNS让 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 userserver-ip:/home/user/ rsync -avz ./local-dir/ userserver-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 才真正变成了一台“随时在线、随时可控”的服务器。最后再提醒一句所有修改配置的操作都留一个当前会话别关确认新配置无误后再清理这个习惯能让你避免绝大多数远程管理事故。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑