Recherche de site Web

Comment configurer un tunnel SSH sur un VPS


Introduction

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

Cet article couvrira quelques théories de base, que vous pouvez sauter si vous le souhaitez en vous rendant directement aux exemples plus bas.

Communication sur Internet, Protocoles de 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 depuis votre navigateur
  • FTP - utilisé pour envoyer des fichiers entre un client et un serveur
  • DNS - utilisé pour transformer un nom d'hôte en une adresse IP et vice versa
  • POP3 et (ou) IMAP - utilisés pour télécharger/brows dessiner 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 sécure et cryptée, donc personne ne peut voir ce que nous envoyons à un serveur et ce que le serveur nous envoie.

Ensuite, les messages du protocole donné doivent être empaquetés dans un segment TCP ou un datagramme UDP (dans la couche de transport). Ces protocoles sont utilisés pour transporter des données à travers 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 transmet 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 - des discussions VoIP, des vidéoconférences, de l'audio et de la vidéo. UDP est parfois utilisé par d'autres protocoles au niveau de l'application - par exemple, dans le cas du DNS.

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

Pour identifier les 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 applicative donné est lié à 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 de l'UDP). Pour les protocoles les plus utilisés et bien 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 (sinon, les clients devraient se 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 le port 53 TCP aussi). Le client doit aussi utiliser un port de son côté. Ce sont des "ports élevés" comme 52044 et sont générés aléatoirement.

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

Les segments et datagrammes sont ensuite encapsulés dans des paquets IP, au niveau réseau. Dans les paquets, l'ordinateur source et l'ordinateur cible sont identifiés par des adresses IP. Elles sont globales - seulement un hôte peut utiliser la même adresse à la fois (à l'exception d'un phénomène magique comme le NAT utilisé dans les routeurs domestiques avec des adresses IP privées : 192.168.x.x, 10.x.x.x, 172.16-31.x.x ; x est un nombre entre 1 et 255). Sur la base de ces adresses, les routeurs peuvent décider comment envoyer le paquet pour atteindre l'ordinateur cible.

Les paquets sont ensuite regroupés en trames/cellules dans la couche de liaison de données, puis transmis dans un câble ou sous forme d'ondes radio sur le réseau local. Dans la couche de liaison de données, les ordinateurs sont identifiés par leurs adresses MAC au sein des trames. 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. Si un réseau entre deux routeurs utilise des adresses MAC, les adresses de ces routeurs sont incluses dans la trame - celle de la source et celle de la cible. Il n'est pas possible de communiquer entre deux ordinateurs sur des réseaux différents en utilisant uniquement des adresses MAC, même si elles ne sont pas duplicables - le fabricant associe une seule adresse à une seule carte, donc des cartes fabriquées peuvent avoir la même adresse MAC qu'une carte faite par un autre fabricant.

À 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 à votre VPS à distance en mode texte. Contrairement à telnet, SSH est crypté. Il utilise le port 22 TCP, mais vous pouvez facilement changer le port dans la configuration de votre serveur. SSH permet à l'utilisateur de s'authentifier de plusieurs manières différentes.

Par exemple :

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

De nos jours, 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 OpenSSH 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 à travers ce tunnel. SSH ne prend en charge que les tunnels TCP, mais vous pouvez contourner cela, c'est-à-dire via un proxy SOCKS. Un tunnel de ce type est établi entre un port TCP choisi sur le serveur et un port local choisi. Bien sûr, c'est non chiffré, donc tout le monde peut vérifier à quoi nous l'utilisons.

Concepts qui seront utilisés

Interface de bouclage - 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 depuis le 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é tant pour la communication entre serveurs de messagerie que pour la communication entre un serveur et un client de messagerie. SMTP utilise le port 25 TCP pour la communication non encryptée et le port 587 TCP ou 465 TCP (déprécié - non recommandé) pour une connexion encryptée (SSL).

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

