Forwarding port 80 et iptables

Bonjour,

Je vais avoir besoin de vos lumières pour résoudre mon problème de redirection de port 80.
J’ai un serveur debian hébergé chez OVH. Dessus j’ai mis en place Xend et j’ai monté des serveurs virtuels.
Je veux rediriger le port 80 de mon dom0 sur le domU contenant Apache.
Lorsqu’il n’y a aucune règles Iptables, la redirection fonctionne parfaitement mais dès que j’applique mes règles plus d’accès sur le port 80…
Mon accès SSH quant à lui fonctionne bien (port différent de celui standard).
Mes règles iptables :


# Interdire toute connexion entrante
iptables -t filter -P INPUT DROP
iptables -t filter -P FORWARD DROP
echo - Interdire toute connexion entrante : [OK]

# Interdire toute connexion sortante
iptables -t filter -P OUTPUT DROP
echo - Interdire toute connexion sortante : [OK]

# Vider les tables actuelles
iptables -t filter -F
iptables -t filter -X
iptables -t nat -F
iptables -t nat -X
echo - Vidage : [OK]

# 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
echo - Ne pas casser les connexions établies : [OK]

# Autoriser la Supervision du serveur (SNMP)
#iptables -t filter -A INPUT -p tcp --dport 161 -s IP_SUPERVISION/32 -j ACCEPT
#iptables -t filter -A INPUT -p udp --dport 161 -s IP_SUPERVISION/32 -j ACCEPT
#echo - Autoriser Supervision : [OK]

# Autoriser les requetes DNS, FTP, HTTP, NTP
iptables -t filter -A OUTPUT -p tcp --dport 21 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 8080 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p udp --dport 123 -j ACCEPT
echo - Autoriser les requetes DNS, FTP, HTTP : [OK]

# Autoriser loopback
iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A OUTPUT -o lo -j ACCEPT
echo - Autoriser loopback : [OK]

# Autoriser ping
iptables -t filter -A INPUT -p icmp -j ACCEPT
iptables -t filter -A OUTPUT -p icmp -j ACCEPT

# HTTP
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 8080 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT
echo - Autoriser serveur Apache : [OK]

#Redirection DomU-Web
iptables -t nat -A PREROUTING -j DNAT -i eth0 -p tcp --dport 80 --to-destination 10.10.10.1:80
iptables -t nat -A PREROUTING -j DNAT -i eth0 -p tcp --dport 8080 --to-destination 10.10.10.2:80
echo - Redirection flux http 80 vers DomU-Web

#FTP
modprobe ip_conntrack_ftp
iptables -t filter -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
echo - Autoriser serveur FTP : [OK]

#DNS
iptables -t filter -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A INPUT -p udp --dport 53 -j ACCEPT
echo - Autoriser serveur Bind : [OK]

# Autoriser SSH Dom0
iptables -t filter -A INPUT -p tcp --dport #### -m recent --rcheck --seconds 60 --hitcount 2 --name SSH -j LOG --log-prefix "SSH REJECT"
iptables -t filter -A INPUT -p tcp --dport #### -m recent --update --seconds 60 --hitcount 2 --name SSH -j DROP
iptables -t filter -A INPUT -p tcp --dport ####  -m state --state NEW -m recent --set --name SSH -j ACCEPT
echo - Autoriser serveur SSH Dom0 : [OK]

# Autoriser SSH DomU
iptables -t filter -A INPUT -p tcp --dport 22 -m recent --rcheck --seconds 60 --hitcount 2 --name SSH -j LOG --log-prefix "SSH REJECT"
iptables -t filter -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 2 --name SSH -j DROP
iptables -t filter -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH -j ACCEPT
echo - Autoriser serveur SSH DomU : [OK]

Je sèche un peu sur ce coup là !
C’est surement quelque chose d’évident en plus :stuck_out_tongue:
Merci pour votre aide.

Ps : En local ça tourne bien, ce sont les connexions extérieures qui sont refusées.

Tu compte faire du NAT si je comprends.

Ou sont les règles dirigeant vers l’IP du DOM U ?

