Comment configurer le tunnel SSH sur un VPS

De Get Docs
Aller à :navigation, rechercher

Introduction

Dans cet article, vous apprendrez à créer un tunnel sécurisé et crypté entre votre ordinateur et votre VPS, ainsi qu'à contourner les limites d'un réseau d'entreprise, à contourner le NAT, etc.

Cet article couvrira une théorie de base, que vous pouvez ignorer si vous le souhaitez en allant directement aux exemples plus bas.

Communication sur Internet, protocoles réseau et ports de communication

Chaque logiciel installé sur votre ordinateur, qui souhaite envoyer ou recevoir des données via Internet, doit utiliser un protocole de la couche application de la pile TCP/IP. Ces protocoles définissent un moyen de communiquer et le format des messages envoyés entre les hôtes sur Internet, etc. Par exemple:

  • HTTP - utilisé pour télécharger des sites Web et des fichiers à partir de votre navigateur Web
  • FTP - utilisé pour envoyer des fichiers entre un client et un serveur
  • DNS - utilisé pour changer le nom d'hôte en adresse IP et vice versa
  • POP3 et (ou) IMAP - utilisés pour télécharger/parcourir votre e-mail
  • SMTP - utilisé pour envoyer des e-mails
  • telnet - utilisé pour se connecter à distance à un serveur
  • SSH - similaire à telnet, mais dans une version cryptée sécurisée, afin que personne ne puisse voir ce que nous envoyons à un serveur et ce que le serveur nous envoie.

Ensuite, les messages du protocole donné doivent être compressés dans un segment TCP ou un datagramme UDP (dans la couche transport). Ces protocoles sont utilisés pour transporter des données via Internet - ils fonctionnent dans la couche de transport. Le protocole TCP est orienté connexion, ce qui signifie qu'avant d'envoyer des données, il est nécessaire de créer une connexion entre les machines distantes. TCP fournit toujours les données dans le bon ordre. Si un segment est perdu dans le réseau, il sera renvoyé s'il ne reçoit pas la confirmation à temps. TCP est considéré comme assez fiable.

Le protocole UDP n'est pas orienté connexion. Il ne fournit pas de retransmission pour les datagrammes perdus. Si les paquets ne sont pas reçus dans le bon ordre, UDP les donnera néanmoins à une application dans l'ordre dans lequel ils ont été reçus. Pour cette raison, UDP est principalement utilisé pour transmettre des données multimédias en temps réel - conversations VoIP, vidéoconférences, audio et vidéo. UDP est parfois utilisé par d'autres protocoles dans la couche application - par exemple, dans le cas du DNS.

Dans ce cas, un protocole de la couche supérieure doit renvoyer une requête après n'avoir pas reçu de réponse dans le délai imparti. UDP est utilisé ici principalement, car il a une faible surcharge : envoyer 1 petite requête dans 1 datagramme et recevoir une réponse prend moins de temps et doit transmettre moins de données que d'établir une connexion TCP (échange de 3 segments entre hôtes) : envoyer une requête à partir d'un client, envoi d'une confirmation du serveur, envoi d'une réponse du serveur, puis envoi d'une confirmation d'un client et déconnexion de la connexion (4 segments).

