Je suis débutant et j’ai un problème avec mon firewall iptables car je n’arrive pas à le configurer. J’ai activé le mode Nat de Xen, créé un DomU d’ip 10.10.10.1. Mon objectif est de fermer TOUS les ports du firewall puis de les ouvrir un par un. Pour comprendre le principe, j’ai réussi à faire un apt-get update sur le Dom0 en ouvrant les chaines INPUT/OUTPUT des ports 80 (tcp) et 53 (tcp/udp) et ça marche! Mais Je n’arrive pas à configurer la table FILTER et NAT pour l’apt-get sur les DomU (et ouvrir et rediriger le port 80 vers le DomU d’ip 10.10.10.1).
Je voudrais procéder ainsi:
Bloquage des ports
iptables -t filter -P INPUT DROP
iptables -t filter -P FORWARD DROP
iptables -t filter -P OUTPUT DROP
ouverture des ports du Dom0
[…] <- ça marche
ouverture des ports du DomU d’ip 10.10.10.1
iptables -A FORWARD -p tcp -d 10.10.10.1 --dport 80 -j ACCEPT
iptables -A FORWARD -p tcp -d 10.10.10.1 --dport 53 -j ACCEPT
iptables -A FORWARD -p udp -d 10.10.10.1 --dport 53 -j ACCEPT
iptables -A PREROUTING -t nat -p tcp --dport 80 -j DNAT --to 10.10.10.1:80
iptables -A PREROUTING -t nat -p tcp --dport 53 -j DNAT --to 10.10.10.1:53
iptables -A PREROUTING -t nat -p udp --dport 53 -j DNAT --to 10.10.10.1:53
et… ça marche pas! (pas de apt-get ni possibilité d’acccéder au port 80 du DomU de l’extérieur…)
Pouvez-vous m’aider? Merci infiniement
Je crois que tu cherches à simplifier à l’exces quelquechose de plus complexe qu’il n’y parait. Une passerelle ou un bridge, ce n’est pas simplement une ligne FILTER et une ligne NAT (ni même deux).
Les commandes que tu lances ne ferment pas le parefeu, elles en suppriment les règles. Sais tu quelles règles étaient en application avant tes commandes de DROP ?
Si oui, cela t’aidera à comprendre que la plupart sont indispensables.
Si non, et si tu ne peux repartir du départ, un état des lieux originel à peu près correct sur ce lien.
Tu peux aussi relever les lignes “iptables” effectives avant la suppression de chaines via un “iptables -L” par exemple, ou en consultant le fichier conf d’iptables s’il y en a un.
Dans la même idée, ce n’est pas parce qu’une machine (virtuelle) a accès à Internet, qu’Internet a accès à cette machine virtuelle. La destruction n’est peut-être pas indispensable. Sur cette page, un exemple de nombre de lignes iptables à envoyer pour traiter au point par point.
Il y a plusieurs moyens d’arriver à un résultat fonctionnel, avec l’utilisation des tables “MANGLE” ou “MASQUERADE”, avec ou sans le fameux “ip_forward” activé. Mais ne serait-il pas plus simple de commencer par utiliser le bridge de Xen tel que d’origine, et arriver à renvoyer ton 80 et ton 53 sur la virtuelle qui t’interesse ?
PS: Pour les commandes que tu indiques, pense à préciser si tu les as tapées sur le paravirtualisateur (physique) ou sur le virtuel. C’est important et ce n’est pas vraiment visible d’ici
PS2: Je n’utilise pas Xen et n’en ai pas sous la main Si un Xen user passe par là…
Edité le 14/07/2014 à 22:51
Oui, je crois que je simplifie le problème car… je suis vraiment débutant sur iptables. J’ai vraiment du mal à en comprendre toutes ses nuances! Merci pour ton aide et tous les liens que tu m’as donné! ils me seront très utiles…
Cependant, je ne penses pas utiliser le bridge tel quel car je ne pourrais pas filtrer les données de façon aussi pertinantes qu’en NAT: je cherche à avoir une communication entre les diverses domU, une communbication entre domU et dom0, dom0 vers l’extérieur et domU vers l’exterieur… et je pense que cette configuration ne sera possible qu’avec le mode NAT…
Je crois que ce serait mieux pour moi de poser mon problème à plat, voici ce que j’aimerai faire dans un premier temps:
j’ai mon serveur de virtualisation Xen en mode Nat. Il comporte un DomU d’ip 10.10.10.1. Je cherche à sécuriser les flux de données du Dom0 et de(s) DomU à l’aide d’iptables du Dom0.
!
! eth0
! 192.168.0.1
!Serveur Xen!
!Dom0_!
!
!
! NAT
! 10.10.10.1
!Domaine_1!
!DomU!
Il faudrait permettre à tous les DomU de se connecter à internet (port 80 tcp) et au DNS (53 tcp/udp), mais que les ordinateurs à l’extérieur ne puissent accéder à ces DomU que par des ports spécifiques par exemple le port 80 pour le Domaine_1. Quand au Dom0, il devrait être capable également de se connecter à internet et au DNS. De plus, j’aimerai que le Dom0 puisse accéder en (internet et dns permettent entre autres de faire des (apt-get update/upgrade).
J’ai réussi à avancer mon script pour qu’il me permette de faire à peut près ce que je veut:
#! /bin/bash
# Affichage du message d'accueil:
echo -e "nn--- SCRIPT DE PARAMÊTRAGE DU FIREWALL ---n"
# reinitialisation du firewall...
echo "reinitialisation du firewall"
sleep 1
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
echo " [fait]"
# Bloquage des ports
echo "bloquage des ports..."
iptables -t filter -P INPUT DROP
iptables -t filter -P OUTPUT DROP
echo " [fait]"
# Ouverture des ports Dom0:
echo "ouverture des ports Dom0..."
# autorisation des connexions établies
echo " - aurositation des connexions établies..."
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
echo " [fait]"
# Autorisation du loopback
echo " - autorisation du loopback..."
iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A OUTPUT -o lo -j ACCEPT
echo " [fait]"
# Autorisation HTTP
echo " - autorisation HTTP..."
iptables -t filter -s 192.168.0.1 -A OUTPUT -p tcp --dport 80 -j ACCEPT
echo " [fait]"
# Autorisation HTTPS
echo " - autorisation HTTPS..."
iptables -t filter -s 192.168.0.1 -A OUTPUT -p tcp --dport 443 -j ACCEPT
echo " [fait]"
# Autorisation SSH
echo " - autorisation SSH..."
iptables -t filter -s 192.168.0.1 -A OUTPUT -p tcp --dport 22 -j ACCEPT
echo " [fait]"
# Autorisation DNS
echo " - autorisation DNS..."
iptables -t filter -s 192.168.0.1 -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -s 192.168.0.1 -A OUTPUT -p udp --dport 53 -j ACCEPT
echo " [fait]"
iptables -P FORWARD ACCEPT
iptables -t nat -A POSTROUTING -s 10.10.10.1/24 -o eth0 -j MASQUERADE
iptables -A OUTPUT -o 192.168.0.1 -d 10.10.10.1/24 -p tcp --dport 53 -j ACCEPT
iptables -A OUTPUT -o 192.168.0.1 -d 10.10.10.1/24 -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -o 192.168.0.1 -d 10.10.10.1/24 -p tcp --dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 10.10.10.1:80
sauf que:
je laisse le forward avec “accept” et je sais pas si c’est bien bon
je n’arrive pas à accéder au port 80 du domU par le dom0…
est-ce que vous auriez une petite idée de ce qui cloche?
Essayons de prendre le truc du départ. Oublies la virtualisation une seconde et imagines que tu aies un réseau physique :
Une machine dom0 sert de passerelle (NAT) entre le réseau 192.168.0.x et le réseau 10.10.10.x
Elle a donc deux cartes réseau distinctes, soit eth0 avec l’ip 192.168.0.1 et eth1 avec l’ip 10.10.10.250
Une machine domU fait partie du réseau 10.10.10.x
Elle possède une carte réseau eth0 avec l’ip 10.10.10.1, sa gateway doit être 10.10.10.250
Pour limiter la translation entre 192.168.0.x et 10.10.10.x, tu utilises quelques règles Iptables que tu “scriptes” depuis la machine dom0
Note que eth0, eth1 sont des exemples, il me semble que sous Xen c’est protocolairement “vif” au lieu de “eth” pour les pattes virtuelles.
Si j’essaie de transcrire ça dans ton exemple, en reprenant ton “schema” :
!
!
! eth0 192.168.0.1
!Dom0_! <== Le NAT c’est lui !
! eth1 10.10.10.250
!
!
!
! eth0 10.10.10.1
!Domaine_1!
!DomU!
Pour que dom0 puisse voir le réseau 10.10.10.x et donc effectuer la translation, il faut qu’elle ai une ip sur ce réseau 10.10.10.x
Question 1 : Quelle est l’ip de ta machine dom0 dans le réseau 10.10.10.x ?
Question 2 : Quelle est la gateway de ta machine domU ?
Alors, après quelques petites recherches (merci ifconfig!) j’ai trouvé l’interface réseau virtuelle rattachée au domU: c’est vif1.0 qui est connectée sur le réseau avec l’adresse 10.10.10.128
euh, là je vais dire encore que je suis un peu noob sur les bords…
j’ai tenté de lancer la commande “route” sur le terminal du dom0 et il me donne:
donc… pour moi c’est assez moyennement concluant…
Cependant, pour la directive de création des domU, j’ai donné comme directive d’avoir:
gateway = 10.10.10.254
broadcast = 10.10.10.255
Edité le 16/07/2014 à 11:17
Il y a peut-etre des lignes supplémentaires propres à Xen. Si oui lesquelles ?
Bien entendu, vifx est à adapter avec ce que tu as toi sur ton dom0…
[quote="duff4"]
donc… pour moi c’est assez moyennement concluant…
Cependant, pour la directive de création des domU, j’ai donné comme directive d’avoir:
gateway = 10.10.10.254
broadcast = 10.10.10.255
[/quote]
vif1.0 étant l’interface réseau du domU sur le dom0. Elle est créé automatiquement par l’hyperviseur Xen au lancement du domaine (c’est dynamique!). L’hyperviseur ne touche pas au fichier interfaces.
Ah, si celà peut t’aider, avec la comande ip route list , j’obtiens ceci:
default via 192.168.0.1 dev eth0
10.10.10.1 dev vif1.0 scope link src 10.10.10.128
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.0.1
Merci pour le lien, cependant, je n’ai malheureusement rien trouvé qui pourrait m’aider… Mais j’ai profité d’avoir du temps pour faire quelques petites bidouilles et j’ai trouvé quelquechose de très ineteressant!
Dans mon script, pour ouvrir les ports du dom0 en OUTPUT, j’ai bien précisé que la source de ces données devaient venir du dom0:
Or, j’ai remarqué que si j’enlevais cette directive, j’avais enfin accès au port 80 du domU…
Donc ma question: si je veut être enquiquiant et que je conserve -s 192.168.0.1 pour l’ouverture du port 80 vers l’exterieur… m’est-il possible de trouver une rêgle iptables pour autoriser cette fois les requêtes du dom0 (ip 192.168.0.1) du port 80 vers le domU (d’ip 10.10.10.1) ?
Edité le 16/07/2014 à 22:06
Pourquoi OUTPUT seulement et pas INPUT ? (autrement dit, dupplique. L’idée étant d’identifier l’ip d’où provient la requête)
Edité le 16/07/2014 à 22:15
je n’ai pas utilisé l’input parce que… ben y en a tout simpelment pas besoin! (à moins que je me trompe… ce qui est également possible )Pour moi, input autoriserait des requêtes venant de l’exterieur du Dom0… or, pour l’instant, à part la redirection du port 80 vers le domU, il y avait rien d’autre à faire passer… Si?
Si on veut être tatillon, est-ce que l’on pourrait préciser pour la dernière rêgle que l’on a trouvé que la destination ne peut être que pour le dom0?
Une fois ce dernier point fait, j’aurai enfin terminé ce srcipt ^^
En fait pour l’INPUT, il est necessaire mais tu l’as déja probablement effectué à un niveau plus large avec une ligne permettant l’accès internet pour les mises à jour et autres…
Garde à l’esprit les différences entre “INPUT/OUTPUT” et les “–sport/–dport”
Hors autorisation large, une formulation propre pour le 80 entrant/sortant ressemble à :
iptables -A INPUT -p tcp --sport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
note le “–sport” (–source-port) associé à INPUT et le “–dport” (destination-port) associé à OUTPUT
Les requetes port 80 arrivant sur le 192.168.0.1:80 seront redirigées vers le 10.10.10.1:80
Enfin, si j’ai bien compris ton objectif.
Dans tous les cas, fais des tests pour t’assurer du bon fonctionnement au sens accès mais aussi au sens blocage
Jette une copie de ton script à l’état actuel si tu veux. Histoire d’avoir quelques avis.
Edité le 17/07/2014 à 07:48
Après de nombreux tests et quelques améliorations “cosmétiques”, voici donc le script que j’ai réussi à en tirer:
#! /bin/bash
# Affichage du message d'accueil:
echo -e "nn--- SCRIPT DE PARAMÊTRAGE DU FIREWALL ---n"
# reinitialisation du firewall...
echo "reinitialisation du firewall"
sleep 1
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
echo " [fait]"
# Bloquage des ports
echo "bloquage des ports..."
iptables -t filter -P INPUT DROP
iptables -t filter -P OUTPUT DROP
echo " [fait]"
# Configuration iptables pour le DomO:
echo "Configuration iptables pour le DomO"
# autorisation des connexions établies
echo " - aurositation des connexions établies..."
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
echo " [fait]"
# Autorisation du loopback
echo " - autorisation du loopback..."
iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A OUTPUT -o lo -j ACCEPT
echo " [fait]"
# Ouverture des ports...
echo " - ouverture des ports vers l'exterieur..."
echo " -> HTTP (OUT)"
iptables -t filter -s 192.168.0.1 -A OUTPUT -p tcp --dport 80 -j ACCEPT
echo " -> HTTPS (OUT)"
iptables -t filter -s 192.168.0.1 -A OUTPUT -p tcp --dport 443 -j ACCEPT
echo " -> SSH (IN/OUT)"
iptables -t filter -d 192.168.0.1 -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -t filter -s 192.168.0.1 -A OUTPUT -p tcp --dport 22 -j ACCEPT
echo " -> DNS (OUT)"
iptables -t filter -s 192.168.0.1 -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -s 192.168.0.1 -A OUTPUT -p udp --dport 53 -j ACCEPT
echo " [fait]"
# Configuration iptables pour les DomU:
echo "Configuration iptables pour les DomU..."
# autorisation du forwarding
echo " - aurositation du forwarding..."
iptables -P FORWARD ACCEPT
echo " [fait]"
# autorisation de l'accès des DomU vers l'exterieur
echo " - aurositation de l'accèes vers l'exterieur des DomU..."
iptables -t nat -A POSTROUTING -s 10.10.10.1/24 -o eth0 -j MASQUERADE
echo " [fait]"
# autorisation de la laison de Dom0 vers les DomU
echo " - autorisation de laison du Dom0 vers les DomU..."
iptables -t filter -A OUTPUT -s 10.10.10.128/10.10.10.142 -j ACCEPT
echo " [fait]"
# ourevture des ports vers l'exterieur
echo " - ouverture des ports vers l'exterieur..."
echo " -> HTTP (OUT)"
iptables -A OUTPUT -o 192.168.0.1 -d 10.10.10.1/24 -p tcp --dport 80 -j ACCEPT
echo " -> DNS (OUT)"
iptables -A OUTPUT -o 192.168.0.1 -d 10.10.10.1/24 -p tcp --dport 53 -j ACCEPT
iptables -A OUTPUT -o 192.168.0.1 -d 10.10.10.1/24 -p udp --dport 53 -j ACCEPT
echo " [fait]"
# redirection des ports du Dom0 vers les services DomU
echo " - redirection des ports du Dom0 vers les services DomU..."
echo " -> port 80 vers VM apache"
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 10.10.10.1:80
echo " -> port 23 vers VM apache"
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 23 -j DNAT --to-destination 10.10.10.1:22
echo " [fait]"
Je ne suis pas sûr à 100%, mais je crois que tout marche… ça filtre ce qui doit être filtré, ça laisse passer ce qui doit passer et ça redirige ce qui doit être redirigé… Bref, iptables fait son boulot avec ces rêgles… Je crois que tout est bon… Qu’en penses-tu?
Donc une chose: merci! Je crois que seul, je n’aurai jamais réussi à aller si loin! Je t’en suis vraiment reconaissant woolf! Je vais enfin pouvoir m’attaquer à autre chose! En route vers de nouvelles avaentures sur linux !
Je t’en prie. D’autant que c’est toi qui a fait tout le boulot, j’ai juste donné quelques pistes… :super:
A vue de nez, je ne vois rien de contradictoire dans tes règles. Mais tu es dans le cas particulier d’une virtualisation Xen.
Si tu t’es assuré que ce qui doit être fermé l’est réellement, alors l’essentiel est fait, surtout pour un premier script.
Si je devais chipoter un peu, les lignes “echo” sont certainement très utiles quand tu lances le script à la main, pour t’assurer la prise en compte au point par point. Mais elles deviennent inutiles lorsque tu passes le script en lancement automatique, puisque les retours vont se perdre dans la nature.
Le bon conseil serait de définir un fichier de log pour ton script et de jeter les retours dedans. exemple :
#! /bin/bash
# section definition fichier log
# pour fichier de log /var/log/scripts/parefeu.log
#creation du dossier si inexistant
mkdir -p /var/log/scripts/
# deplacement du log precedent pour historique
mv /var/log/scripts/parefeu.log /var/log/scripts/parefeu.log.old
# clean du fichier de log
cat /dev/null > /var/log/scripts/parefeu.log
# Affichage du message d'accueil:
echo -e "nn--- SCRIPT DE PARAMÊTRAGE DU FIREWALL ---n" >> /var/log/scripts/parefeu.log
# reinitialisation du firewall...
echo "reinitialisation du firewall" >> /var/log/scripts/parefeu.log
etc...
Dans cet exemple (qui n’est qu’un exemple au plus simple), tu auras le log de l’execution actuelle de ton script + la version de l’execution précédente. Ce n’est pas parfait mais au moins ça pourra aider à débugguer si besoin et c’est une bonne habitude pour tes scripts futurs
Edité le 19/07/2014 à 10:00