http://blog.info16.fr/index.php?article36/domu-en-mode-nated-et-domu-en-mode-routed-xen-4-sur-opensuse-11-3

Bonsoir Clochette,

C’est effectivement bien du NAT que je fais, je n’ai qu’une IP pour toutes les VM et l’hôte.
Les redirections du port 80 sont ici :

#Redirection DomU-Web iptables -t nat -A PREROUTING -j DNAT -i eth0 -p tcp --dport 80 --to-destination 10.10.10.1:80 iptables -t nat -A PREROUTING -j DNAT -i eth0 -p tcp --dport 8080 --to-destination 10.10.10.2:80 echo - Redirection flux http 80 vers MyTime-Web

Je précise que ces règles fonctionnement parfaitement si j’accepte tout :

iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

Ouvrir Forward sur le port 80 ?

Comme le dit Ricardo, il n’y a aucune règle forward. Tout est bloqué pour les machines derrière.

Ok, j’ai compris mon erreur.
Du coup ça marche quand je suis en ACCEPT parce que tous les forward sont acceptés.
Quand je restreint je dois indiquer chaque règle de FORWARD, ce qui va me donner deux règles supplémentaires :

iptables -I FORWARD -p tcp -s IP_PUBLIQUE_Dom0 -d 10.10.10.1 --dport 80 -j ACCEPT iptables -I FORWARD -p tcp -s IP_PUBLIQUE_Dom0 -d 10.10.10.2 --dport 8080 -j ACCEPT

Pouvez-vous m’indiquer si je suis dans le vrai ?

Modulo les IP ça devrait être bon mais il te faut au moins

“-s IP_PUBLIQUE_Dom0” est de trop. L’adresse IP source des connexions HTTP est celle des postes clients, rien à voir avec l’adresse publique du dom0 qui est l’adresse de destination originelle (dont on se contrefiche à ce stade puisqu’elle a été remplacée par l’adresse du domU).
Le port de destination dans la règle de filtrage doit correspondre au port cible de la règle DNAT, soit ici 80 dans les deux cas et non 8080.

Rappel de l’ordre de traversée des chaînes par un paquet retransmis :
PREROUTING -> FORWARD -> POSTROUTING

Autres remarques :

#FTP modprobe ip_conntrack_ftp iptables -t filter -A INPUT -p tcp --dport 21 -j ACCEPT iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
La dernière règle est redondante avec une précédente.

# Autoriser SSH DomU iptables -t filter -A INPUT -p tcp --dport 22 -m recent --rcheck --seconds 60 --hitcount 2 --name SSH -j LOG --log-prefix "SSH REJECT" iptables -t filter -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 2 --name SSH -j DROP iptables -t filter -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH -j ACCEPT
La chaîne INPUT ne traite que les paquets destinés à la machine elle-même, donc au dom0. Les paquets transmis aux domU depuis l’extérieur passent par la chaîne FORWARD, comme le trafic HTTP redirigé puisque les domU ont des adresses IP privées. Et il faut aussi des règles de redirection DNAT comme pour le HTTP. Si tu comptes n’accéder aux domU en SSH que depuis le dom0, alors ces règles sont inutiles mais il faut ajouter une règle dans OUTPUT pour autoriser le SSH en sortie.

# Autoriser ping iptables -t filter -A INPUT -p icmp -j ACCEPT iptables -t filter -A OUTPUT -p icmp -j ACCEPT
Remarque sempiternelle… le ping n’est qu’un type ICMP parmi bien d’autres. Ces règles acceptent n’importe quel paquet ICMP et pas seulement le ping.

Si les domU ont besoin de faire des communications sortantes vers des serveurs extérieur (par exemple pour les mises à jour ou envoyer du courrier), alors il faudra aussi ajouter des règles de filtrage pour les autoriser et de NAT source (MASQUERADE ou SNAT) puisqu’ils ont des adresses IP privées.

Bonsoir,

Merci pour toutes ces réponses.
La réponse de PascalHambourg est très enrichissante !

