1 votes

Serveur Web derrière NAT, comment écouter une adresse IP publique

J'ai un serveur web debian (nginx) tournant derrière un pare-feu utilisant NAT. Le serveur web héberge plusieurs sites nécessitant SSL et leur propre adresse IP. J'aimerais que les sites SSL écoutent uniquement leur adresse IP spécifique et que les sites partagés écoutent uniquement l'IP partagée.

Actuellement, j'écoute un joker * pour tous les domaines ce qui, je suppose, signifie qu'il écoute une seule adresse LAN et sert le contenu du site en fonction du nom d'hôte et non de l'adresse IP. J'aimerais corriger cela.

Quel est le bon plan d'action? Est-ce de créer un NAT 1:1 pour chaque adresse IP et ajouter les adresses IP LAN à l'interface réseau à écouter, puis attribuer les adresses IP LAN à des domaines spécifiques? Ou y a-t-il une meilleure façon? Y a-t-il un moyen de transmettre l'adresse IP publique et d'agir en fonction de cela? Merci."

3voto

Falcon Momot Points 24815

Non, vous ne pouvez pas passer à travers l'adresse IP de destination initiale après avoir effectué le NAT, du moins pas directement.

Je vais utiliser 192.0.2.0/24 comme votre bloc IP externe et 198.51.100.0/24 comme votre bloc IP interne (voir RFC5737).

Voici quelques solutions possibles :

  • Faites du NAT sur les ports cibles de chaque IP externe vers un ensemble de ports différent sur l'IP interne. Par exemple, faites du NAT de 192.0.2.1:80 et 192.0.2.1:443 à 198.51.100.1:80 et 198.51.100.1:443, puis du NAT de 192.0.2.2:80 et 192.0.2.2:443 à 198.51.100.1:81 et 198.51.100.1:444. Configurez le serveur web pour écouter sur les ports différenciés pour les services appropriés. Assurez-vous de choisir des ports non utilisés pour autre chose et vérifiez vos paramètres de pare-feu.
  • Allouez des IPs internes supplémentaires au serveur web. Par exemple, allouez au serveur web 198.51.100.1 et 198.51.100.2. Faites du NAT des paires IP/port externes appropriées vers les paires IP/port internes correspondantes (par ex. 192.0.2.1 vers 198.51.100.1, et 192.0.2.2 vers 198.51.100.2). Indiquez à nginx de lier les services appropriés aux IPs internes appropriées.

Si vous optez pour la dernière solution, votre environnement sera plus simple et plus conforme aux normes car vous n'aurez pas à traiter avec des numéros de port inhabituels et des traductions de port, mais vous devrez allouer plusieurs IPs internes à chaque serveur web (je suppose que vous en avez juste un). De plus, si vous utilisez la dernière solution, vous pouvez utiliser un NAT 1:1.

Cela dit, si vous n'avez aucune raison de placer le serveur web derrière un NAT du tout (le NAT n'est pas un pare-feu), contentez-vous d'écouter sur les IPs externes (cela nécessiterait également un changement de topologie).

1 votes

Merci, je vais essayer de régler l'option n°2. J'ai essayé d'aller dans cette direction tout du long mais pour une raison quelconque, nginx ne répond que sur la directive wildcard dans ma configuration. Je vais créer une question séparée pour cela.

2voto

nachbar Points 286

Il semble que vous vouliez une adresse IP publique différente pour chacun des sites. Cela signifie que le pare-feu doit présenter les différentes adresses IP publiques. Le pare-feu peut ensuite rediriger les demandes vers différentes adresses IP vers le serveur nginx, ou peut rediriger ces demandes vers différents ports sur la même adresse IP. Vous pouvez ensuite configurer le serveur nginx pour répondre en conséquence.

La manière exacte de configurer cela dépend de votre pare-feu. Par exemple, en utilisant iptables, vous pourriez faire quelque chose comme ceci dans un script :

KINCAID=192.168.1.112
EXTIPJMN=50.60.70.80
iptables -t nat -A PREROUTING -d $EXTIPJMN -p tcp -i $EXT --dport 8081 -j DNAT --to-destination $KINCAID:8080

Cela redirigerait les demandes arrivant sur l'adresse IP EXTIPJMN (50.60.70.80) et le port 8081 vers votre serveur interne à l'adresse IP KINCAID (192.168.1.112) et le port 8080

Il est possible de servir différents sites à partir de la même adresse IP même via https, et cela est pris en charge par la plupart des clients modernes, mais pas tous.

0 votes

Il convient de mentionner que TLS SNI nécessite également une prise en charge côté client, et entraîne des erreurs apparemment bizarres et suspectes lorsqu'il est absent.

0 votes

Vous avez raison concernant TLS SNI : j'ai corrigé ma réponse - j'ai dit pris en charge par la plupart des serveurs modernes, mais voulais dire la plupart des clients modernes.

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