Skip to content

rendre accessible sur Internet une VM avec IP privée – NAT

Attention ! Ce contenu a été publié il y a 11 ans. Merci de lire cette page en gardant son âge à l'esprit, son contenu étant potentiellement obsolète.

Pour ce premier tutoriel, nous parlerons d’administration systèmes et plus spécifiquement de réseau et de virtualisation.

En effet, un ami m’a demandé de lui expliquer comment, sous proxmox, rendre un container OpenVZ accessible sur Internet en utilisant la technique du NAT.

Avant de commencer, quelques précisions seront peut-être nécessaires pour certains d’entre vous.

Proxmox est une distribution linux regroupant des outils de virtualisation ainsi qu’une interface web afin de managé le tout.

OpenVZ est une technique de virtualisation se basant sur le kernel linux du système hôte et est incluse dans la distribution Proxmox.

Le NAT pour Network Address Translation (« traduction d’adresse réseau »), est un mécanisme de routage permettant de faire correspondre à une seule adresse externe publique visible sur Internet à une ou plusieurs adresses IP d’un réseau privé non routable sur l’Internet.

Attention ! Ce contenu a été publié il y a 11 ans. Merci de lire cette page en gardant son âge à l'esprit, son contenu étant potentiellement obsolète.

Activer l’IP Forwarding

Tout d’abord, il sera utile de vous assurer que l’IP Forwarding est actif sur votre serveur, pour ce faire, exécutez la commande suivante dans un terminal SSH :

