SSH-Tunnel umkehren

8

Ich versuche, Webdatenverkehr von einem Remote-Server an meinen lokalen Computer weiterzuleiten, um einige API-Integrationen (Tropo, Paypal usw.) zu testen. Grundsätzlich versuche ich, etwas Ähnliches wie tunnlr.com einzurichten.

Ich habe den SSH-Tunnel mit dem Befehl initiiert

$ssh –nNT –R :7777:localhost:5000 user@server

Dann kann ich sehen, dass der Server jetzt Port 7777 mit abhört

user@server:$netstat -ant | grep 7777

tcp        0      0 127.0.0.1:7777          0.0.0.0:*               LISTEN     
tcp6       0      0 ::1:7777                :::*                    LISTEN  


$user@server:curl localhost:7777
Hello from local machine

Das funktioniert also gut. Die Curl-Anforderung wird tatsächlich vom lokalen Computer bereitgestellt.

Wie kann ich nun aktivieren, dass server.com:8888 durch diesen Tunnel geleitet wird?

Ich habe versucht, Nginx wie folgt zu verwenden:

upstream tunnel {
    server 0.0.0.0:7777;
}
server {
  listen 8888;
  server_name server.com;
  location / {
    access_log /var/log/nginx/tunnel-access.log;
    error_log /var/log/nginx/tunnel-error.log;
    proxy_pass http://tunnel;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_redirect off;
  }
}

Aus dem Nginx-Fehlerprotokoll sehe ich:

[error] 11389#0: *1 connect() failed (111: Connection refused)

Ich habe versucht zu verwenden iptables, aber keine Fortschritte gemacht. iptablesscheint eine elegantere Lösung zu sein, als Nginx nur zum Tunneln auszuführen. Jede Hilfe wird sehr geschätzt. Vielen Dank!

BEARBEITEN (Hinzufügen von Serverinformationen)

Serverdetails: Ubuntu 10.10 Maverick (Standardinstallation)

BEARBEITEN (Nginx-Option)

Die Nginx-Optionen, mit denen gearbeitet wurde, haben 0.0.0.0:7777 in 127.0.0.1:7777 geändert, wie von @Marcel G vorgeschlagen. Immer noch auf der Suche nach einer Nicht-Nginx-Lösung.

BEARBEITEN (Update zur endgültigen Lösung)

Stellen Sie, wie @sciurus hervorhob, sicher, dass GatewayPorts yesin Ihrer sshd_config-Datei. Ich hatte diese Zeile anfangs in der Konfigurationsdatei, musste aber /etc/init.d/ssh reloadstattdessen eine ausgeben restart(zumindest scheint es auf Ubuntu so zu sein).

Letzter Befehl, der auf dem lokalen Computer verwendet wird: ssh -nNT -R '*:8888:localhost:5000' user@server

Dann sollte der Server anzeigen, dass er *: 8888 mit abhört lsof -i tcp:888

user@server:~$ sudo lsof -i tcp:8888
COMMAND   PID     USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
sshd    14711 user    8u  IPv4 1791013      0t0  TCP *:8888 (LISTEN)
sshd    14711 user    9u  IPv6 1791014      0t0  TCP *:8888 (LISTEN)
chris
quelle

Antworten:

9

Nginx muss nicht verwendet werden.

Setzen Sie in Ihrer ssh-Daemon-Konfiguration (es sollte / etc / ssh / sshd_config sein ) GatewayPorts auf clientspezifisch und laden Sie es neu. Dies ist erforderlich, damit andere Systeme eine Verbindung zu Ihrem Tunnel herstellen können. Ohne diese Funktion können nur Programme verwendet werden, die auf Ihrem Server ausgeführt werden.

Jetzt müssen Sie nur noch Ihren ssh-Befehl ändern, um Port 8888 anstelle von Port 7777 abzuhören. Dies könnte so aussehen

ssh -nNT -R '*:8888:localhost:5000' user@server

Das Sternchen weist sshd an, Port 8888 auf allen Schnittstellen und nicht nur auf der Loopback-Schnittstelle abzuhören. Dies würde fehlschlagen, wenn Sie GatewayPorts nicht geändert haben .

Sciurus
quelle
Ok, ich bin zu Ihrem Vorschlag gewechselt und wenn ich curl http://server.com:8888, bekomme ich den Fehler curl: (7) couldn't connect to host. Ich kann localhost: 8888 immer noch aus der Server-Shell locken und es trifft den lokalen Computer.
Chris
Übrigens habe ich nginx gestoppt, bevor ich den neuen Befehl ausprobiert habe, den Sie bereitgestellt haben.
Chris
@chris ist GatewayPorts in der sshd_config Ihres Servers aktiviert? Wenn nicht, aktivieren Sie es. Stellen Sie nach dem Starten des Tunnels sicher, dass ssh mehr als nur die Loopback-Adresse abhört. Sie können netstat und grep durch ersetzen lsof -i tcp:8888.
Sciurus
Genial! Also hatte ich GatewayPorts yesin sshd_config und ich glaube, ich habe nur einen /etc/init.d/ssh Neustart durchgeführt, aber diesmal habe ich es getan reload. Ich bin mir nicht sicher, was der Unterschied ist, aber jetzt funktioniert es total !! Vielen Dank eine Million @sciurus.
Chris
1

Ich bin die zweite Antwort von Sciurus, aber wenn Sie aus irgendeinem Grund Nginx verwenden müssen ... Ich vermute, dass Ihre Upstream-Definition fehlerhaft ist.

Die Art und Weise, wie Sie Ihren SSH-Reverse-Tunnel erstellen, hört nur auf localhost (127.0.0.1 und :: 1). Daher sollten Sie versuchen, die folgende Upstream-Definition zu testen:

upstream tunnel {
    server 127.0.0.1:7777;
}

Nur zur Veranschaulichung: Ich habe Nginx noch nie selbst konfiguriert, daher ist dies nur eine Vermutung.

Marcel G.
quelle
Vielen Dank! Das hat es tatsächlich zum Laufen gebracht. Wenn möglich , würde ich immer noch nicht lieber nginx verwende nur Tunnelung zum Laufen zu bringen, aber gut zu wissen , dass es möglich ist
chris