eclipse: débogage à distance d'un serveur tomcat derrière un pare-feu

après avoir démarré tomcat avec jpda on, je peux déboguer à distance un tas d'applications web dans eclipse. Pour un certain nombre de raisons, j'ai maintenant besoin de développer et de déboguer à distance ces mêmes webapps depuis l'extérieur du pare-feu de la société, et je ne peux accéder à ce serveur que via ssh sur le port 22.

j'ai tunnel les ports les plus nécessaires (svn, nexus, tomcat lui-même, à partir du serveur ou via le serveur) vers localhost et ces services fonctionnent bien, mais je ne peux pas démarrer l'éclipse débogueur en aucune façon; je suis "connection timed out en attendant paquet XXX" ou "connexion refusée" à partir de la deuxième fois que j'essaie. En vérifiant avec nmap sur le serveur, il signale le port ouvert avant la première tentative de connexion, et il se ferme après cela. Je n'ai pas de journal de sortie intéressant à catalina.

La commande que j'utilise pour démarrer le tunnel est:

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

iptables a été temporairement arrêté à la fois sur le serveur et sur la machine locale pour test.

est-ce que je rate quelque chose? Dois-je envoyer un autre port à localhost? Ou s'agit-il en quelque sorte de résolution de nom?

EDIT

Ouvrir les ports avant de tenter de connexion à partir d'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)

et aprè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)

exact eclipse erreur renvoyée est:

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

(le numéro du paquet varie à chaque tentative).

workspace/.metadata/.log je obtenir:

!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 configuré pour une connexion internet directe.

EDIT 2

je pense que la solution serait peut-être ici:

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

mais j'ai du mal à comprendre ses paramètres JNDI/RMI, et dans quelle mesure cela s'applique à ma configuration.

EDIT 3

Ceci est un précisions pour ceux qui ont répondu "utiliser <lan|local ip address> au lieu de <localhost>"

  • ordinateur: mon poste de travail dans l'entreprise
  • ordinateur B: mon poste de travail à la maison
  • C de l'ordinateur: serveur exécutant tomcat

B et C sont dans deux sous-réseaux différents dans la même infrastructure de réseau; seules les connexions vers le port 22 de C depuis l'extérieur sont autorisées (et quelque peu "approximées", Je ne sais pas les réseaux internes).

Une est "à l'extérieur" (ma connexion dsl avec adresse IP dynamique).

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
27
demandé sur Vini.g.fer 2011-07-16 16:35:50

5 réponses

Cet article suggère que le port par défaut sur lequel la machine virtuelle Java distante (JVM) écoute en mode de débogage est 1044. Vous devez également creuser un tunnel sur le port sur lequel la JVM distante tourne.


plus généralement, vous pouvez lancer wireshark / tcpdump pour voir à quel port vous tentez de vous connecter lors du démarrage du débogueur.


EDIT:

quelques autres choses que je voudrais à essayer:

  • vérifier sur l'hôte distant (par exemple,ps auxwww si C'est Linux) avec quels arguments (cherchez ce qui se trouve derrière -Xrunjdwp ou lsof -p PID_OF_JVM_TO_BE_DEBUGGED sur quel port TCP il écoute (cherchez les lignes avec TCP et LISTEN dans le lsof sortie)
  • assurez-vous que le JVM de l'hôte distant écoute le lo interface, pas l'interface réseau (c'est ce que vous spécifiez avec l' localhost dans le -L option vers ssh).
  • départ de la débogueur à la main sur la machine où vous démarrez eclipse jdb -attach localhost:8000 travail ? (vous pouvez également essayer cela sur l'hôte distant pour vous assurer que le débogueur tourne sur le port 8000)
  • assurez-vous que eclipse tente de se connecter à localhost (lorsqu'on ne spécifie pas d'adresse de liaison avant les premiers 8000 avec le -L l'option SSH écoute sur le lo interface)
10
répondu Andre Holzner 2011-07-17 07:58:13

j'ai souvent eu ce problème lors de débogage à distance. Je ne connais pas la raison exacte de ce problème, mais j'ai utilisé ci-dessous la solution et ça marche peut-être pour vous aussi:

au lieu de

ssh -L 8000:localhost:8000 user@remotehost

ssh -L 8000:remotehost:8000 user@remotehost

pour la création du tunnel SSH (notez la remotehost au lieu de localhost entre les numéros de port dans le second exemple). Au lieu du nom de l'hôte distant, vous pouvez également utiliser l'adresse IP normale de l'hôte distant (pas le loopback adresse 127.0.0.1, mais la vraie adresse IP du réseau local).

J'espère que ça vous aidera et bonne chance!

7
répondu Daniel S. 2015-09-02 15:59:22

en supposant que L'instance distante Tomcat a été lancée avec quelque chose comme -Xrunjdwp:transport=dt_socket,server=y,address=8000,suspend=n, essayez cette commande:

ssh -L 8000:0.0.0.0:8000 user@mycompany.com -N

sur mon Mac, j'ai essayé ssh -L 10701:localhost:10700 user@localhost -N localement, où une instance Tomcat a été commencée avec -Xrunjdwp:transport=dt_socket,server=y,address=10700,suspend=n, et en essayant de se connecter sur le port 10701 dans Eclipse, j'ai continué à voir " Failed to connect to remote VM com.soleil.jdi.connecter.le spi.ClosedConnectionException". En remplaçant la commande tunnel par ssh -L 10701:0.0.0.0:10700 user@localhost -N, Eclipse a pu se fixer.

6
répondu Daniel Trebbien 2012-11-18 23:57:47

pouvez-vous donner les paramètres exacts du paramètre-Xrunjdwp?

Aussi, ne vous ont essayé différentes méthodes pour le débogage (serveur=y/n, suspendre=y/n)?

peut-être d'inverser la connexion (laisser le tomcat se connecter au débogueur au lieu de laisser le débogueur se connecter à tomcat) peut aider.

3
répondu Uwe Plonus 2012-11-15 07:39:46

Eh bien je me réponds après un long moment; dans mon cas précis, la solution était de mettre eclipse JVM en mode d'écoute:

Connection Type: "Standard (Socket Listen)"

et inversez la direction du tunnel:

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)

quelques explications: comme dans la question, Ma situation était:

  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

en inversant comme ceci:

  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

a fait l'affaire. En d'autres termes, tout ce qui est écrit sur S:8001, est transmis à W:8001, et tout est écrit à W:8001, est transmis à H: 8001, où mon eclipse JVM écoute.

la JVM de tomcat sur S doit être lancée avec server=n, avec les arguments:

-agentlib:jdwp=transport=dt_socket,server=n,suspend=n,address=8001
2
répondu ᴳᵁᴵᴰᴼ 2013-09-16 14:26:16