Utiliser nginx pour rediriger du trafic venant de 1.2.3.4:123 vers 192.168.1.2:345 en udp

Hello,

J’ai une conf toute simple en place : un VPS qui tourne en KVM, sur lequel je fais tourner des instances LXD.
Mon « hyperviseur KVM » a une ip privée sur le même network mes conteneurs LXD (192.168.1.0/24), tout le monde touche le monde, c’est parfait. Mon HV, a aussi évidemment une ip publique.

Maintenant, lorsque je veux renvoyer vers un contenair LXD, par exemple 192.168.1.3, tout le trafic UDP du port 2000 arrivant de mon ip publique vers 1000, j’utilise le proxy LXD en faisant un :

/snap/bin/lxc config device add instancelxd udp-2000 proxy nat=true listen=udp:ippublique:1000 connect=udp:192.168.0.3:2000

ça marche bien, mais ça écrase toutes mes règles nftables juste derrière… Par ailleurs, je suis susceptible d’héberger plusieurs instances dans lesquelles je vais héberger le même service, donc il faudra que je commencer à raisonner DNS.

Je devrai donc faire :

serveur2.mondomain.com ==> 192.168.1.2:2000-2001-2002 UDP
serveur3.mondomain.com ==> 192.168.1.3:2000-2001-2002 UDP
serveur4.mondomain.com ==> 192.168.1.4:2000-2001-2002 UDP

sachant que serveur2.mondomain.com, serveur3.mondomain.com, serveur4.mondomain.com pointent évidemment vers l’ip publique de mon serveur.

Je dois donc faire de la redirection de trafic L2/L3, en fonction du domaine, est-ce que je peux faire ça avec Nginx ? Si oui comment ? merci

/edit : j’ai voulu faire un truc comme ça, du coup, TCP/UDP, je m’en fiche, je prends tout le trafic et je le renvois en fonction du port indépendamment du protocole, j’ai donc tenté ça mais ça ne marche pas :

server {
    listen 1001;
    server_name sub1.mondomain.com;
    location / {
        proxy_set_header Host $host;
        proxy_pass http://192.168.0.3:2001;
        proxy_redirect off;
    }
}

server {
    listen 1002;
    server_name sub2.mondomain.com;
    location / {
        proxy_set_header Host $host;
        proxy_pass http://192.168.0.3:2002;
        proxy_redirect off;
    }
}

server {
    listen 1003;
    server_name sub3.mondomain.com;
    location / {
        proxy_set_header Host $host;
        proxy_pass http://192.168.0.3:2003;
        proxy_redirect off;
    }
}

Quel type de trafic UDP ?

A ma connaissance Nginx est seulement un serveur et proxy HTTP, donc à moins qu’il s’agisse de trafic HTTP/3 (utilisant le protocole QUIC basé sur un transport UDP), il n’est pas adapté.

Pour d’autres types de trafic, l’information du nom de domaine n’est a priori connue que de la source ; si l’adresse et le port de destination sont identiques, il est impossible d’aiguiller le trafic au niveau L2/L3 par des règles iptables par exemple. Par contre si le protocole utilise des enregistrements DNS de type SRV (comme le protocole SIP par exemple), il est possible d’affecter des ports distincts à chaque enregistrement.

Hello,

Alors pour le coup, il s’agirait d’héberger des serveurs de jeux différents, dans le cas présent, il s’agit d’un jeu nécessitant une écoute sur 3 ports différents.
Mais j’aimerais héberger plusieurs instances du même jeu, seulement je n’ai qu’une IP publique.

J’ai scindé mon VPS en plusieurs serveurs virtuels (des instances LXD), pour lesquelles j’ai à chaque fois une instance du jeu en question qui tourne.

Le problème, c’est que le-dit jeu (et certainement d’autres dont je voudrai proposer l’accès par la suite) ne peuvent pas écouter sur un port différent. Sinon, donc dans mon réseau virtuel, j’ai 3 instances LXD qui proposent un même service à chaque fois sur les même ports.

La seule solution à laquelle je pensais, si je ne peux pas faire de PAT, c’est de faire une redirection par domaine, d’où ma question. Mais il semblerait que la solution à mon problème se situe du côté de HAProxy. Je vais vérifier ça.

Non, ça ce n’est pas un problème puisque tu peux rediriger n’importe quel port arbitraire vers ce port fixe. La question est : est-ce que les clients peuvent se connecter à un port différent ? Sinon, avec une seule adresse IP publique, je ne vois qu’une possibilité : un VPN entre les clients et le VPS permettant aux clients d’atteindre les serveurs virtuels.

La description de HAProxy dit que c’est un reverse proxy TCP/HTTP, pas UDP. Quand bien même il supporterait UDP, ça ne suffit pas : il faut en plus que le protocole transmette le nom de domaine (comme HTTP).

J’ai mal formulé, non de base les clients ne peuvent pas se connecter sur un port différent, c’est ça qui m’embête.

Alors il te faut obligatoirement une adresse IP joignable par les clients pour chaque instance de serveur. Si ton jeu est compatible IPv6, tu peux peut-être avoir plusieurs adresses IPv6 globales pour ton VPS ?

Damned, je n’ai pas ça. Pas d’ipv6 du côté de mon/mes serveurs et encore moins du côté du jeu.

Du coup, aucune solution possible ? Il faut obligatoirement dédier une ip publique pour chaque instance si je comprends bien.

A part un VPN auquel chaque client devrait se connecter, je ne vois pas d’autre solution.

D’acc, en tout cas, comme d’hab, merci pour ton aide ! Je vais continuer de gratter, mais je crois qu’on est à court de solutions.