[Proxmox host #1] load: 6.26: ~ # cat /proc/sys/net/ipv4/ip_forward
1

Dans le cas ou cette commande retourne 0, il vous sera nécessaire d’activer l’IP Forwarding en entrant dans un terminal la commande suivante :

echo 1 > /proc/sys/net/ipv4/ip_forward

Cette commande étant « volatile » et il vous sera nécessaire de recommencer à chaque redémarrage de votre serveur, afin d’éviter cela, modifiez le fichier /etc/sysctl.conf et ajoutez les lignes suivantes à la fin du fichier :

net.ipv4.conf.default.forwarding=1
net.ipv4.conf.all.forwarding=1

Configuration du NAT en sortie (SNAT)

Afin d’accéder à Internet, votre container à besoin d’une adresse IP routable sur Internet.
Hors dans notre cas, le container ne dispose que d’une IP privée, non routable sur Internet et ne dispose donc pas d’accès a Internet.

Afin de permettre à votre container d’accéder à Internet via cette adresse IP privée, nous allons devoir configurer iptables et lui ajouter une règle de « Source NAT », cette technique consiste à substituer l’ip source présente dans un paquet IP par une autre. Voici là commande à entrez sur votre hôte :

 iptables -t nat -A POSTROUTING -s Réseau_Privé -o vmbr0 -j SNAT –to Adresse_Sortie

Vous devez remplacer Réseau_Privé par le range d’ip que vous utilisez pour la configuration IP de vos container.
Exemple : 192.168.0.0/24  vous autorise à utiliser des IPs comprises entre 192.168.0.1 et 192.168.0.254.

En plus de Réseau_Privé, vous devez remplacer Adresse_Sortie par une IP qui est soit utilisé par un de vos VPS, soit directement configurer sur l’hôte.

Votre VE devrais désormais être en mesure d’accéder à Internet grâce à son IP Privé ! Bravo ! 🙂

Dans le cas contraire, il est possible qu’une étape supplémentaire soit nécessaire pour vous :

iptables -A FORWARD -s Réseau_Privé -j ACCEPT

Il est également recommandé, mais non obligatoire, de modifier le fichier /etc/vz/vz.conf et de remplacer la ligne « IPTABLES= » par celle-ci :

IPTABLES= »iptable_filter iptable_mangle ipt_limit ipt_multiport ipt_tos ipt_TOS ipt_REJECT ipt_TCPMSS ipt_tcpmss ipt_ttl ipt_LOG ipt_length ip_conntrack ip_conntrack_ftp ip_conntrack_irc ipt_conntrack ipt_state ipt_helper iptable_nat ip_nat_ftp ip_nat_irc ipt_REDIRECT »

Configuration du NAT en entrée (DNAT)

Maintenant que votre VE a accès à Internet, il est temps de configurer les redirections de port nécessaire afin de pouvoir accéder à un service installé sur votre VE, via une IP Publique.

Prenons une situation simple :

Mon VE dispose de l’IP privé 192.168.0.10.
Il héberge un serveur Apache sur le port 80.
Je désire pouvoir accéder au serveur Apache depuis Internet.

Pour cela, nous allons devoir configurer sur l’hôte une règle IPTABLES de « Destination NAT ». Rien de plus simple:

iptables -t nat -A PREROUTING -p tcp -d adresse_ip_1 –dport Port_Publique -i vmbr0 \
-j DNAT –to-destination Adresse_IP_VE:Port_Privé

Plusieurs choses à modifier dans cette commande :

adresse_ip_1 dois être une IP qui est soit utilisé par un de vos VPS, soit directement configurer sur l’hôte. Vous pouvez utiliser la même IP que dans l’étape précédente.

Port_Publique est le port qui sera accessible sur Internet, ce port ne doit pas être en utilisation sur la machine à laquelle est lié l’IP  !

Adresse_IP_VE est l’adresse IP Privé de votre VE

Port_Privé est le numéro de port configurer sur votre VE, dans notre cas le port 80.

La commande finale ressemblera donc à ceci :

iptables -t nat -A PREROUTING -p tcp -d 178.33.XX.XX –dport 80 -i vmbr0-j DNAT –to-destination 192.168.0.10:80

En résumé : tout paquet arrivant sur l’interface vmbr0, ayant le port de destination 80, sera « traduit » (l’IP de destination sera modifiée) par l’hôte et rediriger vers l’IP 192.168.0.10 avec comme port de destination 80.

Le port publique et le port privé ne doivent pas obligatoirement être identique.

LE SNAT DOIT ABSOLUMENT ÊTRE CONFIGURÉ (voir l’étape 2).

Attention ! Ce contenu a été publié il y a 11 ans. Merci de lire cette page en gardant son âge à l'esprit, son contenu étant potentiellement obsolète.
Published inadministration systèmetutoriels

3 Comments

  1. Florent Detry Florent Detry

    Bonjour,

    Chouette article 🙂
    J’utilise des serveurs proxmox avec cette technique (à plus grande échelle) pour nos serveurs de prod.

    Pour le firewall qui fait le nat, au début j’utilisais shorewall qui permet de générer du iptable.
    Et puis, pour des questions de clarté et de gestion, je suis passé à fwbuilder qui va pousser mes règles via ssh !

    Florent (@florentDetry)
    @iglooWebStudio

  2. Maïko Maïko

    Bonjour Florent,

    Merci pour ton commentaire.

    Je ne connais pas fwbuilder mais ça me semble intéressant ! Merci.

  3. dadeTelimele dadeTelimele

    Merci pour ton tutoriels, et je trouve que ton blog est vraiment intuitif super !!!

    Merci et bonne continuation

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.


Fatal error: Uncaught TypeError: flock(): supplied resource is not a valid stream resource in /var/www/vhosts/maiko.sh/domains/maiko.sh/blog/wp-content/plugins/w3-total-cache/Cache_File_Generic.php:64 Stack trace: #0 /var/www/vhosts/maiko.sh/domains/maiko.sh/blog/wp-content/plugins/w3-total-cache/Cache_File_Generic.php(64): flock() #1 /var/www/vhosts/maiko.sh/domains/maiko.sh/blog/wp-content/plugins/w3-total-cache/PgCache_ContentGrabber.php(2191): W3TC\Cache_File_Generic->set() #2 /var/www/vhosts/maiko.sh/domains/maiko.sh/blog/wp-content/plugins/w3-total-cache/PgCache_ContentGrabber.php(457): W3TC\PgCache_ContentGrabber->_maybe_save_cached_result() #3 [internal function]: W3TC\PgCache_ContentGrabber->ob_callback() #4 /var/www/vhosts/maiko.sh/domains/maiko.sh/blog/wp-content/plugins/w3-total-cache/Util_Bus.php(21): call_user_func() #5 /var/www/vhosts/maiko.sh/domains/maiko.sh/blog/wp-content/plugins/w3-total-cache/Generic_Plugin.php(556): W3TC\Util_Bus::do_ob_callbacks() #6 [internal function]: W3TC\Generic_Plugin->ob_callback() #7 /var/www/vhosts/maiko.sh/domains/maiko.sh/blog/wp-includes/functions.php(5373): ob_end_flush() #8 /var/www/vhosts/maiko.sh/domains/maiko.sh/blog/wp-includes/class-wp-hook.php(324): wp_ob_end_flush_all() #9 /var/www/vhosts/maiko.sh/domains/maiko.sh/blog/wp-includes/class-wp-hook.php(348): WP_Hook->apply_filters() #10 /var/www/vhosts/maiko.sh/domains/maiko.sh/blog/wp-includes/plugin.php(517): WP_Hook->do_action() #11 /var/www/vhosts/maiko.sh/domains/maiko.sh/blog/wp-includes/load.php(1260): do_action() #12 [internal function]: shutdown_action_hook() #13 {main} thrown in /var/www/vhosts/maiko.sh/domains/maiko.sh/blog/wp-content/plugins/w3-total-cache/Cache_File_Generic.php on line 64