#!/bin/bash
echo Setting firewall rules...
#
#
###### Debut Initialisation ######

# Interdire toute connexion entrante et sortante
iptables -t filter -P INPUT DROP
iptables -t filter -P FORWARD DROP
iptables -t filter -P OUTPUT DROP
echo - Interdire toute connexion entrante et sortante: [OK]

# Vider les tables actuelles
iptables -t filter -F
iptables -t filter -X
iptables -t nat -F
iptables -t nat -X
echo - Vidage : [OK]

# 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
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
echo - Ne pas casser les connexions établies : [OK]

# Autoriser les requetes DNS, FTP, HTTP, NTP
iptables -t filter -A OUTPUT -p tcp --dport 21 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 8080 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 22 -j ACCEPT
iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p udp --dport 123 -j ACCEPT
echo - Autoriser les requetes DNS, FTP, HTTP : [OK]

# Autoriser loopback
iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A OUTPUT -o lo -j ACCEPT
echo - Autoriser loopback : [OK]

# Autoriser ping
iptables -t filter -A INPUT -p icmp -j ACCEPT
iptables -t filter -A OUTPUT -p icmp -j ACCEPT
echo - Autoriser ping : [OK]

# HTTP
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 8080 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT
echo - Autoriser serveur Apache : [OK]

#Redirection DomU
iptables -t nat -A PREROUTING -j DNAT -i eth0 -p tcp --dport 80 --to-destination 10.10.10.1:80
iptables -I FORWARD -p tcp -d 10.10.10.1 --dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -j DNAT -i eth0 -p tcp --dport 80 --to-destination 10.10.10.2:80
iptables -I FORWARD -p tcp -d 10.10.10.2 --dport 80 -j ACCEPT
echo - Redirection flux http 80 vers DomU

#FTP
modprobe ip_conntrack_ftp
iptables -t filter -A INPUT -p tcp --dport 21 -j ACCEPT
echo - Autoriser serveur FTP : [OK]

#DNS
iptables -t filter -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A INPUT -p udp --dport 53 -j ACCEPT
echo - Autoriser serveur Bind : [OK]

# Autoriser SSH Dom0
iptables -t filter -A INPUT -p tcp --dport XXXX -m recent --rcheck --seconds 60 --hitcount 2 --name SSH -j LOG --log-prefix "SSH REJECT"
iptables -t filter -A INPUT -p tcp --dport XXXX -m recent --update --seconds 60 --hitcount 2 --name SSH -j DROP
iptables -t filter -A INPUT -p tcp --dport XXXX  -m state --state NEW -m recent --set --name SSH -j ACCEPT
echo - Autoriser serveur SSH Dom0 : [OK]

Pour le moment j’ai tout ce qui me fallait, redirection HTTP de mes deux DomU, accès SSH des DomU depuis le Dom0.
J’ai pu comprendre un peu mieux Iptables.
Concernant le ‘ping’, effectivement la règle autorise le protocole ICMP qui permet de réaliser un ping. Pour n’autoriser que le ping par contre je ne vois pas trop commente faire … il n’y a pas de port étant donné que ce n’est pas du TCP/UDP.

Merci pour votre aide très précieuse :slightly_smiling:

Ah ? Voyons, je vérifie mon compte en banque… non, rien. Déception.

#Redirection DomU iptables -t nat -A PREROUTING -j DNAT -i eth0 -p tcp --dport 80 --to-destination 10.10.10.1:80 iptables -t nat -A PREROUTING -j DNAT -i eth0 -p tcp --dport 80 --to-destination 10.10.10.2:80
Je n’ai pas dit de corriger le port de destination originel 8080 dans la deuxième règle DNAT de redirection, seulement dans la règle de filtrage. Maintenant elle ne marchera jamais puisque la règle précédente fait déjà une redirection du même port 80.

ICMP n’a pas de port, mais a des types/codes. La page de manuel d’iptables est ton amie.

--icmp-type echo-request sélectionnera seulement les paquets “echo request” (requête ping). Pas besoin de s’occuper des paquets de réponse, ils sont dans l’état ESTABLISHED (sauf si l’adresse de destination du ping est de type multicast ou broadcast).

