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
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 conlsof -p PID_OF_JVM_TO_BE_DEBUGGED
en qué puerto TCP escucha (busque las líneas conTCP
yLISTEN
en la salidalsof
) - 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 lalocalhost
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 interfazlo
)
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!
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.
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.
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
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