eclipse: удаленная отладка сервера Tomcat за брандмауэром - PullRequest
27 голосов
/ 16 июля 2011

После запуска tomcat с включенной jpda, в моей компании я могу удаленно отлаживать несколько веб-приложений в eclipse. По ряду причин я сейчас нуждаюсь в разработке и удаленной отладке тех же самых веб-приложений за пределами брандмауэра компании, и я могу получить доступ к этому серверу только через ssh через порт 22.

Я направил наиболее необходимые порты (svn, nexus, tomcat сам, с сервера или через сервер) на localhost, и эти службы работают нормально, но я не могу запустить отладчик eclipse; я получаю сообщение "Тайм-аут соединения во время ожидания пакета XXX" или "соединение отклонено" со второго раза, когда я пытаюсь. Проверяя с помощью nmap на сервере, он сообщает об открытии порта до первой попытки подключения и после этого становится закрытым. Я не получаю интересный выходной журнал в catalina.out

Команда, которую я использую для запуска туннеля:

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

iptables был временно остановлен как на сервере, так и на локальном компьютере для тестирования.

Я что-то упустил? Нужно ли перенаправить какой-нибудь другой порт на локальный хост? Или это каким-то образом связано с разрешением имен?

EDIT

Открыть порты перед попыткой подключения из 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)

и после:

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)

ошибка точного затмения:

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

(номер пакета меняется при каждой попытке).

в workspace/.metadata/.log я получаю:

!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 настроен для прямого подключения к интернету.

РЕДАКТИРОВАТЬ 2

Я думаю, что решение может быть здесь:

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

но у меня возникли проблемы с пониманием его настроек JNDI / RMI и степени, в которой это применимо к моей конфигурации.

РЕДАКТИРОВАТЬ 3

Это пояснение для тех, кто отвечает «используйте <lan|local ip address> вместо <localhost>»

  • компьютер A: моя рабочая станция в компании
  • компьютер B: моя рабочая станция дома
  • компьютер C: сервер, на котором запущен tomcat

B и C находятся в двух разных подсетях в одной сетевой инфраструктуре; разрешены только подключения к порту 22 C снаружи (и несколько «прокси», я не знаю, что такое внутренние сети).

A "снаружи" (мое соединение dsl с динамическим 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 ]

10 голосов
/ 16 июля 2011

В этой статье предполагается, что порт по умолчанию, на котором удаленная виртуальная машина Java (JVM) прослушивает в режиме отладки, - 1044. Вам также следует туннелировать порт, на котором работает удаленная JVM.


В общем, вы можете запустить wireshark / tcpdump, чтобы увидеть, какие попытки подключения к порту предпринимаются при запуске отладчика.


EDIT :

Еще несколько вещей, которые я бы попробовал:

  • проверить на удаленном хосте (например, с ps auxwww, если это Linux) с какими аргументами (ищите, что стоит за -Xrunjdwp или сlsof -p PID_OF_JVM_TO_BE_DEBUGGED на каком порту TCP он слушает (ищите строки с TCP и LISTEN в выводе lsof)
  • убедитесь, что JVM на удаленном хосте прослушивает интерфейс lo, а не сетевой интерфейс (это то, что вы указываете с помощью localhost в опции -L для ssh).
  • Работает ли ручной отладчик на машине, где вы запускаете eclipse с jdb -attach localhost:8000?(Вы также можете попробовать это наудаленный хост, чтобы убедиться, что отладчик работает на порту 8000)
  • убедитесь, что eclipse пытается подключиться к localhost (если не указывать адрес привязки до первых 8000 с опцией -L, ssh слушаетна интерфейсе lo)
7 голосов
/ 25 ноября 2012

У меня часто возникала эта проблема при удаленной отладке.Я не знаю точную причину этой проблемы, но я использовал приведенное ниже решение, и, возможно, оно работает и для вас:

ssh -L 8000:localhost:8000 user@remotehost

используется

ssh -L 8000:remotehost:8000 user@remotehost

для создания туннеля SSH (обратите внимание на удаленный хост вместо localhost между номерами портов во втором примере).Вместо имени удаленного хоста вы также можете использовать обычный IP-адрес удаленного хоста (не адрес обратной петли 127.0.0.1, а настоящий IP-адрес локальной сети).

Надеюсь, это поможет и удачи!

6 голосов
/ 19 ноября 2012

Предполагая, что удаленный экземпляр Tomcat был запущен с чем-то вроде -Xrunjdwp:transport=dt_socket,server=y,address=8000,suspend=n, попробуйте следующую команду:

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

На моем Mac я опробовал ssh -L 10701:<b>localhost</b>:10700 user@localhost -N локально, где экземпляр Tomcat был запущен с-Xrunjdwp:transport=dt_socket,server=y,address=10700,suspend=n и пытаясь подключиться к порту 10701 в Eclipse, я продолжал видеть «Не удалось подключиться к удаленной виртуальной машине com.sun.jdi.connect.spi.ClosedConnectionException».Изменив команду туннеля на ssh -L 10701:<b>0.0.0.0</b>:10700 user@localhost -N, Eclipse смог присоединиться.

3 голосов
/ 15 ноября 2012

Не могли бы вы дать точные параметры параметра -Xrunjdwp?

Также вы пробовали разные методы отладки (сервер = y / n, suspend = y / n)?

Возможно, может помочь инвертирование соединения (пусть tomcat подключается к отладчику, а не позволяет отладчику подключаться к tomcat).

2 голосов
/ 16 сентября 2013

Ну, я отвечаю себе через долгое время;в моем конкретном случае решение состояло в том, чтобы перевести JVM затмения в режим прослушивания:

Connection Type: "Standard (Socket Listen)"

и изменить направление туннеля:

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)

Некоторое объяснение: как в вопросе,моя ситуация была:

  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

В то время как задним ходом вот так:

  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

сделал свое дело.Другими словами, все, что написано на S: 8001, пересылается на W: 8001, и все, что в свою очередь записывается на W: 8001, пересылается на H: 8001, где моя виртуальная машина затмения слушает.

JVM tomcat на S должен запускаться с server = n с аргументами:

-agentlib:jdwp=transport=dt_socket,server=n,suspend=n,address=8001
...