SSH-Tunneling mit mehreren dynamischen Portweiterleitungen


7

Ich versuche, mehrere JVMs, die auf verschiedenen Servern ausgeführt werden, über einen SSH-Tunnel zu überwachen.

Dank einer der UNIX-Gurus hier habe ich es geschafft, dies für einen einzelnen Server zum Laufen zu bringen, indem ich:

  1. Führen Sie jstatdauf dem Zielserver
  2. Richten Sie Visual VM so ein, dass 9696 als Socken-Proxy-Port verwendet wird.
  3. Führen Sie auf meinem lokalen PC Folgendes aus:

    ssh -L 2222:server1:22 bastion-host
    
  4. Führen Sie auf meinem lokalen PC Folgendes aus:

    ssh -o port=2222 -D 9696 -L 1099:localhost:1099 localhost
    

Das macht den Trick. Wenn ich jetzt versuche, zu einem zweiten Server zu tunneln, versuche ich:

  1. Führen Sie auf meinem lokalen PC Folgendes aus:

    ssh -L 3333:server2:22 bastion-host
    
  2. Führen Sie auf meinem lokalen PC Folgendes aus:

    ssh -o port=3333 -D 9696 -L 2099:localhost:1099 localhost
    

Der letzte Schritt beschwert sich jedoch über:

bind: Address already in use
channel_setup_fwd_listener: cannot listen to port: 9696

Hat jemand etwas Ähnliches geschafft?

Aktualisieren:

Der Grund dafür ist, dass jstatd eine RMI-Serveranwendung ist:

http://download.oracle.com/javase/1.5.0/docs/tooldocs/share/jstatd.html

Wie bei RMI-Anwendungen registrieren sich diese bei einer Rmiregistry. Für die Verwendung von rmi über eine Firewall muss ich SOCKS wie hier beschrieben verwenden:

http://download.oracle.com/javase/1.4.2/docs/guide/rmi/faq.html#firewallOut

Leider kann ich mit visualvm den SOCKS-Proxy-Port nur einmal festlegen, und mit der Option -D kann ich nicht denselben lokalen Port an beide Server weiterleiten ...


Sie brauchen nicht die zwei Tunnelsätze, die Sie haben - Sie können zu einer Maschine ssh und aus dieser in eine andere Maschine tunneln. Antwort aktualisiert, um das einzuschließen.
EightBitTony

Was bringt es, Ports umzuleiten 1099? Können Sie genau angeben, ob bastion-hosteine Verbindung zu server1und server2ohne Beteiligung einer Firewall hergestellt werden kann?
Stéphane Gimenez

Haben Sie versucht, die einfachste Option am Ende meiner Antwort zu verwenden, und wenn ja, welchen Fehler / welches Problem hat sie verursacht?
EightBitTony

@EightBitTony - Leider funktioniert dies nicht, da rmi einen zufälligen Port öffnet, sobald die Verbindung hergestellt ist. Der Zweck der Option -D besteht darin, dem RMI-Server mitzuteilen, welchen Port er verwenden soll. Ich kann den SOCKS-Proxy-Port jedoch nur einmal in visualvm angeben, und meine 2 Tunnel können die Option -D nicht gemeinsam nutzen.
Toolkit

Antworten:


5

Habe ich Recht, wenn ich denke, Sie haben Ihren Computer (Computer A) und sagen zwei Server (A und B), mit denen Sie an einem bestimmten Port keine direkte Verbindung herstellen können und die Sie über SSH zu ihnen tunneln möchten?

In diesem Fall erstellen Sie zwei Tunnel von Ihrem Computer (einen zu jedem Zielserver) an verschiedenen lokalen Ports mit -L nicht -D und stellen dann in Ihrem Überwachungstool eine Verbindung zu Ihrem lokalen Computer her (keine Proxy-Einstellungen), als wäre es der Remote-Server, den Sie überprüfen möchten.

ssh -L 9000:localhost:<local port jstatd listens on> user@server1
ssh -L 9001:localhost:<local port jstatd listens on> user@server2

Dann verbinden Sie sich mit Ihrem lokalen Monitor mit localhost: 9000 und localhost: 9001, und diese Tunnel verbinden Sie mit Ihren Ziel-jstatds.

Wenn es einen Zwischenserver gibt, dann einen Zwei-Hop-Tunnel,

ssh -L 9000:server1:<local port jstatd listens on> user@bastion-host
ssh -L 9001:server2:<local port jstatd listens on> user@bastion-host

Hmm, wenn Bastion-Host mit allen JVMs sprechen kann, dann

ssh -D 9000 user@bastion-host

Reicht aus, um einen Socken-Proxy zu erstellen, den Sie dann einfach über Port 9000 verwenden können.


Diese Antwort sieht hilfreich aus. Ich wollte gerade etwas Ähnliches schreiben. Könnte der Downvoter einen Grund angeben?
Stéphane Gimenez

3

Von der SSH-Manpage:

 -D [bind_address:]port
         Specifies a local “dynamic” application-level port forwarding.
         This works by allocating a socket to listen to port on the local
         side, optionally bound to the specified bind_address.  Whenever a
         connection is made to this port, the connection is forwarded over
         the secure channel, and the application protocol is then used to
         determine where to connect to from the remote machine.  Currently
         the SOCKS4 and SOCKS5 protocols are supported, and ssh will act
         as a SOCKS server.  Only root can forward privileged ports.
         Dynamic port forwardings can also be specified in the configura‐
         tion file.

Sie geben denselben lokalen Port an, von dem zweimal weitergeleitet werden soll. Probieren Sie -D 9697Ihr zweites Setup aus.


Leider scheint es, dass ich mit visualvm dies nur einmal einstellen kann. Gibt es einen Weg, dies zu umgehen?
Toolkit

Verwenden Sie -L, nicht -D, wie in der Antwort von @ EightBitTony angegeben. -D ist für SOCKS-ähnliches Proxing vorgesehen, z. B. zum Weiterleiten von HTTP durch einen SSH-Tunnel.
John Hart

1

Der letzte Schritt sagt genug: Es kann nicht an Port 9696 abgehört werden. Das liegt daran, dass Sie, wenn es Ihr zweiter Tunnel ist, einen anderen Port verwenden sollten, während 9696 den ersten verwaltet.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.