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 outTCP 握手未完成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 变更原因已确认,而不是直接删除告警
创建于 2026/7/20 更新于 2026/7/20