eclipse: depuración remota de un servidor tomcat detrás de un firewall


Después de iniciar tomcat con jpda encendido, mientras que en mi empresa puedo depurar de forma remota un montón de aplicaciones web en eclipse. Por varias razones, ahora necesito desarrollar y depurar remotamente esas mismas aplicaciones web desde fuera del firewall de la compañía, y solo puedo acceder a ese servidor a través de ssh en el puerto 22.

He tunelizado la mayoría de los puertos necesarios (svn, nexus, tomcat mismo, desde el servidor o a través del servidor) a localhost y esos servicios funcionan bien, pero no puedo iniciar el depurador eclipse en de cualquier manera; estoy recibiendo " tiempo de conexión agotado mientras espero el paquete XXX "o" conexión rechazada " desde la segunda vez que me pruebo. Comprobando con nmap en el servidor, informa el puerto abierto antes del primer intento de conexión, y se cierra después de eso. No tengo ningún registro de salida interesante en Catalina.fuera

El comando que uso para iniciar el túnel es:

ssh -L 8000:localhost:8000 [email protected]

Iptables se detuvo temporalmente tanto en el servidor como en la máquina local para realizar pruebas.

Estoy perdido algo? ¿Necesito reenviar algún otro puerto a localhost? ¿O es de alguna manera implicada la resolución de nombres?

EDITAR

Puertos abiertos antes del intento de conexión desde 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)

Y después:

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)

El error exacto de eclipse devuelto es:

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

(el número de paquete varía en cada intento).

En workspace/.metadata/.log obtengo:

!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 está configurado para conexión directa a Internet.

EDITAR 2

Creo la solución podría estar aquí:

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

Pero tengo algunos problemas para entender su configuración JNDI/RMI, y hasta qué punto se aplica a mi configuración.

EDITAR 3

Esta es una aclaración para aquellos que responden "use <lan|local ip address> en lugar de <localhost>"

  • computadora A: mi estación de trabajo en la empresa
  • computadora B: mi estación de trabajo en casa
  • ordenador C: servidor que ejecuta tomcat

B y C están en dos subredes diferentes en la misma infraestructura de red; solo se permiten conexiones al puerto 22 de C desde el exterior (y un poco "proxy", no conozco los internos de la red).

A es "outside" (mi conexión dsl con dirección ip dinámica).

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
Author: Vini.g.fer, 2011-07-16

5 answers

Este artículo sugiere que el puerto predeterminado en el que la máquina virtual Java remota (JVM) está escuchando en modo de depuración es 1044. También debe hacer un túnel en el puerto en el que se está ejecutando la JVM remota.


Más generalmente, podría ejecutar wireshark/tcpdump para ver a qué puerto se realizan los intentos de conexión al iniciar el depurador.


EDIT :

Algunas cosas más que intentaría: {[16]]}

  • compruebe el host remoto (por ejemplo, con ps auxwww si es Linux) con qué argumentos (busque lo que viene detrás de -Xrunjdwp o con lsof -p PID_OF_JVM_TO_BE_DEBUGGED en qué puerto TCP escucha (busque las líneas con TCP y LISTEN en la salida lsof)
  • asegúrese de que la JVM en el host remoto escucha en la interfaz lo, no en la interfaz de red (eso es lo que especifica con la localhost en la opción -L a ssh).
  • ¿Funciona iniciar el depurador a mano en la máquina donde inicia eclipse con jdb -attach localhost:8000? (también puedes probar esto en el host remoto para asegurarse de que el depurador se está ejecutando en el puerto 8000)
  • asegúrese de que eclipse intente conectarse a localhost (cuando no especifique una dirección de enlace antes del primer 8000 con la opción -L ssh escucha en la interfaz lo)
 10
Author: Andre Holzner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-17 07:58:13

A menudo tenía este problema al hacer la depuración remota. No sé la razón exacta de este problema, pero he utilizado la siguiente solución y tal vez funciona para usted, también:

En lugar de

ssh -L 8000:localhost:8000 user@remotehost

Se utiliza

ssh -L 8000:remotehost:8000 user@remotehost

Para crear el túnel SSH (tenga en cuenta el remotehost en lugar de localhost entre los números de puerto en el segundo ejemplo). En lugar del nombre del host remoto, también puede usar la dirección IP normal del host remoto (no la dirección de bucle invertido 127.0.0.1, sino dirección IP de red local verdadera).

Espero que ayude y buena suerte!

 7
Author: Daniel S.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-02 15:59:22

Asumiendo que la instancia remota de Tomcat se ha iniciado con algo como -Xrunjdwp:transport=dt_socket,server=y,address=8000,suspend=n, pruebe este comando:

ssh -L 8000:0.0.0.0:8000 [email protected] -N

En mi Mac, probé ssh -L 10701:localhost:10700 user@localhost -N localmente, donde se inició una instancia de Tomcat con -Xrunjdwp:transport=dt_socket,server=y,address=10700,suspend=n, y al intentar conectarse al puerto 10701 dentro de Eclipse, seguí viendo "No se pudo conectar a la VM remota com.sol.jdi.conectar.spi.ClosedConnectionException". Cambiando el comando tunnel a ssh -L 10701:0.0.0.0:10700 user@localhost -N, Eclipse fue capaz de adjuntar.

 6
Author: Daniel Trebbien,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-18 23:57:47

¿Puede indicar los parámetros exactos del parámetro-Xrunjdwp?

También ha probado diferentes métodos de depuración (server=y/n, suspend=y/n)?

Tal vez invertir la conexión (dejar que el tomcat se conecte al depurador en lugar de dejar que el depurador se conecte a tomcat) puede ayudar.

 3
Author: Uwe Plonus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-15 07:39:46

Bueno, me estoy respondiendo después de mucho tiempo; en mi caso específico, la solución fue poner eclipse JVM en modo de escucha:

Connection Type: "Standard (Socket Listen)"

E invertir la dirección del túnel:

ssh -L 8001:localhost:8001 user@work   (run on server (S), "localhost" is W)
ssh -R 8001:localhost:8001 user@work   (run at home (H), "localhost" is W)

Alguna explicación: como en la pregunta, mi situación era:

  H  -------------------> S     not working  ( ssh -L 8001:S:8001 user@S  from H)
  H           W  -------> S     working      ( ssh -L 8001:S:8001 user@S  from W)
 home        work      server

Mientras se invierte de esta manera:

  H  <------- W           S     ssh -R 8001:localhost:8001 user@W  (from H)
  H           W  <------- S     ssh -L 8001:localhost:8001 user@W  (from S)
 home        work      server

Hizo el truco. En otras palabras, lo que está escrito en S: 8001, se reenvía a W: 8001, y lo que a su vez se escribe a W: 8001, se reenvía a H: 8001, donde my eclipse JVM está escuchando.

La JVM de tomcat en S debe iniciarse con server = n, con los argumentos:

-agentlib:jdwp=transport=dt_socket,server=n,suspend=n,address=8001
 2
Author: ᴳᵁᴵᴰᴼ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-16 14:26:16