PS : Pourquoi utiliser -I dans certaines commandes plutôt que -A ?

Ben pourtant les virement des prestations sociales se font le 5 du mois … c’est étrange effectivement :laughing:

J’avais fait un petit raté sur le port 80, je m’en étais rendu compte mais je n’avais pas corrigé sur le forum …
Pour la différence entre -A et -I si j’ai bien compris :

  • A ajoute la règle à la chaîne de base
  • I insert la règle (au reboot elle sera effacée ??)
    C’est pas super claire …
    J’ai tout mis avec un -A.

Pour icmp j’ai trouvé ça, par contre je n’ai plus accès à internet sur mes DomU :

# Enable or allow ICMP ping incoming client request
#iptables -A INPUT -p icmp --icmp-type 8 -s 0/0 -d ip_Dom0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
#iptables -A OUTPUT -p icmp --icmp-type 0 -s ip_Dom0 -d 0/0 -m state --state ESTABLISHED,RELATED -j ACCEPT
#echo - Enable or allow ICMP ping incoming client request : [OK]

# Allow or enable outgoing ping request
#iptables -A OUTPUT -p icmp --icmp-type 8 -s ip_Dom0 -d 0/0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
#iptables -A INPUT -p icmp --icmp-type 0 -s 0/0 -d ip_Dom0 -m state --state ESTABLISHED,RELATED -j ACCEPT
#echo - Allow or enable outgoing ping request : [OK]

Je ne comprends pas pourquoi je n’ai plus accès à l’extérieur avec mes DomU.
Je peux pinguer le Dom0 et le domU lui même mais pas l’extérieur ni les autres DomU …

-A ajoute la règle à la fin de la chaîne, à la suite de la dernière règle.
-I insère la règle au début de la chaîne, avant la première règle.
-I insère la règle à la ième position dans la chaîne.

Qu’est-ce que tu as changé ? Ces lignes sont commentées, donc sans effet. Même dans le cas contraire, elles ne font qu’accepter des paquets donc ne bloquent rien.
Pour restreindre la règle ICMP au ping il suffisait d’y ajouter ce que j’ai indiqué.

D’accord, encore une fois merci pour ces éclaircissements !
Je les avais mis en commentaire pour m’assurer qu’il n’y avait pas d’incidence.
J’ai remis le script que je lance pour iptables :

#!/bin/bash
echo Setting firewall rules...
#
#
###### Debut Initialisation ######

# Interdire toute connexion entrante et sortante
iptables -t filter -P INPUT DROP
iptables -t filter -P FORWARD DROP
iptables -t filter -P OUTPUT DROP
echo - Interdire toute connexion entrante et sortante: [OK]

# Vider les tables actuelles
iptables -t filter -F
iptables -t filter -X
iptables -t nat -F
iptables -t nat -X
echo - Vidage : [OK]

# 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
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
echo - Ne pas casser les connexions établies : [OK]

# Autoriser les requetes DNS, FTP, HTTP, NTP
iptables -t filter -A OUTPUT -p tcp --dport 21 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 8080 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 22 -j ACCEPT
iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p udp --dport 123 -j ACCEPT
echo - Autoriser les requetes DNS, FTP, HTTP : [OK]

# Autoriser loopback
iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A OUTPUT -o lo -j ACCEPT
echo - Autoriser loopback : [OK]

# Autoriser ping
iptables -t filter -A INPUT -p --icmp-type echo-request -j ACCEPT
echo - Autoriser ping : [OK]

# HTTP
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 8080 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT
echo - Autoriser serveur Apache : [OK]

#Redirection DomU
iptables -t nat -A PREROUTING -j DNAT -i eth0 -p tcp --dport 80 --to-destination 10.10.10.1:80
iptables -A FORWARD -p tcp -d 10.10.10.1 --dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -j DNAT -i eth0 -p tcp --dport 8080 --to-destination 10.10.10.2:80
iptables -A FORWARD -p tcp -d 10.10.10.2 --dport 80 -j ACCEPT
echo - Redirection flux http 80 vers DomU

