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
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 zlsof -p PID_OF_JVM_TO_BE_DEBUGGED
na którym porcie TCP nasłuchuje (poszukaj linii zTCP
iLISTEN
na wyjściulsof
) - 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 interfejsielo
)
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!
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ć.
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.
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
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