eclipse:远程调试防火墙后面的tomcat服务器

在启动带有jpda的tomcat之后,在我的公司,我可以在eclipse中远程调试一堆Web应用程序。出于多种原因,我现在需要从公司防火墙外部开发和远程调试这些相同的Web应用程序,并且我只能通过端口22上的ssh访问该服务器。

我用隧道将最需要的端口(svn,nexus,tomcat本身,从服务器或通过服务器)传输到localhost,这些服务工作正常,但我无法以任何方式启动eclipse调试器;我从第二次试穿时得到“连接超时,等待数据包XXX”或“连接被拒绝”。使用服务器上的 nmap 进行检查,它会报告端口在第一次连接尝试之前打开,并在此之后关闭。我在catalina.out中没有得到任何有趣的输出日志

我用来启动隧道的命令是:

ssh -L 8000:localhost:8000 user@mycompany.com

iptables 在服务器和本地计算机上都暂时停止以进行测试。

我错过了什么吗?我是否需要将其他端口转发到本地主机?还是以某种方式涉及名称解析?

编辑

在连接之前打开端口 尝试从 eclipse:

root@lnxulisse:/opt/apache-tomcat-6.0.32/bin# lsof -p 2147  -n |grep TCP
java    2147 root    4u  IPv4 640850      0t0     TCP *:8000 (LISTEN)
java    2147 root   38u  IPv6 640859      0t0     TCP *:http-alt (LISTEN)
java    2147 root   40u  IPv6 640865      0t0     TCP *:https (LISTEN)
java    2147 root   46u  IPv6 640908      0t0     TCP 127.0.0.1:18005 (LISTEN)
java    2147 root   48r  IPv6 642625      0t0     TCP 172.24.0.82:48347->172.24.0.82:mysql (ESTABLISHED)
java    2147 root  181u  IPv6 640891      0t0     TCP 172.24.0.82:60353->172.24.0.82:mysql (ESTABLISHED)

和之后:

java    2147 root    4u  IPv6 642769      0t0     TCP 172.24.0.82:48956->172.24.0.82:mysql (ESTABLISHED)
java    2147 root    5u  IPv4 640851      0t0     TCP 127.0.0.1:8000->127.0.0.1:34193 (ESTABLISHED)
java    2147 root   38u  IPv6 640859      0t0     TCP *:http-alt (LISTEN)
java    2147 root   40u  IPv6 640865      0t0     TCP *:https (LISTEN)
java    2147 root   46u  IPv6 640908      0t0     TCP 127.0.0.1:18005 (LISTEN)
java    2147 root  181u  IPv6 640891      0t0     TCP 172.24.0.82:60353->172.24.0.82:mysql (ESTABLISHED)

返回的确切日食错误是:

Exception occurred during launch
Failed to connect to remote JVM. Connection timed out.
Timeout occurred while waiting for packet 204.

(数据包数量因每次尝试而异)。

在我得到:workspace/.metadata/.log

!ENTRY org.eclipse.osgi 2 0 2011-07-17 18:43:53.024
!MESSAGE While loading class "org.eclipse.core.net.proxy.IProxyService", thread "Thread[main,6,main]" timed out waiting (5000ms) for thread "Thread[Thread-6,5,main]" to finish starting bundle "org.eclipse.core.net_1.2.1.r35x_20090812-1200 [232]". To avoid deadlock, thread "Thread[main,6,main]" is proceeding but "org.eclipse.core.net.proxy.IProxyService" may not be fully initialized.
!STACK 0
org.osgi.framework.BundleException: State change in progress for bundle "reference:file:plugins/org.eclipse.core.net_1.2.1.r35x_20090812-1200.jar" by thread "Thread-6".
        at org.eclipse.osgi.framework.internal.core.AbstractBundle.beginStateChange(AbstractBundle.java:1073)
        at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(AbstractBundle.java:278)
[...]

!ENTRY org.eclipse.ui.ide 4 4 2011-07-17 18:43:53.028
!MESSAGE Proxy service could not be found.

eclipse 配置为直接互联网连接。

编辑 2

我认为解决方案可能在这里:

http://blog.cantremember.com/debugging-with-jconsole-jmx-ssh-tunnels/

但是我很难理解他的JNDI / RMI设置,以及这在多大程度上适用于我的配置。

编辑 3

对于那些回答“使用而不是<lan|local ip address><localhost>"

  • 计算机A:我在公司的工作站
  • 计算机 B:我在家的工作站
  • 计算机 C:运行 tomcat 的服务器

B和C位于同一网络基础设施中的两个不同的子网络中;只允许从外部连接到C的端口22(并且有点“代理”,我不知道网络内部)。

A 是“外部”(我与动态 IP 地址的 dsl 连接)。

Debugging on C from B via ssh tunnel -> works
Debugging on C from A via ssh tunnel -> connection timed out while waiting for packet XXX

答案 1

本文建议远程 Java 虚拟机 (JVM) 在调试方式下侦听的默认端口为 1044。您还应该通过隧道传输运行远程 JVM 的端口。


更一般地说,您可以运行 wireshark/tcpdump,以查看在启动调试器时尝试了哪些端口连接。


编辑

我会尝试的更多事情:

  • 检查远程主机(例如,如果它是Linux)使用哪些参数(查找后面的内容或它侦听的TCP端口(查找输出中的行)ps auxwww-Xrunjdwplsof -p PID_OF_JVM_TO_BE_DEBUGGEDTCPLISTENlsof
  • 确保远程主机上的 JVM 侦听接口,而不是网络接口(这是您在 ssh 选项中指定的)。lolocalhost-L
  • 在启动的机器上手动启动调试器是否会使工作 eclipse?(您也可以在远程主机上尝试此操作,以确保调试器在端口 8000 上运行)jdb -attach localhost:8000
  • 确保 eclipse 尝试连接到(当在第一个 8000 之前未指定绑定地址时,接口上带有 ssh 侦听选项)localhost-Llo

答案 2

在进行远程调试时,我经常遇到这个问题。我不知道这个问题的确切原因,但我使用了下面的解决方案,也许它也适合你:

而不是

ssh -L 8000:localhost:8000 user@remotehost

使用

ssh -L 8000:remotehost:8000 user@remotehost

用于创建 SSH 隧道(请注意第二个示例中的端口号之间的远程主机而不是本地主机)。您还可以使用远程主机的正常 IP 地址(不是环回地址 127.0.0.1,而是真正的本地网络 IP 地址),而不是远程主机的名称。

希望它有帮助,祝你好运!


推荐