Pour identifier différentes connexions vers et depuis la même adresse IP, nous utilisons des numéros de port. Chaque serveur d'un protocole de couche application donné se lie à un numéro de port donné et attend une connexion entrante. Le client se connecte à ce port (dans le cas d'une connexion TCP) ou envoie un datagramme à ce port (dans le cas d'UDP). Pour les protocoles les plus utilisés et les plus connus, il existe des numéros de port réservés. Par exemple, le serveur HTTP écoute généralement sur le port 80 TCP (alternativement, les clients devraient s'y connecter en spécifiant le numéro de port lui-même dans une adresse - http://example.org:1234/), le serveur DNS écoute généralement sur le port 53 UDP (parfois aussi le port 53 TCP). Le client doit également utiliser un port sur le côté. Ce sont des "ports élevés" comme 52044 et sont générés aléatoirement.

Ici, vous pouvez voir plus de ports réservés que nous utilisons tous les jours.

Les segments et les datagrammes sont ensuite emballés dans des paquets IP, dans la couche réseau. Dans les paquets, l'ordinateur source et cible sont identifiés par des adresses IP. Ils sont globaux - un seul hôte peut utiliser la même adresse à la fois (à l'exception d'une magie comme NAT utilisée dans les routeurs domestiques avec des adresses IP privées : 192.168.xx, 10.xxx, 172.16-31.xx ; x est un nombre entre 1 et 255). Sur la base de ces adresses, les routeurs peuvent décider comment envoyer le paquet pour se rendre à l'ordinateur cible.

Les paquets sont ensuite regroupés en trames/cellules dans la couche liaison de données puis transmis dans un câble ou sous forme d'ondes radio sur le réseau local. Dans la couche liaison de données, dans les trames, les ordinateurs sont identifiés par leurs adresses MAC. Les trames avec des adresses MAC sont complètement supprimées des routeurs qui en extraient les paquets. Ils décident à quel réseau envoyer les paquets, les regroupent dans de nouvelles trames et les envoient sur leur chemin. Si un réseau entre les deux routeurs utilise des adresses MAC, les adresses de ces routeurs sont incluses dans la trame - la source et la cible. Il n'est pas possible de communiquer entre deux ordinateurs dans des réseaux différents en utilisant uniquement des adresses MAC, même si elles ne sont pas dupliquées - le producteur n'associe qu'une seule adresse à une carte, de sorte que tous les chariots fabriqués peuvent avoir la même adresse MAC qu'une carte fabriquée par un autre producteur .

À propos de SSH. Théorie, partie 1

SSH est un protocole de la couche application. C'est le successeur de telnet et il est utilisé pour se connecter à distance à votre VPS en mode texte. Contrairement à telnet, SSH est crypté. Il utilise le port 22 TCP, mais vous pouvez facilement modifier le port dans la configuration de votre serveur. SSH permet à l'utilisateur de s'authentifier de plusieurs manières différentes.

Par example:

  • en utilisant un nom d'utilisateur et un mot de passe
  • en utilisant une paire de clés - premièrement, une clé privée (top secrète), et deuxièmement - une clé publique (sur serveur) : un programme que vous utilisez pour vous connecter avec SSH doit résoudre un problème mathématique à l'aide d'une clé privée et envoyer la solution à le serveur. Le problème est différent à chaque fois, il est donc difficile de casser la clé en utilisant cette méthode d'authentification.

Aujourd'hui, nous utilisons la version 2 de SSH.

L'implémentation de serveur SSH la plus populaire est OpenSSH. Les clients les plus populaires sont PuTTY (pour Windows) et OpenSSH (pour Linux). PuTTY et OpenSHH permettent aux utilisateurs de créer des tunnels.

SSH permet aux utilisateurs de créer un tunnel TCP entre le serveur et le client et d'envoyer des données via ce tunnel. SSH ne prend en charge que les tunnels TCP, mais vous pouvez contourner cela, c'est-à-dire via un proxy SOCKS. Un tel tunnel est établi entre un port TCP choisi sur le serveur et un port local choisi. Il n'est pas crypté, bien sûr, donc n'importe qui peut vérifier à quoi nous l'utilisons.

Concepts qui seront utilisés

Loopback interface - une carte réseau virtuelle installée dans le système avec l'adresse IP 127.0.0.1. Seules les applications installées sur le système ont accès à cette adresse. L'accès à distance n'est pas possible. Vous pouvez démarrer un VPS sur cette interface et avoir un accès à distance uniquement à partir du même système ou via un tunnel.

SMTP - un protocole de couche application qui vous permet d'envoyer des e-mails. Il est utilisé à la fois pour la communication entre les serveurs de messagerie et la communication entre un serveur et un client de messagerie. SMTP utilise le port 25 TCP pour une communication non cryptée et le port 587 TCP ou 465 TCP (obsolète - non recommandé) pour une connexion cryptée (SSL).

POP3 - protocole de la couche application utilisé pour télécharger de nouveaux e-mails d'un serveur vers un client de messagerie local. Il est rarement utilisé de nos jours car il a été remplacé par IMAP. Pour les connexions non cryptées, il utilise le port 110 TCP, pour les connexions cryptées - le port 995 TCP.

IMAP - un protocole similaire à POP3, mais avec prise en charge des dossiers, des étiquettes, de la lecture et de la gestion des messages et des dossiers sur le serveur sans tout télécharger sur le PC local et le supprimer du serveur. IMAP utilise le port 143 TCP pour les connexions non cryptées et le port 993 TCP pour les connexions cryptées.

Exemple 1 : Tunnel vers un serveur IMAP

Un tunnel entre le port local 143 sur l'interface de bouclage - 127.0.0.1 - et le serveur IMAP pour la réception du courrier (connexion non chiffrée) sur la même machine distante.

Unix et OpenSSH :

ssh [email protected] -L 110:127.0.0.1:110
 
abc - username on server
def - server address
110: - local port that will be opened on loopback interface (127.0.0.1) on local machine
127.0.0.1 - IP address of computer that we creating a tunnel to via our SSH tunnel
:110 - port number of target machine we'll get to via tunnel

Windows et PuTTY :

[[how-to-log-into-your-droplet-with-putty-for-windows-users%0A|Ici]], vous pouvez lire comment créer une connexion à votre VPS à l'aide de PuTTY. Cette connexion est nécessaire pour créer un tunnel.

  • Choisissez votre connexion, chargez les données et allez dans Connexion->SSH->Tunnels et configurez-la comme suit :
  • Cliquez sur Ajouter. Après cela, tous les protocoles devraient ressembler à ceci :
  • Vous pouvez maintenant enregistrer la session et vous connecter en l'utilisant.

Maintenant, vous pouvez simplement configurer votre client de messagerie pour qu'il se connecte au VPS non pas directement, mais en utilisant le port 110 de l'interface de bouclage - 127.0.0.1. Vous pouvez faire la même chose avec différents protocoles - SMTP (25), IMAP (143), etc.

Exemple 2. Tunnel vers un serveur Web

Un tunnel entre le port local 8080 sur l'interface locale (127.0.0.1) et le serveur WWW, lié au port 80 d'une machine distante. Cette fois, nous allons nous y connecter en utilisant l'interface de bouclage.

Comme je l'ai dit plus tôt, le protocole HTTP est utilisé pour télécharger des sites Web WWW sur le navigateur.

Unix et OpenSSH :

ssh [email protected] -L 8080:11.22.33.44:80
 
    abc - username on server
    def - server address
    8080: - port on the local machine that will be opened on loopback interface (127.0.0.1)
    11.22.33.44 - IP address of the server that we'll create a tunnel to using SSH

Windows et PuTTY :

  • Choisissez la connexion et chargez les paramètres.
  • Allez dans Connexion->SSH->Tunnels
  • Réglez-le comme ceci :
  • Cliquez sur Ajouter :
  • Vous pouvez maintenant enregistrer la session et vous connecter.

Théoriquement parlant, après être allé sur 127.0.0.1:8080 dans votre navigateur, vous devriez voir un site Web situé sur le serveur distant auquel nous' sommes connectés.

En pratique, HTTP 1.1 a introduit le paramètre Host dans les requêtes. Ce paramètre est utilisé pour envoyer le nom de domaine DNS du VPS auquel nous nous connectons. S'il utilise le mécanisme Virtual Host, la page que vous obtiendrez sera soit une page d'erreur, soit la page principale du serveur, mais pas via le tunnel.

Dans ce cas, nous devons encore faire une chose : dans le fichier hosts sur le PC local, ajoutez l'adresse VPS et votre interface de bouclage :

127.0.0.1 website

website est l'adresse du site auquel vous souhaitez vous connecter (sans le http:// au début et le / à la fin ).

Le fichier Hosts se trouve dans /etc/hosts (Linux) ou C:\Windows\system32\drivers\etc\hosts (Windows). Pour modifier ce fichier, vous devez être administrateur ou disposer de privilèges d'administrateur.

Important! Si vous souhaitez créer un tunnel sur un port local numéroté inférieur à 1024 sur les systèmes Unix, vous devez disposer des privilèges root.

Exemple 3. Mandataire SOCKS

Un proxy SOCKS vous permet d'envoyer du trafic depuis n'importe quel protocole via un tunnel. Il ressemble, de l'extérieur, à une seule connexion TCP.

Dans cet exemple, nous allons créer un tunnel entre un serveur SSH et un client sur le port 5555 sur l'interface de bouclage. Ensuite, nous allons configurer notre navigateur pour qu'il utilise notre serveur SOCKS comme serveur proxy pour toutes les connexions sortantes.

Cette solution peut être utile pour contourner les restrictions sur les réseaux d'entreprise. Si le port que notre SSH utilise est verrouillé, nous pouvons dire au serveur d'écouter sur le port 443 en utilisant l'option Listen dans le fichier de configuration OpenSSH (/etc/ssh/sshd_config ou /etc/openssh/sshd_config) .

Unix et OpenSSH :

ssh [email protected] -D 5555
 
    abc - username
    def - server address
    5555 - local port number, where the tunnel will be created

Windows et PuTTY :

  • Choisissez la connexion et chargez les paramètres.
  • Allez dans Connexion->SSH->Tunnels
  • Réglez-le comme ceci :
  • Cliquez sur Ajouter :
  • Enregistrez la session et connectez-vous.

Dans les paramètres de votre navigateur, configurez un proxy SOCKS qui s'exécute sur 127.0.0.1:5555, à partir de maintenant jusqu'à ce que vous fermiez la connexion dans PuTTY ou OpenSSH.

Exemple 4. Contournement du NAT

NAT (en particulier PAT, qui est la forme NAT utilisée dans les routeurs domestiques) est un mécanisme qui permet à de nombreuses personnes d'utiliser une seule connexion Internet. Un routeur qui utilise NAT a une adresse publique et modifie toutes les adresses privées dans les paquets reçus du réseau interne vers sa propre adresse publique et les envoie sur Internet. Lors de la réception des paquets, il fait le contraire - il se souvient des adresses IP et des numéros de port dans une table NAT spéciale.

Une connexion depuis l'extérieur n'est possible que lorsque nous définissons une redirection de port appropriée sur le routeur. Cependant, nous pouvons contourner ce problème et créer un tunnel entre notre ordinateur et le serveur pour connecter directement notre ordinateur et notre serveur.

Partie 1.

Dans la deuxième partie, nous allons créer un tunnel entre le port local 80 (sur notre ordinateur - le serveur HTTP local) et le port 8080 sur le serveur distant. Cependant, pour des raisons de sécurité, le port distant 8080 ne sera ouvert que sur l'interface de bouclage du VPS - 127.0.0.1. Pour cette raison, nous devons reconfigurer notre serveur pour ouvrir des connexions sur chaque port. Nous allons le faire maintenant.

  1. Dans votre éditeur préféré, ouvrez le fichier /etc/ssh/sshd_config (ou /etc/openssh/sshd_config) en tant que root.

    nano /etc/ssh/sshd_config
  2. Trouver :

    #GatewayPorts no
  3. Remplacez cette ligne par :

    GatewayPorts yes
  4. Enregistrez le fichier et fermez l'éditeur.
  5. Redémarrez le serveur SSHD :

    Debian/Ubuntu:
    service ssh restart
    CentOS:
    /etc/init.d/sshd restart

Partie 2.

Dans cette section, nous allons créer le tunnel.

Unix et OpenSSH :

ssh [email protected] -R 8080:127.0.0.1:80
 
    abc - username
    def - server address
    8080 - port number that will be opened on remote server - our proxy server
    127.0.0.1 - IP address we open tunnel to
    80 - port number we open tunnel to

Cette fois, notre tunnel est local, mais nous pouvons établir une connexion par tunnel avec d'autres ordinateurs du même réseau en utilisant NAT.

Windows et PuTTY :

  • Choisissez la connexion et chargez les paramètres.
  • Allez dans Connexion->SSH->Tunnels
  • Réglez-le comme ça :
  • Cliquez sur Ajouter :
  • Enregistrez la session et connectez-vous.

Une fois connecté, nous pouvons accéder à notre serveur HTTP local depuis l'extérieur de notre réseau via un serveur proxy OpenSSH doté d'une adresse IP publique. Ouvrez ce qui suit dans un navigateur :

http://IP-address-or-domain-of-our-server-change-that-for-your-name:8080/

Théorie suite

Comme vous pouvez le voir, il existe trois types de tunnels SSH :

  • Local - option -L - un tunnel est ouvert sur notre port local et écoute les connexions qui sont d'abord redirigées vers notre connexion enregistrée vers le serveur SSH, et ensuite vers l'hôte cible.
  • Distant - option -R - un tunnel est ouvert sur le serveur SSH. Après avoir reçu une connexion par le serveur, toutes les transmissions sont redirigées vers notre tunnel local.
  • Dynamique - option -D - un tunnel est ouvert sur une interface de bouclage locale. La transmission s'effectue via le protocole SOCKS. Vous pouvez tunneler n'importe quel paquet via ce protocole - TCP, UDP. Il est possible de se connecter à n'importe quel serveur sur Internet via un serveur proxy SSH. Pour rediriger tout le trafic système via le proxy SOCKS, vous pouvez utiliser un programme tel que proxifier.