1 votes

Tunnel SSH connectant 2 serveurs via un troisième serveur

J'ai 3 serveurs, A est un serveur accessible au public sur l'internet. B Héberge un service Web auquel je veux accéder. C a des droits d'accès pour se connecter à A et B.

Maintenant, je veux que si un client D essaie d'accéder à un port spécial sur A qu'il fait suivre à B.

IP et ports

A :

  • 1.0.0.1:22 Serveur SSHD
  • 1.0.0.1:443 Port public que je veux utiliser

B :

  • 1.0.0.2:23 Serveur SSHD
  • 1.0.0.2:444 Service web auquel je veux accéder

C :

  • 1.0.0.3

D :

  • 1.0.0.4

Schéma :

  +------------+        +------------+
  | Client (D) +--------> Public (A) |
  +------------+        +-----^------+
                              |
  +----------------+    +-----------+
  | Webservice (B) <----+ Proxy (C) |
  +----------------+    +-----------+

Questio

Quelles sont les commandes de tunnel ssh que je dois exécuter sur C Ainsi, si j'essaie d'ouvrir 1.0.0.1:443 sur D Je reçois le service hébergé sur 1.0.0.2:444 ?

1voto

Samantha Atkins Points 101

Vous pouvez vous rapprocher de ce que vous décrivez, mais pas exactement de la manière dont vous le décrivez.

2 options s'offrent à vous :

  1. utiliser L Transfert de port local
  2. utiliser D Transfert de port dynamique

1) Transfert de port local

Cela vous oblige à changer d'approche : le tunnel doit être ouvert à partir du client, à partir de D dans votre diagramme. C'est facile à réaliser, sur le client (D) il suffit de faire un

ssh -L 443:1.0.0.2:444 user@1.0.0.3

Bien sûr, cela vous oblige à le faire :

  • avoir un accès Shell ou un client putty sur D
  • avoir un utilisateur sur le proxy (C) auquel D peut se connecter
  • pouvoir se connecter de D à C via ssh
  • les paramètres X11Forwarding et AllowTcpForwarding sont réglés sur yes dans la configuration du serveur sur C

J'expliquerai dans un instant ce qu'est la redirection dynamique de ports.

1voto

martin Points 49

Sur C, vous pouvez exécuter

ssh -fNR 1.0.0.1:443:1.0.0.2:444 root@1.0.0.1

Cela ne fonctionnera que si vous vous connectez en tant que root l'utilisateur parce que 443 est un port privilégié. De plus, il ne fonctionne que si sshd sur A est configuré avec GatewayPorts fixé à yes o clientspecified . (La valeur par défaut est no et en utilisant yes ne peut pas être recommandé, donc si vous voulez le faire de cette façon, je recommande clientspecified ).

0voto

stratz Points 35

Edita:

@kasperd a mentionné que vous pouvez définir GatewayPorts pour l'utilisateur afin de ne pas avoir à utiliser nginx. Je laisse la solution de contournement ici pour les autres.

Ajouter ceci à /etc/ssh/sshd_config

Match User <username>
   GatewayPorts yes

Réponse originale :

J'ai trouvé une solution pour y parvenir avec ssh et nginx. Ce n'est pas parfait car je dois installer un serveur nginx sur A avec un proxy. J'ai dû activer ssl et donner à cette instance nginx un certificat ssl propre.

La solution se présentera donc comme suit : C exécutera la commande suivante pour créer un relais entre A et B :

ssh -R 445:1.0.0.2:444 user@1.0.0.1 -p 22

Ainsi, toute entrée sur le port 445 de 1.0.0.1 sera redirigée vers 1.0.0.2:444. Ainsi, un utilisateur local sur A peut maintenant exécuter wget https://localhost:445 --no-check-certificate pour obtenir la page d'index de votre service web. Cependant, il n'est pas encore disponible au public. (au cas où vous vous poseriez la question : Le port 445 est correct, je dois utiliser un port non utilisé pour la suite).

J'ai donc créé un serveur nginx sur A qui redirigera tout le trafic du port 443 vers le port 445. J'ai utilisé la configuration suivante :

server {
        listen 443 ssl default_server;
        listen [::]:443 ssl default_server;
        ssl on;

        ssl_certificate /etc/nginx/ssl/server.crt;
        ssl_certificate_key /etc/nginx/ssl/server.key;

        server_name proxy.<your-domain>.com;

        location / {
          proxy_pass        https://127.0.0.1:445;
          proxy_set_header  X-Real-IP  $remote_addr;
          proxy_set_header  Host $host;
        }
}

Vous pouvez maintenant utiliser votre navigateur web (en mode incognito sur Firefox pour éviter les problèmes avec le certificat) pour accéder à https://proxy .com:443 et obtenez le résultat de votre Webservice. L'IP du proxy..com doit être 1.0.0.1.

Ce qui me déplaît ici, c'est que je dois créer un nouveau serveur web qui créera une nouvelle session cryptée au lieu de simplement rediriger celle de mon service web situé sur B . Cependant, il s'agit d'une bonne solution de contournement jusqu'à ce que je trouve une meilleure solution.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X