web-dev-qa-db-ja.com

Eclipse:ファイアウォールの背後にあるTomcatサーバーのリモートデバッグ

JpdaをオンにしてTomcatを起動した後、私の会社にいる間、Eclipseで多数のWebアプリケーションをリモートデバッグできます。いくつかの理由で、会社のファイアウォールの外側から同じWebアプリを開発してリモートデバッグする必要があり、ポート22のssh経由でのみそのサーバーにアクセスできます。

最も必要なポート(svn、nexus、Tomcat自体、サーバーから、またはサーバー経由)をlocalhostにトンネリングしましたが、これらのサービスは正常に機能しますが、Eclipseデバッガーを起動できません。 2回目の試行から、「パケットXXXの待機中に接続がタイムアウトしました」または「接続が拒否されました」というメッセージが表示されます。サーバー上のnmapを確認すると、最初の接続試行の前にポートが開いていることが報告され、その後は閉じられます。 catalina.outに興味深い出力ログがありません

トンネルを開始するために使用するコマンドは次のとおりです。

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

iptablesは、テストのためにサーバーとローカルマシンの両方で一時的に停止されました。

私は何かが足りませんか?他のポートをローカルホストに転送する必要がありますか?それとも、何らかの形で名前解決が関​​係しているのでしょうか。

[〜#〜]編集[〜#〜]

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)

返される正確なEclipseエラーは次のとおりです。

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

これは、「use <lan|local ip address> の代わりに <localhost> "

  • コンピューターA:会社の私のワークステーション
  • コンピューターB:自宅のワークステーション
  • コンピューターC:Tomcatを実行しているサーバー

BとCは、同じネットワークインフラストラクチャ内の2つの異なるサブネットワークにあります。外部からCのポート22への接続のみが許可されます(そして、いくらか「プロキシ」されており、ネットワークの内部はわかりません)。

Aは「外部」です(動的IPアドレスを使用したDSL接続)。

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
guido

久しぶりに答えています。私の特定のケースでは、解決策はEclipseJVMをリスニングモードにすることでした。

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に書き込まれたものはすべて、Eclipse JVMがリッスンしているH:8001に転送されます。

S上のTomcatJVMは、server = nで開始し、引数を指定する必要があります。

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

この記事 は、リモートJava仮想マシン(JVM)がデバッグモードでリッスンしているデフォルトのポートは1044であることを示しています。リモートが接続しているポートをトンネリングする必要がありますJVMも実行されています。


より一般的には、wireshark/tcpdumpを実行して、デバッガーの起動時にどのポート接続が試行されたかを確認できます。


[〜#〜]編集[〜#〜]

私が試すもう少しのこと:

  • リモートホスト(Linuxの場合はps auxwwwなど)で引数を確認します(-Xrunjdwpの背後にあるものを探します。またはlsof -p PID_OF_JVM_TO_BE_DEBUGGEDでTCPリッスンするポート(TCP出力でLISTENlsofの行を探します)
  • リモートホスト上のJVMが、ネットワークインターフェイスではなくloインターフェイスでリッスンしていることを確認してください(これは、sshの-Lオプションのlocalhostで指定するものです)。
  • Eclipseをjdb -attach localhost:8000で起動するマシンでデバッガーを手動で起動することはできますか? (リモートホストでこれを試して、デバッガーがポート8000​​で実行されていることを確認することもできます)
  • eclipseがlocalhostに接続しようとしていることを確認してください(-Lオプションを使用して最初の8000より前にバインドアドレスを指定しない場合、sshはloインターフェイスでリッスンします)
10
Andre Holzner

リモートデバッグを行うときに、この問題が頻繁に発生しました。この問題の正確な理由はわかりませんが、以下の解決策を使用しました。おそらくそれはあなたにも役立つでしょう:

の代わりに

ssh -L 8000:localhost:8000 user@remotehost

使用されている

ssh -L 8000:remotehost:8000 user@remotehost

sSHトンネルを作成するため(2番目の例のポート番号間のlocalhostではなくremotehostに注意してください)。リモートホストの名前の代わりに、リモートホストの通常のIPアドレス(ループバックアドレス127.0.0.1ではなく、実際のローカルネットワークIPアドレス)を使用することもできます。

それがお役に立てば幸いです!

7
Daniel S.

リモートTomcatインスタンスが-Xrunjdwp:transport=dt_socket,server=y,address=8000,suspend=nのようなもので開始されていると仮定して、次のコマンドを試してください。

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

Macで、ローカルでssh -L 10701:localhost:10700 user@localhost -Nを試しました。Tomcatインスタンスは-Xrunjdwp:transport=dt_socket,server=y,address=10700,suspend=nで開始され、Eclipse内のポート10701に接続しようとすると、「リモートへの接続に失敗しましたVM com.Sun.jdi.connect.spi.ClosedConnectionException "。tunnelコマンドをssh -L 10701:0.0.0.0:10700 user@localhost -Nに変更することで、Eclipseを接続できました。

6
Daniel Trebbien

-Xrunjdwpパラメーターの正確なパラメーターを教えてください。

また、デバッグのためにさまざまな方法(server = y/n、suspend = y/n)を試しましたか?

おそらく、接続を逆にする(デバッガーをTomcatに接続させるのではなく、Tomcatをデバッガーに接続させる)ことが役立つ場合があります。

3
Uwe Plonus