Tunnel SSH inversé

8

J'essaie de transférer le trafic Web d'un serveur distant vers ma machine locale afin de tester une intégration d'API (tropo, paypal, etc.). Fondamentalement, j'essaie de configurer quelque chose de similaire à ce que fournit tunnlr.com.

J'ai lancé le tunnel ssh avec la commande

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

Ensuite, je peux voir que le serveur écoute maintenant sur le port 7777 avec

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

Donc ça marche bien. La demande de boucle est en fait servie à partir de la machine locale.

Maintenant, comment puis-je permettre à server.com:8888 d'être acheminé via ce tunnel?

J'ai essayé d'utiliser nginx comme ceci:

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;
  }
}

À partir du journal des erreurs nginx, je vois:

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

J'ai essayé d'utiliser iptables, mais je n'ai fait aucun progrès. iptablessemble être une solution plus élégante que d'exécuter nginx uniquement pour le tunneling. Toute aide est grandement appréciée. Merci!

EDIT (ajout d'informations sur le serveur)

Détails du serveur: Ubuntu 10.10 maverick (installation standard)

EDIT (option nginx)

Les options nginx travaillées par ont changé 0.0.0.0:7777 en 127.0.0.1:7777 comme l'a suggéré @Marcel G. Toujours à la recherche d'une solution non-nginx.

EDIT (mise à jour sur la solution finale)

Comme l'a souligné @sciurus, assurez-vous que GatewayPorts yesdans votre fichier sshd_config. Au départ, j'avais cette ligne dans le fichier de configuration, mais j'avais besoin d'émettre un /etc/init.d/ssh reloadau lieu de restart(au moins, il semble que ce soit le cas sur Ubuntu).

Commande finale utilisée sur la machine locale: ssh -nNT -R '*:8888:localhost:5000' user@server

Ensuite, le serveur doit indiquer qu'il écoute sur *: 8888 avec 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
la source

Réponses:

9

Il n'est pas nécessaire d'utiliser nginx.

Dans votre configuration de démon ssh (il doit s'agir de / etc / ssh / sshd_config ), définissez GatewayPorts sur les clients spécifiés et rechargez-le. Cela est nécessaire pour que d'autres systèmes puissent se connecter à votre tunnel. Sans cela, seuls les programmes en cours d'exécution sur votre serveur pourront l'utiliser.

Il ne vous reste plus qu'à modifier votre commande ssh pour écouter sur le port 8888 au lieu du port 7777. Cela pourrait ressembler à

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

L'astérisque indique à sshd d'écouter le port 8888 sur toutes les interfaces, plutôt que simplement l'interface de bouclage. Cela échouerait si vous n'avez pas modifié GatewayPorts .

sciurus
la source
Ok, je suis passé à votre suggestion et quand je l'ai curl http://server.com:8888, je reçois l'erreur curl: (7) couldn't connect to host. Je peux toujours boucler localhost: 8888 à partir du shell du serveur et il frappe la machine locale.
chris
btw, j'ai arrêté nginx avant d'essayer la nouvelle commande que vous avez fournie.
chris
@chris est GatewayPorts activé dans sshd_config de votre serveur? Sinon, activez-le. Après avoir démarré le tunnel, assurez-vous que ssh écoute bien plus que l'adresse de bouclage; vous pouvez remplacer netstat et grep par lsof -i tcp:8888.
sciurus
Impressionnant! J'ai donc eu GatewayPorts yesdans sshd_config et je pense que je n'ai fait qu'un redémarrage /etc/init.d/ssh, mais cette fois je l'ai fait reload. Je ne sais pas quelle est la différence, mais maintenant ça marche totalement !! Merci un million @sciurus.
chris
1

J'appuie la réponse de sciurus mais si pour une raison quelconque vous devez utiliser nginx ... je suppose que votre définition en amont est cassée.

La façon dont vous créez votre tunnel inverse ssh n'écoute que sur localhost (127.0.0.1 et :: 1), donc vous voudrez peut-être essayer de donner la définition en amont suivante:

upstream tunnel {
    server 127.0.0.1:7777;
}

Juste pour mémoire: je n'ai encore jamais configuré nginx moi-même, donc ce n'est qu'une supposition.

Marcel G
la source
Merci! En fait, cela a fonctionné. Si possible, je préfère toujours ne pas utiliser nginx juste pour faire fonctionner les tunnels, mais bon de savoir que c'est possible
chris