#FTP
modprobe ip_conntrack_ftp
iptables -t filter -A INPUT -p tcp --dport 21 -j ACCEPT
echo - Autoriser serveur FTP : [OK]

#DNS
iptables -t filter -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A INPUT -p udp --dport 53 -j ACCEPT
echo - Autoriser serveur Bind : [OK]

# Autoriser SSH Dom0
iptables -t filter -A INPUT -p tcp --dport XXXX -m recent --rcheck --seconds 60 --hitcount 2 --name SSH -j LOG --log-prefix "SSH REJECT"
iptables -t filter -A INPUT -p tcp --dport XXXX -m recent --update --seconds 60 --hitcount 2 --name SSH -j DROP
iptables -t filter -A INPUT -p tcp --dport XXXX  -m state --state NEW -m recent --set --name SSH -j ACCEPT
echo - Autoriser serveur SSH Dom0 : [OK]

Je viens de relire toute la discussion, et même dans la première version de ton script il n’y avait pas de règles autorisant les communications routées depuis les domU. Dans une de mes réponses, j’avais précisé :

Note sans rapport :

iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT iptables -t filter -A INPUT -p tcp --dport 8080 -j ACCEPT
Ces ports sur le dom0 sont inaccessibles depuis internet puisqu’ils sont redirigés vers des domU.

Ok.
J’ai ajouté cette règle pour remplacer mes adresses privées de mes DomU par l’adresse publique de mon Dom0 :

Ensuite, j’ai besoin de spécifier l’adresse de destination pour la règle PREROUTING:

Comme ça, seules les requêtes réalisées sur le port 80 avec mon ip_publique seront transmises au DomU-Web.

Maintenant je ne sais pas vraiment comment autoriser les DomU à sortir, j’ai essayé comme ceci :

iptables -t filter -A OUTPUT -p tcp -s 10.10.10.1 --dport 21 -j ACCEPT iptables -t filter -A OUTPUT -p tcp -s 10.10.10.1 --dport 80 -j ACCEPT iptables -t filter -A OUTPUT -p udp -s 10.10.10.1 --dport 53 -j ACCEPT iptables -t filter -A INPUT -p tcp -d 10.10.10.1 --dport 21 -j ACCEPT iptables -t filter -A INPUT -p tcp -d 10.10.10.1 --dport 80 -j ACCEPT iptables -t filter -A INPUT -p udp -d 10.10.10.1 --dport 53 -j ACCEPT
Ceci n’ayant pas marché, je pense qu’il y a encore quelque chose qui m’échappe !
En fait c’est un peu débile de mettre ces règles dans le sens où l’adresse du DomU sera remplacé par celle du Dom0 et que le Dom0 a déjà les autorisations pour sortir …

[quote=“Petit Rasta”]Ensuite, j’ai besoin de spécifier l’adresse de destination pour la règle PREROUTING:
Comme ça, seules les requêtes réalisées sur le port 80 avec mon ip_publique seront transmises au DomU-Web.[/quote]
Cela ne change pas grand-chose à mon avis. Si j’ai bien compris ton serveur n’a qu’une adresse publique, donc les paquets IP qui arrivent sur eth0 ont forcément cette adresse de destination.

Il s’agit de trafic transmis par l’hôte, donc qui passe par la chaîne FORWARD.
La chaîne OUTPUT ne voit que les paquets émis localement par la machine.
La chaîne INPUT ne voit que les paquets reçus et délivrés à la machine et non retransmis.
La chaîne FORWARD voit les paquets retransmis (“routés”) qui entrent et ressortent.

Le remplacement de l’adresse source a lieu dans la chaîne POSTROUTING, après le passage dans la chaîne FORWARD ou OUTPUT. Symétriquement, le remplacement de l’adresse destination a lieu dans la chaîne PREROUTING, avant le passage dans la chaîne FORWARD ou INPUT.

Merci PascalHambourg !
Avec tous tes conseils je m’en suis sorti :slightly_smiling:
A bientôt !