Regles iptable

Bonjour, j’ai un serveur qui fait de la virtualisation avec KVM, j’ai établi quelques regles iptables pour permettre a mes VM de sortir du réseau local.

le souci que je rencontre c’est que j’ai plusieurs VM qui me servent de serveur web, et j’arrive pas a ouvrir les ports tels que le port 443(https) pour qu’il soit accessible sur une VM ou sur toutes mes VM, j’ai le meme souci pour le port 80 qui fonctionne bien pour une VM precise mais pas pour toutes les VM.

Regles iptables:

#!/bin/bash

# Vider les tables actuelles
iptables -t filter -F

# Vider les règles personnelles
iptables -t filter -X

# Interdire toute connexion entrante et sortante
 iptables -t filter -P INPUT DROP
# iptables -t filter -P FORWARD DROP
 iptables -t filter -P OUTPUT DROP

# ---

# Ne pas casser les connexions etablies
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# Autoriser loopback
iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A OUTPUT -o lo -j ACCEPT

# ICMP (Ping)
iptables -t filter -A INPUT -p icmp -j ACCEPT
iptables -t filter -A OUTPUT -p icmp -j ACCEPT

# ---

# autoriser les demandes sur br1(bridge)
iptables -A INPUT -i br1 -j ACCEPT
iptables -A OUTPUT -o br1 -j ACCEPT

# SSH In
iptables -t filter -A INPUT -p tcp --dport 8022 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A INPUT -p udp --dport 53 -j ACCEPT

# SSH Out
iptables -t filter -A OUTPUT -p tcp --dport 8022 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 443 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT

# regles POSTROUTING

# regles pour que les machines sortent du reseau
iptables -t nat -A POSTROUTING -s 192.168.1.11/32 -p tcp -m tcp --sport 1024:65535 --dport 80 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.1.12/32 -p tcp -m tcp --sport 1024:65535 --dport 80 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.1.13/32 -p tcp -m tcp --sport 1024:65535 --dport 80 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.1.14/32 -p tcp -m tcp --sport 1024:65535 --dport 80 -j MASQUERADE

# regles pour les services teamspeak

# vm tech-infor(server web)

# port web
iptables -t nat -A POSTROUTING -s 192.168.1.11/32 -p tcp -m tcp --sport 80 -j SNAT --to-source 91.121.139.218:80
iptables -t nat -A POSTROUTING -s 192.168.1.11/32 -p tcp -m tcp --sport 443 -j SNAT --to-source 91.121.139.218:443
iptables -t nat -A POSTROUTING -s 192.168.1.11/32 -p tcp -m tcp --sport 8026 -j SNAT --to-source 91.121.139.218:8026

# regles PREROUTING

# vm tech-infor(server web)

# port web
iptables -t nat -A PREROUTING -d 91.121.139.218/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.1.11:80
iptables -t nat -A PREROUTING -d 91.121.139.218/32 -p tcp -m tcp --dport 443 -j DNAT --to-destination 192.168.1.11:443
iptables -t nat -A PREROUTING -d 91.121.139.218/32 -p tcp -m tcp --dport 8026 -j DNAT --to-destination 192.168.1.11:8026

Tu aurais pu copier le script dans un bloc de code, ça éviterait de devoir le télécharger pour le lire.

Si je comprends bien, les VM ont des adresses IP privées qui ne sont pas joignables directement depuis l’extérieur et tu veux mettre en place des redirections de ports vers celles-ci.

Selon quels critères une connexion reçue par le serveur hôte sur le port 80 ou 443 doit être redirigée vers l’adresse IP de telle ou telle VM ?

C’est ca, les VM ont des ip privées qui empeche qu’elles soit joignable de l’exterieur, le serveur hote fait le routage des packets.

maintenant au niveau des criteres, aucune., J’aimerai que toutes mes VM puissent recevoir les packets venant du port 80 et 443 si c’est possible pour eviter d’etablir des regles precises a chaque vm. car actuellement j’utilise l’ip pour indiquer vers qu’elle vm peut ecouter sur un port précis.

Les paquets envoyés à une adresse et un port ne peuvent être redirigés que vers une adresse et un port. Pas deux ni trois adresses, à moins d’avoir un critère pour décider vers laquelle des adresses.
Voici ce qui est faisable :

  • rediriger des ports différents vers des adresses différentes, par exemple le port 80 vers l’adresse .11, le port 81 vers l’adresse .12 et le port 82 vers l’adresse .13 ;

  • configurer 3 adresses IP publiques (attribuées par l’hébergeur) sur le serveur hôte et rediriger le port 80 de chacune de ces adresses vers une adresse différente.

d’accord, je comprend, je pese que le premier cas correspondrai mieux a ce que je peux etablir avec mes connaissances, par contre quels serait les iptables pour etablir sa? car je sais comment faire pour modifié l’ecoute du port 80 sur un vhost, mais je ne sais pas comment faire pour le port 443

