eclipse: zdalne debugowanie serwera tomcat za firewallem

Po uruchomieniu Tomcata z włączonym jpda, podczas gdy w mojej firmie mogę zdalnie debugować kilka aplikacji internetowych w eclipse. Z wielu powodów jestem teraz w potrzebie rozwijania i zdalnego debugowania tych samych webapps spoza firewall firmy, i mogę uzyskać dostęp tylko do tego serwera przez ssh na porcie 22.

Tunelowałem większość potrzebnych portów (svn, nexus, sam tomcat, z serwera lub przez serwer) do localhost i te usługi działają dobrze, ale nie mogę uruchomić debuggera eclipse w każdy sposób; dostaję "czas połączenia podczas oczekiwania na pakiet XXX" lub "połączenie odrzucone" od drugiego razu przymierzam. Sprawdzanie za pomocą nmap na serwerze, zgłasza otwarty port przed pierwszą próbą połączenia, a następnie zostaje zamknięty. Nie mam ciekawego logu wyjściowego w catalinie.out

Komenda, której używam do uruchomienia tunelu to:

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

Iptables został tymczasowo zatrzymany zarówno na serwerze, jak i na lokalnej maszynie w celu testowania.

Am I missing coś? Czy muszę przesłać inny port do localhost? A może jest to w jakiś sposób związane z ustalaniem nazwy?

EDIT

Otwieranie portów przed połączeniem z 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)

I po:

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)

Zwracany jest dokładny błąd eclipse:

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

(Numer pakietu zmienia się przy każdej próbie).

W workspace/.metadata/.log otrzymuję:

!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 jest skonfigurowany do bezpośredniego połączenia z Internetem.

EDIT 2

Myślę rozwiązanie może być tutaj:

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

Ale mam pewne problemy ze zrozumieniem jego ustawień JNDI/RMI i w jakim stopniu dotyczy to mojej konfiguracji.

EDIT 3

To jest wyjaśnienie dla tych, którzy odpowiadają "użyj <lan|local ip address> zamiast <localhost>"
  • komputer A: moja stacja robocza w firmie
  • komputer B: moja stacja robocza w domu
  • komputer C: serwer uruchomiony tomcat

B I C są w dwóch różnych podsieciach w tej samej infrastrukturze sieciowej; dozwolone są tylko połączenia z portem 22 C z zewnątrz (i nieco "proxied", Nie wiem, wewnętrzne sieci).

A to "na zewnątrz" (moje połączenie dsl z dynamicznym adresem ip).

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

Ten artykuł sugeruje, że domyślnym portem, na którym zdalna maszyna wirtualna Java (JVM) nasłuchuje w trybie debugowania jest 1044. Powinieneś tunelować port, na którym działa zdalny JVM.


Bardziej ogólnie, można uruchomić wireshark/tcpdump, aby sprawdzić, do którego portu są podejmowane próby połączenia podczas uruchamiania debuggera.


EDIT :

Jeszcze kilka rzeczy, których bym spróbował:

  • sprawdzanie zdalnego hosta (np. z ps auxwww jeśli jest to Linux) z jakimi argumentami (poszukaj tego co jest za -Xrunjdwp lub z lsof -p PID_OF_JVM_TO_BE_DEBUGGED na którym porcie TCP nasłuchuje (poszukaj linii z TCP i LISTEN na wyjściu lsof)
  • upewnij się, że JVM na zdalnym hoście nasłuchuje interfejsu lo, a nie interfejsu sieciowego (to jest to, co określasz za pomocą localhost w opcji -L ssh).
  • czy ręczne uruchamianie debugera na maszynie, na której uruchamiasz eclipse z jdb -attach localhost:8000 działa ? (możesz również spróbować tego na zdalnym hoście, aby upewnić się, że debugger działa na porcie 8000)
  • upewnij się, że eclipse próbuje połączyć się z localhost (gdy nie podaje adresu bind przed pierwszym 8000 z opcją -L SSH nasłuchuje na interfejsie 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/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-17 07:58:13

Często miałem ten problem podczas zdalnego debugowania. Nie znam dokładnej przyczyny tego problemu, ale użyłem poniższego rozwiązania i może to również działa dla Ciebie: {]}

Zamiast

ssh -L 8000:localhost:8000 user@remotehost

Jest używany

ssh -L 8000:remotehost:8000 user@remotehost

Do tworzenia tunelu SSH (zwróć uwagę na remotehost zamiast localhost pomiędzy numerami portów w drugim przykładzie). Zamiast nazwy zdalnego hosta można również użyć normalnego adresu IP zdalnego hosta (Nie adresu loopback 127.0.0.1, ale true local network IP address).

Mam nadzieję, że to pomoże i powodzenia!

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-02 15:59:22

Zakładając, że zdalna instancja Tomcat została uruchomiona czymś w rodzaju -Xrunjdwp:transport=dt_socket,server=y,address=8000,suspend=n, spróbuj użyć tego polecenia:

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

Na moim Macu wypróbowałem lokalnie ssh -L 10701:localhost:10700 user@localhost -N, gdzie instancja Tomcat została uruchomiona z -Xrunjdwp:transport=dt_socket,server=y,address=10700,suspend=n, i próbując podłączyć się do portu 10701 w Eclipse, ciągle widziałem "nie udało się połączyć ze zdalnym vm com.słońce.jdi.połącz się.spi.ClosedConnectionException". Zmieniając komendę tunnel na ssh -L 10701:0.0.0.0:10700 user@localhost -N, Eclipse było w stanie dołączyć.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-18 23:57:47

Czy możesz podać dokładne parametry parametru-Xrunjdwp?

Czy próbowałeś również różnych metod debugowania (server=y/n, suspend=y / n)?

Być może odwrócenie połączenia (niech tomcat połączy się z debuggerem zamiast pozwolić debuggerowi połączyć się z tomcat) może pomóc.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-15 07:39:46

Cóż, odpowiadam sobie po długim czasie; w moim konkretnym przypadku rozwiązaniem było włączenie eclipse JVM w tryb odsłuchu:

Connection Type: "Standard (Socket Listen)"

I odwrócić kierunek tunelu:

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)

Jakieś wyjaśnienie: tak jak w pytaniu, Moja sytuacja była:

  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

Podczas odwracania w ten sposób:

  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
Udało się. Innymi słowy, to co jest napisane na S:8001, jest przekazywane do W:8001, zaś to co z kolei jest napisane do w:8001, jest przekazywane do H: 8001, gdzie mój eclipse JVM słucha.

Tomcat JVM na S powinien zaczynać się od server=n, z argumentami:

-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/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-16 14:26:16