Ubuntu SSH远程连接配置全攻略:从安装到安全优化

发布时间:2026/8/13 13:21:04
Ubuntu SSH远程连接配置全攻略:从安装到安全优化 1. 从零开始为什么SSH是远程管理Ubuntu的基石如果你刚接触Ubuntu服务器或者在自己的电脑上装了个Ubuntu虚拟机第一个要解决的问题往往就是怎么从另一台电脑上方便地操作它难道每次都要跑到机器面前插上键盘鼠标吗对于服务器来说这显然不现实。这时候SSHSecure Shell就是你的“远程桌面”而且是纯命令行的、更高效、更安全的那一种。它让你能通过网络安全地登录到另一台Linux机器上执行任何命令就像你正坐在它面前一样。我见过不少新手包括几年前的我自己在Ubuntu上装完系统兴冲冲地想从Windows笔记本连过去结果发现根本连不上提示“连接被拒绝”或者“连接超时”。这通常不是因为网络问题而是Ubuntu默认并没有开启SSH服务的大门。今天我就以Ubuntu 20.04 LTS这个长期支持、目前依然广泛使用的版本为例带你从零开始一步步配置好SSH远程连接并解决那些你大概率会遇到的坑。整个过程不仅适用于物理服务器、虚拟机VMware/VirtualBox也适用于云服务器AWS EC2, 腾讯云CVM等和WSL2环境。简单来说完成SSH远程连接需要三个核心条件服务端你的Ubuntu安装了SSH服务并正在运行、防火墙放行了SSH端口默认22、客户端知道正确的IP地址和登录凭证。缺一不可。我们接下来就围绕这三点展开。2. 服务端配置安装并启动OpenSSH ServerUbuntu桌面版在安装时默认是不包含SSH服务器端软件的。所以我们的第一步就是在Ubuntu机器上安装它。2.1 安装OpenSSH Server打开Ubuntu的终端如果你就在机器前可以用CtrlAltT快捷键输入以下命令sudo apt update sudo apt install openssh-server -y这里有两个关键点需要解释一下sudo apt update这不是可有可无的步骤。它用于更新本地软件包索引列表。Ubuntu的软件源信息是缓存在本地的update命令会从配置的软件源服务器获取最新的软件包列表确保你接下来安装的是最新版本也能避免因索引过期导致的“找不到软件包”错误。sudo apt install openssh-server -y-y参数表示在安装过程中对所有提示都自动回答“yes”。这能让你免去一次手动确认实现一键安装。openssh-server就是我们要的SSH服务端软件包。安装完成后SSH服务通常会自动启动。你可以用下面的命令来验证它是否正在运行sudo systemctl status ssh如果看到绿色的“active (running)”字样说明服务已经成功跑起来了。这是最理想的情况。2.2 管理SSH服务启动、停止与重启虽然服务通常自启但知道如何手动管理它很有必要尤其是在修改配置后。启动SSH服务sudo systemctl start ssh停止SSH服务sudo systemctl stop ssh重启SSH服务修改配置后常用sudo systemctl restart ssh设置开机自启sudo systemctl enable ssh禁用开机自启sudo systemctl disable ssh注意在云服务器场景下如果你是通过云服务商提供的网页控制台如AWS的EC2 Instance Connect 阿里云的VNC首次登录那么安装并启动openssh-server后就可以关闭网页控制台转而使用你更熟悉的本地终端如Windows的PowerShell或macOS的Terminal通过SSH连接了。这是一个重要的切换节点。3. 网络与防火墙打通连接的关键通道服务装好了但你的连接请求可能还在门外被拦住。这里主要有两道“门卫”网络配置和防火墙。3.1 获取Ubuntu的IP地址客户端需要知道目标服务器的地址。在Ubuntu终端里使用ip addr或老牌的ifconfig如果未安装可用sudo apt install net-tools安装命令来查看。通常你会看到一个或多个网络接口。对于有线连接找eth0或ens33这类名称对于无线连接找wlan0。在对应的接口信息中找到inet后面跟着的一串数字比如192.168.1.105这就是你的Ubuntu在本地网络中的IP地址。对于云服务器这个IP地址通常是公网IP你可以在云服务商的管理控制台上找到它。请务必区分公网IP和私有IP。从互联网连接必须使用公网IP。3.2 配置防火墙UFW放行SSHUbuntu 20.04默认带了一个用户友好的防火墙配置工具——UFWUncomplicated Firewall。默认情况下UFW可能是关闭的但一旦你启用它它就会严格限制入站连接。所以我们必须明确告诉UFW“允许SSH连接”。检查UFW状态sudo ufw status如果显示Status: inactive说明防火墙未启用那么所有端口默认都是开放的你可以暂时跳过这一步。但我强烈建议你启用并正确配置它这是安全最佳实践。如果显示Status: active你需要放行SSH端口默认22sudo ufw allow ssh这条命令等价于sudo ufw allow 22/tcp。UFW已经预定义了“ssh”应用规则指向22端口。如果你想修改SSH服务监听的端口比如改为2222以增加一点隐蔽性那么命令需要对应修改sudo ufw allow 2222/tcp重要避坑点如果你在虚拟机里操作并且使用的是“NAT”网络模式那么你从宿主机器比如你的Windows电脑连接虚拟机的IP通常不是虚拟机自己看到的192.168.x.x而是一个特殊的地址如10.0.2.15并且可能需要配置端口转发。更简单的方式是将虚拟机网络模式改为“桥接模式”Bridged这样虚拟机会从你的家庭路由器获取一个和宿主机同网段的IP连接起来就直观多了。这是虚拟机环境下最常见的连接失败原因之一。4. 从客户端发起连接多种工具实战服务端准备好了现在换到你想用来远程操作的电脑上这台电脑就是客户端。客户端可以是Windows、macOS、Linux甚至是手机。4.1 Windows客户端连接Windows 10及更高版本现在内置了OpenSSH客户端。你可以按Win R输入cmd或powershell打开命令行直接使用ssh命令。连接命令的基本格式是ssh usernameserver_ip_address例如你的Ubuntu用户名叫ubuntuIP是192.168.1.105那么命令就是ssh ubuntu192.168.1.105如果是第一次连接客户端会提示你确认服务器的指纹用于验证身份输入yes即可。然后会提示你输入对应用户在Ubuntu上的登录密码。输入时密码不会显示这是正常的。如果你用的是旧版Windows或者喜欢图形化工具PuTTY是经典选择。下载运行后在“Host Name”栏输入IP地址端口默认22连接类型选“SSH”点击“Open”即可。同样会提示输入用户名和密码。关于VSCode远程连接这是开发者非常喜欢的方式。你需要安装VSCode的“Remote - SSH”扩展。安装后点击左下角的绿色图标选择“Connect to Host...”然后输入ssh usernameserver_ip_address格式的命令。VSCode会帮你管理连接并允许你在本地界面下直接编辑远程服务器上的文件体验非常流畅。这也是“最新网络热词”里vscode连接ssh远程服务器和vscode配置ssh远程连接热度高的原因。4.2 macOS/Linux客户端连接这两个系统通常自带完整的SSH客户端。打开终端Terminal使用和上面完全相同的ssh命令格式即可连接。4.3 连接常见错误与排错“Connection refused” (连接被拒绝)可能性最大Ubuntu上的SSH服务没启动。回服务端检查sudo systemctl status ssh。防火墙UFW阻止了连接。检查sudo ufw status确保SSH端口被允许。SSH服务没监听在正确端口。检查sudo ss -tlnp | grep :22看是否有sshd进程在监听22端口。“Connection timed out” (连接超时)网络不通客户端根本找不到这个IP地址。检查IP是否正确以及客户端和服务端是否在同一个网络对于局域网连接。如果是云服务器检查安全组Security Group或网络ACL规则是否放行了22端口入站——这是云服务器最常见的坑你需要在云平台的控制台找到你服务器的安全组添加入站规则允许TCP 22端口或你自定义的端口的来源为0.0.0.0/0任意IP或你的特定IP。服务器关机或网络故障。“Permission denied” (密码错误)输入的用户名或密码不正确。注意SSH登录用的是Ubuntu系统用户密码就是该用户的登录密码。区分大小写。该用户可能被禁止SSH登录。这需要检查服务端SSH配置文件/etc/ssh/sshd_config。5. 进阶安全与便利配置密钥登录与配置优化长期使用密码登录既麻烦也不安全。SSH密钥对登录是更专业、更安全的方式。5.1 配置SSH密钥登录原理是在客户端生成一对密钥公钥和私钥把公钥“锁”放到服务器上私钥“钥匙”留在客户端。连接时用私钥去匹配公钥通过即可登录无需密码。步骤一在客户端生成密钥对在你的电脑上操作ssh-keygen -t rsa -b 4096按提示回车可以设置密钥的保存路径默认在~/.ssh/下和密码短语可为空。生成后你会得到id_rsa私钥绝不可泄露和id_rsa.pub公钥。步骤二将公钥上传到Ubuntu服务器 有多种方法最常用的是ssh-copy-id命令macOS/Linux通常自带ssh-copy-id usernameserver_ip_address它会提示你输入一次密码之后就会自动将你的公钥内容追加到服务器对应用户家目录下的~/.ssh/authorized_keys文件中。对于Windows如果没有ssh-copy-id可以手动操作先复制id_rsa.pub文件内容然后SSH密码登录到服务器编辑~/.ssh/authorized_keys文件如果不存在则创建将公钥内容粘贴进去。步骤三测试密钥登录 再次尝试ssh usernameserver_ip_address如果配置正确应该不再询问密码直接登录。5.2 优化SSH服务端配置配置文件位于/etc/ssh/sshd_config。修改前请先备份。常用优化项sudo nano /etc/ssh/sshd_config禁用密码登录在密钥配置成功后强烈建议找到#PasswordAuthentication yes改为PasswordAuthentication no。这能极大防止暴力破解。修改默认端口找到#Port 22去掉注释将22改为一个1024-65535之间的其他端口如Port 2222。改完后需重启SSH服务sudo systemctl restart ssh并更新防火墙规则sudo ufw allow 2222/tcp。禁止root用户直接登录找到#PermitRootLogin prohibit-password改为PermitRootLogin no。永远使用普通用户登录再用sudo提权更安全。警告修改sshd_config时尤其是禁用密码和改端口一定要确保你的密钥登录已经100%测试通过。否则一旦配置错误重启服务你可能把自己锁在服务器外面对于云服务器务必保留网页控制台作为应急入口。6. 高阶场景与故障深度排查掌握了基础我们来看看一些更复杂的场景和那些令人头疼的深层问题。6.1 处理“ssh服务器拒绝了密码”与认证失败除了简单的密码输错这个问题可能源于服务器端的SSH配置。除了检查PasswordAuthentication还需关注用户是否被允许登录检查/etc/ssh/sshd_config中的AllowUsers或DenyUsers指令。如果设置了AllowUsers someuser那么不在列表中的用户将无法通过SSH登录。authorized_keys文件权限这个文件的权限必须非常严格。正确的权限是~/.ssh目录为700(drwx------)authorized_keys文件为600(-rw-------)。权限不对会导致密钥登录失败。可以用chmod 700 ~/.ssh和chmod 600 ~/.ssh/authorized_keys修复。SELinux/AppArmor在某些严格的安全策略下这些安全模块可能会阻止SSH读取密钥文件。可以尝试临时禁用或查看相关日志/var/log/audit/audit.log或journalctl -u ssh来排查。6.2 穿透网络障碍不在同一局域网的连接如果你的Ubuntu服务器在家庭网络而你想从公司网络访问这就涉及内网穿透或端口转发。家庭路由器通常分配的是私有IP如192.168.1.x在公网上是不可直接寻址的。解决方案路由器端口转发在家庭路由器的管理界面设置一条规则将路由器WAN口公网侧的某个端口如22222的TCP流量转发到内网Ubuntu服务器的22端口。这样你通过连接路由器公网IP:22222就能访问到内网服务器。前提是你的家庭宽带拥有公网IP现在很多运营商给的是大局域网IP。使用内网穿透工具如frp、ngrok、花生壳等。需要在公网有一台具有固定IP的服务器VPS作为跳板家庭服务器和跳板建立连接客户端通过连接跳板来访问家庭服务器。这是解决无公网IP情况的通用方案。云服务器反向SSH隧道一个巧妙的技巧是让家庭服务器主动SSH连接到一台你有权限的云服务器并在云服务器上建立一个反向隧道。命令类似ssh -R 云服务器端口:localhost:22 云服务器用户云服务器IP。然后你就可以通过连接云服务器的指定端口来访问家庭服务器了。6.3 与开发工具链集成PyCharm, CLion, VS2022现代IDE都提供了强大的远程开发支持其底层大多依赖SSH。PyCharm/IntelliJ IDEA在设置中找到“Build, Execution, Deployment” - “Deployment”可以添加一个SFTP基于SSH的文件传输连接映射本地项目到远程服务器目录。更高级的是使用“Remote Interpreter”将Python解释器设置为远程服务器上的解释器实现本地写代码远程运行调试。CLion同样支持“Remote Host”访问通过SSH连接到远程服务器使用“Toolchains”配置远程编译器实现远程开发。Visual Studio 2022对于C Linux开发可以通过“Linux Development with C”工作负载使用SSH连接到远程Linux机器进行开发、编译和调试。热词中提到的vs2022远程连接连不上linux常见原因就是SSH服务未启动、防火墙阻止、或者VS2022的SSH连接配置如用户名、密钥路径有误。这些IDE的集成本质上都是通过SSH协议建立了一个安全、可靠的通道用于文件同步、命令执行和调试器通信。配置的关键点依然是确保基础的SSH命令行连接是畅通的。7. 维护与监控让SSH连接更稳定可靠配置好不是终点维护好才能长久省心。7.1 查看与管理活跃的SSH连接作为管理员你有时需要知道谁正在连接服务器。查看当前所有SSH连接使用who命令或w命令可以查看当前登录的用户和他们的来源IP。查看更详细的SSH连接信息sudo ss -tnp | grep :22或sudo netstat -tnp | grep :22可以查看所有连接到22端口的TCP连接及其对应的进程PID。踢掉某个用户首先用who找到用户的终端tty比如pts/0然后使用sudo pkill -9 -t pts/0来结束该终端上的所有进程。操作需谨慎。7.2 SSH连接保持与超时处理默认情况下不活动的SSH连接一段时间后可能会被断开。可以通过配置客户端或服务端来保持连接。客户端配置推荐在客户端的~/.ssh/config文件没有则创建中为特定主机添加配置Host myserver HostName server_ip_address User username ServerAliveInterval 60 ServerAliveCountMax 3这样客户端会每60秒发送一个保活包如果连续3次3分钟无响应才认为连接断开。服务端配置修改/etc/ssh/sshd_config中的ClientAliveInterval服务端检查客户端活跃的间隔和ClientAliveCountMax最大检查次数。但通常修改客户端配置更灵活。7.3 日志与审计SSH的日志是排查安全问题的重要依据。主要日志文件在/var/log/auth.logUbuntu/Debian或/var/log/secureRHEL/CentOS。你可以使用grep sshd /var/log/auth.log来过滤查看所有SSH相关的登录、失败尝试等信息。如果发现某个IP地址有大量失败的密码尝试可以考虑使用ufw或fail2ban工具将其IP永久封禁。例如用UFW封禁一个IPsudo ufw deny from 恶意IP地址我个人在管理多台服务器时一定会做这几件事1) 启用密钥登录并禁用密码2) 修改默认SSH端口3) 配置客户端的~/.ssh/config文件用别名如myserver代替难记的IP和用户名4) 在服务端安装fail2ban来自动防御暴力破解。这套组合拳下来SSH服务既安全又便捷。最后无论配置多么复杂一定要记得在重启sshd服务或修改防火墙规则前务必在现有连接里开一个新的SSH会话测试一下确保不会把自己锁在外面。这条经验是多少次冷汗后总结出来的。