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. iptables
semble ê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 yes
dans 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 reload
au 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)
curl http://server.com:8888
, je reçois l'erreurcurl: (7) couldn't connect to host
. Je peux toujours boucler localhost: 8888 à partir du shell du serveur et il frappe la machine locale.lsof -i tcp:8888
.GatewayPorts yes
dans sshd_config et je pense que je n'ai fait qu'un redémarrage /etc/init.d/ssh, mais cette fois je l'ai faitreload
. Je ne sais pas quelle est la différence, mais maintenant ça marche totalement !! Merci un million @sciurus.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:
Juste pour mémoire: je n'ai encore jamais configuré nginx moi-même, donc ce n'est qu'une supposition.
la source