不少朋友第一次在甲骨文云Oracle Cloud上开好 VM 实例后最容易卡住的就是 SSH 登录这一步密钥找不到、权限报错、连接超时、密码不知道去哪里设置各种问题轮着来。这篇文章专门针对“新开的 VPS 配置 SSH 加密码登录”这个场景把从密钥登录到开启密码登录的完整链路讲清楚全程基于我个人在 Linux 服务器上实际敲过的命令和踩过的坑你照着做基本就能顺利连上甲骨文云的实例其他厂商的新开 VPS 也同样适用。1. 理解 SSH 登录方式为什么要折腾“密码登录”1.1 从“钥匙和锁”理解 SSH 密钥登录SSH 默认有两种登录方式密钥登录和密码登录。甲骨文云、AWS、Azure 等主流云厂商创建实例时默认只允许密钥登录这是出于安全考虑防止实例一开机就被互联网上的暴力破解工具扫到。密钥登录的原理可以简单理解成一把“锁”和一把“钥匙”。你下载的私钥文件一般是.pem或.key后缀就是钥匙保存在云端实例里的公钥就是锁。登录时服务器会验证你手里的钥匙能不能打开这把锁能打开就放行全程不传输密码安全性远高于密码登录。很多新手不理解既然密钥登录更安全为什么还要折腾密码登录这里有几个非常现实的理由你不可能在任何设备上都随身携带私钥文件换台电脑、用手机临时管理服务器时密码登录更方便。密钥文件一旦丢失或误删实例就再也登录不进去了只能重新创建实例或通过控制台恢复非常麻烦。很多自动化脚本、面板程序需要密码认证比如部分宝塔面板版本、rsync 同步、某些监控工具。家里人或同事需要帮忙维护服务器时给密码比传密钥文件更直接。所以我个人的习惯是实例刚创建好第一件事就是开启密码登录同时保留密钥登录两者并存既方便又安全。1.2 甲骨文云实例和其他 VPS 在 SSH 配置上的差异甲骨文云跟大多数 VPS 厂商有个显著区别创建实例时只支持上传或下载 SSH 公钥不给你设置 root 密码的入口。而且默认 SSH 配置里PasswordAuthentication是no也就是完全禁止密码登录。如果你用的是搬瓦工、Vultr、Linode 这类厂商创建实例时可以顺手设置 root 密码开箱就能用密码登录。甲骨文云则必须手动去改 SSH 配置文件这也是很多新手在甲骨文云上栽跟头的地方。另外甲骨文云的实例默认用户名为opcOracle Linux、CentOS、Ubuntu 等系统镜像均为opc不是常见的root。这一点也容易踩坑很多人拿到 IP 后直接ssh rootip结果提示 Permission denied然后就开始怀疑密钥有问题其实只是用户名不对。2. 创建甲骨文云实例时SSH 密钥的保存与整理2.1 创建实例时密钥生成的两种方式在甲骨文云控制台创建实例到“添加 SSH 密钥”这一步时有两种选择第一种是“生成密钥对”系统会自动生成一对密钥私钥会下载到你的本地浏览器默认下载目录中文件名类似ssh-key-2024-xx-xx.key。公钥会显示在控制台上同时也会被自动注入到实例的opc用户中。第二种是“粘贴公钥”也就是把你本地已经生成好的公钥内容粘贴进去。如果你本地还没有密钥对可以用ssh-keygen命令生成ssh-keygen -t rsa -b 4096 -C your_emailexample.com执行后会让你选择保存路径和设置密码短语一路回车就能生成默认的id_rsa私钥和id_rsa.pub公钥。然后把id_rsa.pub的内容完整复制、粘贴到甲骨文云控制台的输入框里。我的建议是如果你不常折腾密钥直接用甲骨文云控制台“生成密钥对”最省事如果你以后会管理多台服务器建议自己用ssh-keygen统一生成一套密钥然后把公钥添加到不同厂商的实例中方便统一管理。2.2 私钥文件下载后的权限检查这一步至少值 10 分钟排查时间私钥文件下载到本地后有一个非常容易踩的坑文件权限太开放SSH 客户端会直接拒绝使用并提示Permissions 0644 for xxx.key are too open。这其实是 SSH 客户端的安全机制私钥文件如果可以被其他用户读取它就会认为私钥已经泄露拒绝使用。解决办法是给私钥文件设置600权限也就是只有当前用户可读可写。Linux 和 macOS 下执行chmod 600 ~/Downloads/ssh-key-2024-xx-xx.keyWindows 下如果你用 PuTTY需要用 PuTTYgen 把私钥转换成.ppk格式如果你用 WSL 或 Git Bash同样执行chmod 600命令。这里分享一个小经验私钥文件下载后我习惯把它统一移动到~/.ssh/目录下存放并顺便改个容易识别的名字比如oracle_arm.key方便后续多台服务器管理。mkdir -p ~/.ssh mv ~/Downloads/ssh-key-2024-xx-xx.key ~/.ssh/oracle_arm.key chmod 600 ~/.ssh/oracle_arm.key3. 首次 SSH 登录甲骨文云实例的三种实操方式3.1 电脑端最省事直接用终端命令登录如果你用的是 Linux 或 macOS终端本身就是最好的 SSH 客户端不需要额外安装任何软件。登录命令格式如下ssh -i ~/.ssh/oracle_arm.key opc你的实例公网IP例如ssh -i ~/.ssh/oracle_arm.key opc123.123.123.123首次连接会出现Are you sure you want to continue connecting (yes/no)?的提示这是 SSH 在询问你是否信任这台主机的指纹信息输入yes回车即可。如果你用的是 Windows 10/11系统自带的 PowerShell 或 CMD 也支持 OpenSSH 客户端同样可以直接执行上面的命令。如果提示ssh不是内部或外部命令先检查系统的“可选功能”里有没有安装 OpenSSH 客户端。登录成功后你会看到类似[opcinstance-xxxx ~]$的命令行提示符说明你已经成功进入了服务器。3.2 Windows 下用 PuTTY 登录的完整流程PuTTY 是 Windows 下老牌的 SSH 客户端虽然界面朴素但胜在兼容性好、功能稳定。使用 PuTTY 时私钥需要进行一次格式转换因为 PuTTY 不认识 OpenSSH 格式的私钥。步骤如下下载并安装 PuTTY 和 PuTTYgen官网提供安装包两个工具会一起装上。打开 PuTTYgen点击Load选择你下载的.key或.pem私钥文件。如果弹出成功导入的提示直接点击Save private key保存为一个.ppk文件。打开 PuTTY在Host Name栏输入opc你的实例公网IPPort 保持 22。在左侧菜单栏找到Connection - SSH - Auth - Credentials点击Browse选择刚才保存的.ppk文件。回到Session页面点击Open连接。如果一切顺利PuTTY 会弹出安全提示询问是否信任主机密钥点击“接受”即可进入系统。3.3 用 VS Code Remote-SSH 登录边管理边写代码如果你不只是想管理服务器还想在服务器上直接编辑代码、跑脚本强烈建议用 VS Code 的 Remote-SSH 插件。安装插件后按CtrlShiftP打开命令面板输入Remote-SSH: Connect to Host然后选择 Add New SSH Host输入ssh -i ~/.ssh/oracle_arm.key opc你的实例公网IP之后 VS Code 会自动加载远程环境你可以在左侧文件树中直接浏览和编辑服务器上的文件终端也会自动连接到远程服务器整个体验跟操作本地文件一样顺畅。这里有个小技巧VS Code 会读取~/.ssh/config配置可以在本地创建这个文件把常用的服务器信息配置进去以后连接只需要输入别名。# 文件路径~/.ssh/config Host oracle HostName 123.123.123.123 User opc IdentityFile ~/.ssh/oracle_arm.key配置完成后VS Code 的 Remote-SSH 插件会直接显示oracle这个名字点一下就能连接省去每次输 IP、用户名的麻烦。3.4 手机端应急登录有时候人在外面服务器出问题了手边只有手机。iOS 上可以用 Termius 或 PromptAndroid 上可以用 Termius 或 JuiceSSH。这些 App 都支持导入私钥文件操作方式类似新建一个主机填上 IP、用户名然后在密钥设置里选择导入私钥文件即可。手机端登录最大的问题是私钥文件如何传到手机里。我一般用网盘或微信文件传输助手把私钥文件发到手机上然后保存到本地文件再在 App 里导入。注意用完后及时从聊天记录里删除私钥文件避免泄露。4. 开启密码登录修改 sshd_config 的完整实操4.1 先给 root 或当前用户设置密码在修改 SSH 配置之前需要先确保系统里有一个用户设置了密码。如果你想用 root 登录就给 root 设置密码如果你想用当前登录的opc用户密码登录就给opc设置密码。切换成 root 用户sudo -i设置 root 密码passwd root系统会提示New password:和Retype new password:输入两次即可。注意输入密码时终端不会显示任何字符这是正常的别以为自己键盘坏了。如果你希望保留opc用户的密码登录可以执行sudo passwd opc这里有个人经验想分享很多教程只教设置 root 密码不建议在云服务器上直接启用 root 密码登录因为 root 是暴力破解的首选目标。更稳妥的做法是开启opc用户的密码登录日常操作中用sudo提权需要 root 时才用sudo -i切换。4.2 修改 sshd_config 的关键参数进入 SSH 配置文件编辑界面vim /etc/ssh/sshd_config如果你不熟悉 vim用 nano 更友好nano /etc/ssh/sshd_config找到以下几行按实际情况修改PasswordAuthentication yes PermitRootLogin yes PubkeyAuthentication yesPasswordAuthentication控制是否允许密码登录默认是no改成yes才能用密码登录。PermitRootLogin控制是否允许 root 用户直接 SSH 登录默认可能是prohibit-password表示只允许密钥登录、禁止密码登录。改成yes表示允许 root 用密码登录。PubkeyAuthentication控制是否允许密钥登录务必保持yes这样密钥登录和密码登录都能用。不是所有系统镜像里这三行都存在有可能被注释掉了也就是行首有#。这种情况下直接取消注释并修改即可如果文件里完全没有这几行也可以在文件末尾手动添加。修改完保存退出。如果用的是 nano按CtrlO保存、CtrlX退出如果用的是 vim按Esc输入:wq保存退出。4.3 重启 SSH 服务并验证登录方式在修改配置之前一定先测试配置文件的语法是否正确避免自己把自己锁在服务器外面。依次执行sshd -t如果配置有问题这条命令会返回具体的错误提示如果没有输出说明配置语法没问题。然后重启 SSH 服务systemctl restart sshd注意有些操作系统如 CentOS、Oracle Linux 7SSH 服务名称是sshd而 Ubuntu 是ssh。如果systemctl restart sshd报错就试systemctl restart ssh。重启完成后千万不要关掉当前已经连接的 SSH 窗口。重新开一个新的本地终端窗口尝试用密码登录ssh opc你的实例公网IP此时系统应该会提示opc你的实例公网IPs password:输入你设置的密码即可登录。我自己吃过一次亏改完配置直接重启了 SSH 服务结果发现PermitRootLogin写错了值导致 root 无法登录而当前连接已经断开了只能去甲骨文云控制台用“Cloud Shell”或“实例控制台连接”救回来。所以一定要养成“改完配置先开新窗口测试确认无误再关旧窗口”的习惯。4.4 防火墙和安全组别忘了甲骨文云还有两层关卡不少用户改了sshd_config后依然连不上排查到最后发现是甲骨文云的安全列表Security List没放行。甲骨文云在实例之外还有一层虚拟云网络VCN防火墙需要同时满足两个条件才能访问实例系统内部的防火墙iptables/firewalld/ufw放行 22 端口。甲骨文云 VCN 的安全列表入站规则放行 22 端口。甲骨文云默认创建实例时已经放行了 22 端口的入站规则所以通常不用额外配置。但如果你之前动过 VCN 的安全列表或者新建了子网却忘了加规则就会出现“系统内部端口开放但外部始终连不上”的情况。检查方法在甲骨文云控制台进入“网络 - 虚拟云网络 - 你的 VCN - 安全列表”确认有一条入站规则是源 CIDR协议目标端口说明0.0.0.0/0TCP22允许所有 IP 访问 SSH如果其他厂商的 VPS同样检查控制台的防火墙或安全组是否放行了 22 端口。这一步被忽略的概率极高排查连接问题时一定要优先确认。5. 常见连接失败问题排查与自救技巧5.1 一张表对照最常见的 SSH 连接错误我把这几年帮朋友排查 SSH 登录问题时遇到的典型情况整理成了一个速查表方便你按图索骥报错信息可能原因解决方案Permission denied (publickey)用户名不对、私钥不匹配、私钥权限过宽确认用户名是opc而非root确认私钥与实例公钥匹配执行chmod 600修改私钥权限Connection timed out安全列表未放行、本地网络无法访问服务器 IP检查甲骨文云安全列表入站规则尝试用手机热点连接排除本地网络问题Connection refusedSSH 服务未启动或端口错误确认 22 端口未被修改重启 sshd 服务检查系统防火墙放行状态Too many authentication failuresSSH 客户端自动尝试了多个密钥服务器拒绝添加-o IdentitiesOnlyyes参数指定只用特定私钥No supported authentication methods available服务器只接受密钥登录不接受密码登录检查PasswordAuthentication是否为yesWARNING: UNPROTECTED PRIVATE KEY FILE私钥文件权限太开放执行chmod 600 ~/.ssh/xxx.key5.2 我把服务器改挂了还有救吗这个问题我太有发言权了。有一年我给一台服务器优化 SSH 配置不知道哪根筋搭错了把Port改成了 2222但忘了放行 2222 端口结果重启 SSH 服务后自己都连不进去了。在甲骨文云上遇到这种“自己把自己锁在外面”的情况有三种自救方式第一种使用控制台自带的 Cloud Shell。甲骨文云控制台右上角有个终端图标点击后会打开一个云端的 Shell 环境它可以直接访问你的 VCN 内部网络不需要经过安全列表。在里面用内网 IP 连接你的实例ssh opc实例内网IP第二种使用实例控制台连接Console Connection。在实例详情页找到“控制台连接”创建一个 SSH 连接然后通过 VNC 方式进入服务器的终端界面这是最接近物理接键盘屏幕的方式可以在系统完全黑屏时操作。第三种如果实例挂了实在进不去可以通过控制台“重建实例”或“创建自定义镜像”后启动新实例。但这个过程比较耗时而且可能需要停机属于最后的办法。所以修改 SSH 配置前一定要做这三件事备份原配置文件cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak改完先测试语法sshd -t开一个全新窗口测试登录确认没问题再关旧窗口这三步任何时候都不能省。5.3 甲骨文云 ARM 实例抢不到时的预配置技巧甲骨文云最吸引人的一点是可以免费开通 ARM 架构的 VM也就是 Ampere A1 实例但免费资源经常处于缺货状态。很多人用脚本来抢购实例好不容易抢到了网卡、IP 都分配了但创建时忘记保存私钥结果实例创建成功却没钥匙进去。这里分享一个思路如果你经常在甲骨文云上“抢”实例可以事先在本地生成一套密钥对然后保存公钥内容每次创建实例时直接粘贴公钥。这样所有实例都能用同一把私钥登录省去每次下载、保存、转换密钥的环节。如果你手里的实例已经有密钥登录权限也可以给opc用户添加多个公钥cd ~/.ssh echo ssh-rsa AAAA... 你的公钥内容 authorized_keys chmod 600 authorized_keys以后你就能用多台电脑、多个私钥登录同一个实例即使丢了一把钥匙还有另一把兜底。6. 密码登录开启后的安全加固不能停6.1 修改 SSH 默认端口减少被扫描的概率成功开启密码登录后你的服务器暴露在互联网上的攻击面也随之扩大了。虽然密码登录很方便但每天被各种扫描工具扫是家常便饭。我之前看过一台新开的 VPS开了密码登录后不到 24 小时/var/log/secure里就出现了几百次失败的登录尝试。缓解手段之一是把 SSH 默认的 22 端口改成高位端口比如 2222 或 50222。修改方式还是在sshd_config中Port 50222改完同样要重启 SSH 服务同时要在系统防火墙和云平台安全组中放行新端口并确保旧端口不再放行否则就失去意义了。注意修改端口前一定要确认新端口在安全列表中是放行状态不然又是一个“自己锁自己”的坑。6.2 用 Fail2ban 给密码登录加一道保险如果不想放弃 22 端口也不想天天看暴力破解日志强烈建议装一个 Fail2ban。它会在一定时间内连续多次登录失败的 IP 列为可疑 IP自动将其封禁一段时间。安装方式# Debian/Ubuntu apt update apt install fail2ban -y # CentOS/RHEL/Oracle Linux yum install fail2ban -y配置方式创建/etc/fail2ban/jail.local文件[sshd] enabled true port 22 filter sshd logpath /var/log/secure maxretry 5 bantime 3600maxretry5 次失败即触发。bantime封禁 3600 秒也就是 1 小时。启动并设置开机自启systemctl restart fail2ban systemctl enable fail2ban有 Fail2ban 挡着即使密码登录暴露在公网上也能把绝大多数暴力破解拦在门外。我自己所有开启密码登录的服务器都装了 Fail2ban效果非常明显日志里的垃圾尝试会断崖式减少。写在最后SSH 密码登录这件事说白了就是改一个配置、设一个密码、重启一个服务的事情但中间牵扯到的密钥权限、安全列表、防火墙规则每一环都可能把新手卡住。很多人折腾到半夜都连不上服务器问题往往出在一个特别小的细节上比如私钥权限多了一个g的读权限或者用户名写成了root而非opc。我做运维这些年最深的体会是处理服务器连接问题不要一上来就各种瞎试先用排除法理清楚链路。你从本地到服务器要经过哪几道关卡本地 SSH 客户端 - 网络 - 云平台安全组 - 系统防火墙 - SSH 服务 - 用户认证。一层层往下排查绝大多数问题都能定位到具体在哪一环出了问题。这篇文章里给的排查表就是让你少走弯路的。另外再说一个容易忽略的点很多人开了密码登录后就觉得密钥登录没用了把PubkeyAuthentication改成了no。我强烈建议不要这样做除非你有必须只允许密码登录的理由。保留密钥登录等于给你的服务器留了一条更安全的备用通道特别是当你忘记密码、或者密码被暴力破解工具撞库的时候密钥登录能保证你还有办法进服务器。两个登录方式并存才是成熟的运维思路。
阅读完成 · 觉得有帮助?