Tu n’as pas besoin de modifier les ports en écoute dans les machines virtuelles. Il suffit de modifier les règles iptables de redirection pour spécifier les ports destination initial et final, par exemple :

iptables -t nat -A PREROUTING -d 91.121.139.218 -p tcp --dport 81 -j DNAT --to 192.168.1.12:80

redirige les paquets destinés au port 81 de 91.121.139.218 vers le port 80 de 192.168.1.12.
Pour accéder à ce serveur depuis l’extérieur, il faudra utiliser un URL de la forme http://nom.de.domaine:81 où nom.de.domaine pointe vers 91.121.139.218. A noter que cela peut poser problème avec les pare-feu ou proxys restrictifs qui n’autorisent que les connexions vers des ports connus comme 80 et 443.

PS : Les règles SNAT sur des ports source particuliers dans la chaîne POSTROUTING sont inutiles. Le NAT s’occupe automatiquement des paquets retour.

Bonjour,

une solution a étudié, si t’es service sont identique sur tes machines et que tu veux équilibrer la charge, une ipfailover pourrait être une alternative.

Maintenant si t’es machine on des site web différent cela sera plutôt du NAT.

Autre alternative :

1 serveur apache avec du Vhost utilisant le nom de
domaine comme redirection au lieu du port d’écoute

exemple :
Site A accessible par www.siteA.com
Site B accessible par www.siteB.com

Cela pointera toujours sur la même IP est même port, mais ton apache saura que si tu n’arrives pas www.siteA.com il devra le rediriger ver le Vhost Site A et ça peut être couplet aussi par la première alternative du load balancing et IPFO.

J’espère que cela pourra t’aider

Merci beaucoup mes VM fonctionnent bien pour le port 80, mais par contre est ce normal que sa ne fonctionne pas pour le port 443, aurai t-il des spécificité propre car la actuellement une seule VM essaye d’utiliser se port et pourtant j’obtiens un timeout lorsque j’essaye de telecharger Composer avec cette commande ‘php composer-setup.php --install-dir=bin --filename=composer’, idem pour avec la commande wget

Du point de vue des couches réseau (IP) et transport (TCP), le protocole HTTPS et le port 443 n’ont rien de particulier.

Qu’entends-tu exactement par “une seule VM essaye d’utiliser ce port” ? La VM essaie-t-elle de se connecter à un serveur distant (ce qui n’a rien à voir avec la redirection de port) ou un client distant esssaie-t-il de se connecter à la VM (avec quel URL) ?

Dans les deux cas, peux-tu montrer la dernière version de ton script iptables ?

Oui actuellement j’ai testé ce port sur une VM avec ses regles:

iptables -t nat -A POSTROUTING -s 192.168.1.25/32 -p tcp -m tcp --sport 443 -j SNAT --to-source 91.121.139.218:443

iptables -t nat -A PREROUTING -d 91.121.139.218/32 -p tcp -m tcp --dport 443 -j DNAT --to-destination 192.168.1.25:443

dans ce cas vue que j’essaye de telecharger Composer, je pense que j’essaye de me connecter au serveur distant de Composer. je dis, je pense car je suis pas admin reséau mais developper web, donc j’ai pas toutes les notions du réseau.

Eventuellement, dans le fichier /etc/sysctl.conf de l’host :
# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1
C’est ce qui permet à l’host de transmettre les paquets à l’extérieur. La partie iptable masquerade permet juste de recevoir la réponse.

Les règles DNAT ne servent que pour les redirections de ports entrants, pas pour les connexion sortantes. Et j’ai déjà écrit que les règles SNAT sur un port source (–sport) sont inutiles pour ces redirections.

Pour que les connexions sortantes fonctionnent, il faut ajouter une règle SNAT ou MASQUERADE comme celles que tu as déjà pour le port 80 sous le commentaire regles pour que les machines sortent du reseau, ou la modifier en remplaçant --dport par -m multiport --dports pour indiquer plusieurs ports TCP.

Note : Tes règles MASQUERADE sont très spécifiques (une adresse source et un port destination), comme si tu voulais faire du filtrage. Mais la table nat et la cible SNAT ne sont pas prévues pour faire du filtrage.

@mazarini : si des connexions passent entre l’extérieur et les VM, ip_forward est déjà à 1.

2 J'aime

voila j’ai modifié la regles MASQUERADE:

iptables -t nat -A POSTROUTING -s 192.168.1.25/32 -p tcp -m multiport --dports 80,443 -j MASQUERADE

Aurai-je fait une erreur dans ma règles car le port reste inaccessible?

Je retire ma question, j’ai trouvé mon erreur,

dans ma regle, j’avais mis un espace apres la virgule en declarant les ports:
iptables -t nat -A POSTROUTING -s 192.168.1.25/32 -p tcp -m multiport --dports 80, 443 -j MASQUERADE

Maintenant tout fonctionne bien.

Merci beaucoup pour votre aide a tous :slight_smile: