使用Java JSCH通过跳板机连接目标服务器时出现Connection reset错误
排查与解决步骤
- 优先修正端口转发的参数错误
当前控制台输出的转发规则为localhost:64038 -> jumpServerSession64038,完全不符合预期的本地端口 -> 目标服务器IP:22格式,说明调用jumpServerSession.setPortForwardingL(0, 目标IP, 22)时,传入的第二个参数不是server-2的真实网络地址,错误传入了跳板机会话对象的相关引用值,导致跳板机收到隧道转发请求时,无法解析目标地址,直接重置连接。
校验方式:打印实际传入端口转发方法的目标IP值,确认是跳板机网络范围内可访问的server-2真实IP/域名,排除占位符未替换、变量取错的问题。 - 验证跳板机到目标服务器的连通性
本地端口转发的实际流量路径是:本地随机转发端口 → 已建立的跳板机会话 → 从跳板机网络位置发起对server-2 22端口的连接。如果跳板机本身受防火墙、安全组策略限制,无法访问server-2的22端口,会直接重置从本地发来的隧道连接,触发Session.connect: java.net.SocketException: Connection reset报错。
校验方式:直接登录server-1跳板机,执行nc -zv 目标server2 IP 22命令,确认跳板机可以正常连通server-2的SSH服务端口,不存在网络拦截。 - 修正代码中的资源泄漏问题
代码中连续两次对同一个channel变量赋值:先打开sftp通道,紧接着又覆盖变量打开exec通道,前一个已打开的sftp通道没有被主动关闭,长期运行会占满跳板机的会话通道配额,导致后续新连接被服务端拒绝重置。
修正方式:删除无用的sftp通道打开逻辑,仅保留业务需要的exec通道,所有session、channel对象在使用完成后主动调用disconnect()方法释放资源。 - 校验JSCH依赖的版本兼容性
若使用的是2018年之前发布的老旧com.jcraft.jsch版本(如0.1.49及更早版本),面对开启了新版SSH密钥交换算法的目标服务器,会在SSH握手阶段被服务端主动断开连接,触发连接重置。可升级到最新的兼容版本JSCH依赖解决协议不匹配问题。
内容的提问来源于stack exchange,提问作者Narendra
相关产品推荐
相关产品推荐

