Featured image of post Mode stream (TCP/UDP) avec Nginx

Mode stream (TCP/UDP) avec Nginx

Gestion des flux UDP/TCP (stream) avec Nginx

Introduction

Je vais vous présenter comment gérer, en entrée de ‘Nginx’ (ou ‘Swag’), autre chose que le protocole HTTP/HTTPS. Nginx possède aussi des fonctionnalités basiques pour gérer des flux TCP/UDP de bas niveaux. Nginx est donc tout à fait capable en théorie de gérer n’importe quel type de flux en entrée, autre que du HTTP : RDP, accès à des bases de données, SSH… etc

Je vais prendre l’exemple concret d’un accès à une base de donnés ‘FireBird’ depuis l’extérieur via un nom de domaine et le faire passer par le reverse proxy qui va rediriger le flux socket vers le serveur de bases de données.

Pour gérer ce type de flux TCP/UDP, nginx utilise une section ‘stream’ au lieu d’une section traditionnelle ‘http’.

Restriction

Le mode ‘stream’ n’est pas compatible avec le mode ‘http’ ; c’est donc soit l’un ou l’autre pour un même service. Le mode ‘stream’ perd la notion de destinataire (nous n’avons plus que l’ip de la Box, on perd l’url du domaine) au niveau de notre aiguillage : on ne peut donc plus filtrer avec avec nom de domaine. On ne pourra filtrer que via le numéro de port

L’aiguillage se fait donc via le numéro de port, donc il doit être unique et ne pas être utilisé pour d’autres services. Si j’ai par exemple deux services sur le port 8080 en mode ‘stream’, cela ne fonctionnera pas.

Pré-requis

Nous aurons besoin donc d’un serveur ‘nginx’ déja configuré (Container LXC ou LXD) ou alors un container ‘swag’ sous Docker.

Le mode ‘stream’ utilise les ‘Websocket’ pour fonctionner. Il est assez simple à activer. Je vais vous montrer comment je l’utilise moi personnellement, mais il y a sans doute d’autres façons de s’organiser.

Le principe est le même que le mode ‘http’ :

  • Config globale dans le fichier ‘nginx.conf’ à la racine de ’nginx’ (/etc/nginx),

  • Config des services dans le répertoire ‘conf.d’.

La config globale : nginx.conf

Nous allons modifier le fichier de configuration globale de Nginx pour lui indiquer d’utiliser la librairie ‘Stream’ installée au préalable via le paquet ‘nginx-extras’. Poue cela on rajoute en début de votre fichier /etc/nginx/nginx.conf la ligne suivante :

Pour Nginx :

include /etc/nginx/modules-enabled/50-mod-stream.conf;

Pour Swag :

include /etc/nginx/modules/10_stream.conf;

Puis je rajoute ensuite cette section à la fin de mon fichier de configuration :

    stream {

        include /etc/nginx/conf.d/geo_log.conf; # optionnel
        log_format combined '$time_iso8601 $remote_addr '
                            '$protocol $status $bytes_sent $bytes_received '
                            '$session_time $upstream_addr '
                            '"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';

        access_log /var/log/nginx/stream.log combined buffer=1k flush=5s;
        include /etc/nginx/conf.d/stream.conf; # lieu ou se trouve mes configs de services
    } 

La 1ère ligne est optionnelle : C’est pour filtrer géographiquement. La derniere ligne est a adapter si vous utilisez Swag : /config/nginx/nginx.conf

La config des services

Mes configurations de flux ‘socket’ se trouvent dans le fichier ‘stream.conf’ que j’ai placé dans /etc/nginx/conf.d

    upstream firebird {
        server 192.168.x.xx:3050;
    }


    server {
        listen 3050;
        proxy_pass firebird;
    }

Quelques explications :

  • J’écoute le port 30350 et je renvoie vers une section ‘upstream’ que j’appelle ‘firebird’,
  • La section ‘upstream’ redirige le flux vers le serveur contenant la base de données ‘firebird’ (à adapter avec l’adresse IP de votre serveur local),

Configuration de votre box

Je prend pour exemple, la configuration au niveau d’une Livebox :

NAT/PAT au niveau de la box

Tout ce qui arrive sur le port 3050 au niveau de la Livebox est renvoyé vers une machine de votre LAN (pare-feu ou votre serveur Nginx)

Test connexion

Pour tester le service, j’effectue une connexion ODBC depuis un poste Windows en utilisant mon nom de domaine qui me renvoi vers ma Box.

Connexion ODBC avec Windows

Je vérifie mes logs : j’ai bien une réponse ‘200’ du serveur :

Fichier log de Nginx

Exemple autre service : SSH

Nous allons prendre un autre exemple, une connexion SSH depuis l’extérieur qui transite par Nginx.

Nous allons reprendre notre fichier ‘stream.conf’ et lui rajouter un ‘stream ssh’.

Mon serveur SSH accepte les connexions sur le port 2121.

Remarque : Nginx ne peut gérer qu’un seul port par service/machine. Dans le cas où vous souhaitez accéder à plusieurs machines en SSH depuis l’extérieur ; il faudra sur ces mêmes serveurs définir des ports SSH différents.

    upstream firebird {
        server 192.168.x.xx:3050;
    }

    upstream ssh_server1 {
        server 192.168.x.xx:2121;
    }

    server {
        listen 3050;
        proxy_pass firebird;
    }
    
    server {
        listen 2121;
        proxy_pass ssh_server1;
    }
Généré avec Hugo
Thème Stack conçu par Jimmy