OCI SSH 与端口连通性排查
按地址、路由、OCI 安全规则、主机防火墙、进程监听和 SSH 认证逐层定位 OCI 连接失败。
#type / debug
#status / growing
#tech / network
#resource / oracle-cloud
#resource / ssh
#protocol / ssh
#platform / server
[!abstract] 先看错误类型
timeout多半发生在网络或防火墙层;connection refused表示主机可达但目标端口没有接受连接;Permission denied (publickey)已经到达 SSH 服务,问题在用户或认证。
OCI SSH 与端口连通性排查
现象分类
| 客户端现象 | 已知事实 | 优先检查 |
|---|---|---|
Connection timed out | TCP 握手未完成 | IP、路由、NSG、安全列表、UFW |
No route to host | 本机/中间网络无法路由 | 地址、IPv6、本地路由、运营商 |
Connection refused | 主机返回拒绝 | sshd 未监听、端口错误、服务失败 |
Permission denied (publickey) | 已到达 sshd | 用户、私钥、authorized_keys、权限 |
| Host key changed | 当前主机密钥与缓存不同 | 重装/IP 复用/中间人风险 |
| 登录后立即断开 | 认证后会话初始化失败 | shell、磁盘、用户配置、PAM |
快速决策树
flowchart TD
A[SSH 失败] --> B{TCP 能建立?}
B -->|否/timeout| C[地址和 OCI 网络层]
B -->|refused| D[监听端口和 sshd 状态]
B -->|能| E{认证通过?}
E -->|否| F[用户/密钥/权限]
E -->|是后断开| G[磁盘/shell/PAM/用户环境]
排查过程
1. 从客户端保存详细日志
ssh -vvv -i ~/.ssh/oci_a1 -o IdentitiesOnly=yes -p 22 ubuntu@SERVER_IP
只分享脱敏日志,不分享私钥、完整用户名、域名和公网 IP。
2. 核对实例和地址
在 OCI 控制台确认:
- 实例 Running;
- 公网 IP 没有因重建/释放而变化;
- 使用正确 VNIC;
- IPv4/IPv6 与客户端网络匹配;
- 没连到旧的 reserved IP 或错误区域。
3. 核对公网路径
- 公有子网;
- Internet Gateway 存在;
- IPv4 路由
0.0.x.x/0; - IPv6 路由
::/0; - 实例/VNIC 已关联目标 NSG;
- Security List/NSG 允许客户端来源和目标端口。
不要为了排障长期添加“所有协议、所有端口、所有来源”。可临时增加一条精确规则,验证后移除。
4. 从控制台或旧会话检查主机
sudo systemctl status ssh --no-pager || sudo systemctl status sshd --no-pager
sudo sshd -t
sudo sshd -T | grep -E '^(port|listenaddress|permitrootlogin|passwordauthentication|pubkeyauthentication|allowusers)'
sudo ss -lntp
sudo ufw status numbered
sudo nft list ruleset
sshd -T 显示有效配置,比只 grep sshd_config 更可靠,因为配置可能来自 drop-in。
5. 检查密钥认证
确认镜像默认用户:Ubuntu ubuntu,Oracle Linux opc。在服务器:
getent passwd TARGET_USER
sudo namei -l /home/TARGET_USER/.ssh/authorized_keys
sudo stat -c '%U:%G %a %n' /home/TARGET_USER /home/TARGET_USER/.ssh /home/TARGET_USER/.ssh/authorized_keys
sudo ssh-keygen -lf /home/TARGET_USER/.ssh/authorized_keys
推荐权限:home 不可被其他用户写,.ssh 为 700,authorized_keys 为 600,所有者正确。
客户端确认实际提供的密钥:
ssh-keygen -lf ~/.ssh/oci_a1.pub
ssh-add -L
6. 检查磁盘和会话环境
df -hT
df -ih
getent passwd TARGET_USER
sudo journalctl -u ssh --since '30 minutes ago' --no-pager
sudo journalctl -u sshd --since '30 minutes ago' --no-pager
根分区满、inode 用完、用户 shell 无效或 home 权限错误都可能导致认证后断开。
修复策略
改错端口
在旧会话/控制台中先恢复旧端口或同时监听新旧端口,sshd -t 后 reload,再测试新会话。
UFW 漏放行
sudo ufw allow from ADMIN_CIDR to any port SSH_PORT proto tcp
sudo ufw status verbose
云侧规则也要同步。
丢失 authorized_keys
从可信本地公钥恢复,不要生成新私钥后把私钥留在救援机:
sudo install -d -m 700 -o TARGET_USER -g TARGET_USER /home/TARGET_USER/.ssh
printf '%s\n' 'ssh-ed25519 AAAA... comment' | sudo tee /home/TARGET_USER/.ssh/authorized_keys >/dev/null
sudo chown TARGET_USER:TARGET_USER /home/TARGET_USER/.ssh/authorized_keys
sudo chmod 600 /home/TARGET_USER/.ssh/authorized_keys
无任何主机入口
进入 使用控制台连接恢复 OCI 实例;系统不能启动时进入引导卷救援。
回归验证
-
sshd -t通过 - 目标端口在
ss -lntp中监听 - OCI 与 UFW 规则来源/端口一致
- 新会话密钥登录成功
- sudo 成功
- 重启后仍可登录
- 临时全开放规则已移除
- Host key 变更原因已确认,而不是直接删除告警
Related notes
- 所属 MOC:甲骨文云服务器 MOC
- 网络模型:OCI VCN、子网、VNIC 与安全层
- SSH 使用:通过 SSH 连接 OCI Linux 实例
- 恢复:OCI 服务器生命周期与恢复阶梯