SSH 隧道连接失败如何通过 verbose 模式查看详细调试日志?

文章导读
当 SSH 隧道连接失败时,最直接的排查手段是在客户端命令中加入 -v 参数开启详细输出,这能显示握手和认证的具体停滞点。
📋 目录
  1. 命令速用版
  2. 典型 verbose 输出解读
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
A A

当 SSH 隧道连接失败时,最直接的排查手段是在客户端命令中加入 -v 参数开启详细输出,这能显示握手和认证的具体停滞点。

先说结论:客户端加 -v 看本地输出,服务端查日志看接收情况,两者结合定位故障阶段。

  • 先确认:连接卡在哪一步(握手、认证、端口转发)。
  • 先处理:根据报错调整配置或网络。
  • 再验证:去掉 -v 正常连接测试。

命令速用版

在终端直接运行以下命令,将详细日志输出到屏幕:

ssh -v -N -D 1080 user@hostname

如果需要更详细的信息,可以叠加 v:

ssh -vvv -N -D 1080 user@hostname

其中 -N 表示不执行远程命令,-D 表示开启 SOCKS 隧道。

典型 verbose 输出解读

开启 -v 后,客户端会打印连接建立的每个阶段。以下是关键阶段的典型输出示例,可用于对照判断停滞点:

1. 连接建立阶段

debug1: Connecting to hostname [192.168.1.1] port 22.
debug1: Connection established.

如果卡在 "Connecting to...",通常是网络不通、DNS 解析失败或防火墙拦截。

2. 认证阶段

debug1: Authenticating to hostname:22 as 'user'
debug1: Offering public key: /home/user/.ssh/id_rsa RSA SHA256:...
debug1: Server accepted key

如果停在 "Offering public key" 后无响应,可能是服务端未授权该密钥;如果出现 "Permission denied",则是密码错误或密钥不匹配。

3. 隧道建立阶段

debug1: Requesting forwarding of SOCKS port 1080
debug1: channel 0: new [listener]
debug1: channel 0: open failed: administratively prohibited: open failed

如果出现 "open failed" 或 "administratively prohibited",说明服务端禁止了端口转发(AllowTcpForwarding no)。

SSH 隧道连接失败如何通过 verbose 模式查看详细调试日志?

分步处理

1. 客户端开启调试:在原有连接命令中加入 -v 参数。观察输出最后停在哪里。如果停在 "Connecting to...",通常是网络不通或防火墙拦截;如果停在 "Authenticating...",则是密钥或密码问题。

2. 服务端检查日志:如果客户端显示连接已建立但隧道不可用,需登录服务端查看认证日志。CentOS/RHEL 通常在 /var/log/secure,Ubuntu/Debian 通常在 /var/log/auth.log。

3. 检查配置权限:确认服务端的 /etc/ssh/sshd_config 中 AllowTcpForwarding 是否设置为 yes,以及 PermitOpen 是否限制了特定端口。

怎么验证是否生效

调试完成后,去掉 -v 参数重新建立隧道。使用 curl 测试隧道连通性:

curl `--socks5-hostname` 127.0.0.1:1080 http://example.com

如果能返回网页内容,说明隧道工作正常。同时观察服务端日志不再出现报错信息。

常见坑

1. 日志权限:普通用户无法查看 /var/log/secure 等系统日志,需要使用 sudo。

2. 输出过多:-vvv 会产生大量日志,建议先使用 -v,必要时再增加 verbosity。

3. 防火墙静默丢弃:如果客户端一直卡在 Connecting,可能是服务端防火墙直接丢弃了数据包,此时 verbose 模式也看不到具体报错,需结合网络工具排查。