IMAP - un protocole similaire au POP3, mais avec un support pour les dossiers, les étiquettes, la lecture et la gestion des messages et des dossiers sur le serveur sans télécharger tout sur l'ordinateur local et le supprimer du serveur. IMAP utilise le port 143 TCP pour les connexions non sécurisées et le port 993 TCP pour les connexions sécurisé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 recevoir des e-mails (connexion non sécurisée) sur la même machine distante.

Unix et OpenSSH :

ssh abc@def -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 :

Ici, vous pouvez lire comment créer une connexion à votre VPS en utilisant PuTTY. Cette connexion est nécessaire pour créer un tunnel.

  • Choisissez votre connexion, chargez les données et allez à Connexion->SSH->Tunnels et définissez-le comme suit :

  • Cliquez sur Ajouter. Après cela, tous les protocoles devraient ressembler à ceci :

  • Vous pouvez maintenant enregistrer la session et vous y connecter.

Maintenant, vous pouvez simplement configurer votre client de messagerie pour se connecter 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 du WWW sur le navigateur.

Unix et OpenSSH :

ssh abc@def -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 :

  • Maintenant, vous pouvez enregistrer la session et vous connecter.

Théoriquement, 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.

D'un point de vue 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 de Virtual Host, la page que vous obtiendrez sera soit une page d'erreur, soit la page principale du serveur, mais pas par le tunnel.

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

127.0.0.1 website

le site web 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 à /etc/hosts (Linux) ou C:\Windows\system32\drivers\etc\hosts (Windows). Pour modifier ce fichier, vous devez être administrateur ou avoir des privilèges administratifs.

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

Exemple 3. Proxy SOCKS

Un proxy SOCKS vous permet d'envoyer du trafic de n'importe quel protocole à travers un tunnel. De l'extérieur, cela ressemble à 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 utiliser notre serveur SOCKS comme serveur proxy pour toutes les connexions sortantes.

Cette solution pourrait être utile pour contourner les restrictions sur les réseaux d'entreprise. Si le port utilisé par notre SSH est verrouillé, nous pouvons indiquer 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 abc@def -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
  • Mettez-le comme ceci :

  • Cliquez sur Ajouter :

  • Enregistrez la session et connectez-vous à celle-ci.

Dans les paramètres de votre navigateur, configurez un proxy SOCKS qui fonctionne 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

Le NAT (en particulier le PAT, qui est la forme de 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 le NAT a une adresse publique et modifie toutes les adresses privées dans les paquets reçus du réseau interne pour sa propre adresse publique et les envoie à Internet. Lorsqu'il reçoit des paquets en retour, il fait l'inverse : 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 si nous configurons un 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 notre ordinateur et le serveur directement.

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 les connexions sur tous les ports. Nous allons faire cela 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. Changez cette ligne en :

    GatewayPorts yes
  4. Enregistrez le fichier et fermez l'éditeur.
  5. Redémarrer 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 abc@def -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 tunnel vers d'autres ordinateurs sur le même réseau en utilisant la NAT.

Windows et PuTTY :

  • Choisissez la connexion et chargez les paramètres.
  • Allez dans Connexion->SSH->Tunnels
  • Mettez-le comme ça :

  • Cliquez sur Ajouter :

  • Enregistrez la session et connectez-vous.

Après s'être connecté, nous pouvons accéder à notre serveur HTTP local depuis l'extérieur de notre réseau via un serveur proxy OpenSSH qui a 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 continuée

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

  • Local - l'option -L - un tunnel est ouvert sur notre port local et écoute les connexions qui sont d'abord redirigées vers notre connexion sauvegardée au serveur SSH, puis vers l'hôte cible.
  • Télécommande - l'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 à travers notre tunnel local.
  • Dynamique - l'option -D - un tunnel est ouvert sur une interface de boucle locale. La transmission s'effectue via le protocole SOCKS. Vous pouvez tunneliser n'importe quel paquet à travers cela - 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 à travers le proxy SOCKS, vous pouvez utiliser un programme comme proxifier.