如何调试 ngrok 隧道暴露的远程 JVM

Posted

技术标签:

【中文标题】如何调试 ngrok 隧道暴露的远程 JVM【英文标题】:How to debug remote JVM exposed by ngrok tunnel 【发布时间】:2021-12-27 08:57:51 【问题描述】:

我的一台机器上有一个 java 进程,侦听端口 4502。我使用 ngrok 创建了一个隧道,以便可以访问我的开发机器上的应用程序。我面临的问题是将调试器附加到远程 JVM。

这是我正在使用的调试 java 配置:

-agentlib:jdwp=transport=dt_socket,address=*:5005,server=y,suspend=n

这是通往应用程序的隧道的 ngrok 配置:

ngrok http 4502

这是通往 JVM 的隧道的 ngrok 配置(我也尝试过 http 协议,但没有成功):

ngrok tcp 5005

ngrok 为 tcp 隧道输出以下内容:

Forwarding tcp://2.tcp.eu.ngrok.io:10928 -> 127.0.0.1:5005

使用 IntelliJ,我这样配置远程调试:

Debugger mode: Attach to remote JVM
Host: tcp://2.tcp.eu.ngrok.io
Port: 10928

启动调试器时出现以下错误:

运行“调试作者桌面”时出错:无法打开调试器端口 (tcp://2.tcp.eu.ngrok.io:10928):java.io.IOException “握手失败 - 连接提前关闭”

在运行 java 进程的机器上,我在启动进程之前确保 5005 端口是打开的。在使用 IntelliJ 的机器上,我确保 10928 端口已打开。我必须做什么才能将调试器附加到我的第二台机器上运行的进程?任何帮助将不胜感激。

【问题讨论】:

主机之间可能有某种防火墙。你能ping通吗。如果是,请在主机上尝试“nc -zv 2.tcp.eu.ngrok.io 10928”,您可以运行您的想法。 使用nc -zv 命令我可以ping 通。响应是“连接到 5.tcp.eu.ngrok.io 端口 14160 [tcp/*] 成功!”。使用telnet <host> <ip> ping 时,我得到以下“已连接到 5.tcp.eu.ngrok.io”。其次是“连接被外国主机关闭。” 【参考方案1】:

我找到了解决方案。问题出在远程调试器配置中。指定主机时,不得包含协议。一旦我将tcp://2.tcp.eu.ngrok.io 更改为2.tcp.eu.ngrok.io,它就起作用了!

【讨论】:

以上是关于如何调试 ngrok 隧道暴露的远程 JVM的主要内容,如果未能解决你的问题,请参考以下文章

超越代码暴露 |暴露:在linux中找不到命令错误

如何修复 ngrok 转发端口?

服务暴露

在 MobaXterm 中打开会话时如何自动启动隧道?

将 localhost 暴露给世界总是给出 5** [ngrok, localtunnel, etc]

反向 ssh 隧道不暴露 ec2 上的端口