2 votes

IPTables Plages IP sources ou destinations multiples ?

Premier message sur ServerFault donc je vais essayer de bien le faire :)

J'ai plusieurs environnements (par exemple, prod, dev, test, etc) et j'essaie d'écrire le fichier IPTables pour mes serveurs RHEL 6.6 qui permet de faire communiquer des groupes spécifiques de machines entre ces environnements sur des ports définis.

Initialement, avoir les règles pour chaque destination différente ou sous-réseau source définis sur sa propre ligne fonctionnait - cependant le fichier IPTables résultant est assez volumineux. Dans une tentative de simplifier/nettoyer l'ensemble des règles j'ai essayé de combiner des règles pour plusieurs adresses IP sources ou destinations utilisant les mêmes ports.

J'ai trouvé un article pertinent sur ServerFault sur le sujet IPTables Multiple Source IPs mais l'exemple le mieux noté ne semble pas fonctionner pour moi.

Par exemple, en essayant de combiner les deux règles suivantes :

-A INPUT  -i $INTERFACE -m conntrack --ctstate NEW,ESTABLISHED,RELATED -s $CV1 -p tcp --dport 8400:8403 -j ACCEPT -m comment --comment "Source 1"
-A INPUT  -i $INTERFACE -m conntrack --ctstate NEW,ESTABLISHED,RELATED -s $CV2 -p tcp --dport 8400:8403 -j ACCEPT -m comment --comment "Source 2"

En cela :

-A INPUT  -i $INTERFACE -m conntrack --ctstate NEW,ESTABLISHED,RELATED -s $CV1,$CV2 -p tcp --dport 8400:8403 -j ACCEPT -m comment --comment "Not Working!"

J'ai aussi des règles qui mélangent à la fois des adresses IP source multiples et des adresses IP destination multiples (sans succès également) :

-A INPUT  -i $INTERFACE -s $FOO1,$FOO2 -d $FOO1,$FOO2 -p tcp --dport 8400:8403 -j ACCEPT
-A OUTPUT -o $INTERFACE -s $FOO1,$FOO2 -d $FOO1,$FOO2 -p tcp --dport 8400:8403 -j ACCEPT

Remarque : Le fichier /etc/sysconfig/iptables est écrit par mon script de configuration personnalisé (d'où les variables $), avec les adresses IP définies de cette manière :

CV1=10.1.1.0/27
CV2=10.25.128.128/29
FOO1=10.1.30.140/30
FOO2=10.2.30.140/30

Les échecs de trafic sont détectés par les règles de rejet/journalisation en bas du fichier IPTables :

-A INPUT   -i $INTERFACE -m limit --limit 5/m --limit-burst 7 -j LOG --log-prefix "Packet Rejected. "
-A FORWARD -i $INTERFACE -m limit --limit 5/m --limit-burst 7 -j LOG --log-prefix "Packet Forward Rejected. "
-A OUTPUT  -o $INTERFACE -m limit --limit 5/m --limit-burst 7 -j LOG --log-prefix "Packet Dropped. "
-A INPUT   -i $INTERFACE -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -i $INTERFACE -j REJECT --reject-with icmp-host-prohibited
-A OUTPUT  -o $INTERFACE -j REJECT --reject-with icmp-host-prohibited

En me référant à l'entrée de la page de manuel IPTables, il semble que cela devrait fonctionner :

[!] -s, --source address[/mask][,...]

Spécification de source. L'adresse peut être un nom de réseau, un nom d'hôte, une adresse IP de réseau (avec /masque), ou une adresse IP simple. Les noms d'hôtes seront résolus une seule fois, avant que la règle soit soumise au noyau. Notez que spécifier un nom à résoudre avec une requête distante comme DNS est une très mauvaise idée. Le masque peut être un masque de réseau ou un nombre simple, spécifiant le nombre de 1 à gauche du masque réseau. Ainsi, un masque de 24 équivaut à 255.255.255.0. Un argument "!" avant la spécification de l'adresse inverse le sens de l'adresse. Le drapeau --src est un alias pour cette option.
Plusieurs adresses peuvent être spécifiées, mais cela se traduira par plusieurs règles (lors de l'ajout avec -A), ou causera la suppression de plusieurs règles (avec -D).

[!] -d, --destination address[/mask][,...]

Spécification de destination. Voir la description du drapeau -s (source) pour une description détaillée de la syntaxe. Le drapeau --dst est un alias pour cette option.

Quelqu'un pourrait-il m'éclairer sur ce que je fais de mal ici ?

2voto

Rick75230 Points 11

J'ai copié votre première règle iptables combinée dans ma boîte Ubuntu et cela a fonctionné pour moi :

iptables -A INPUT -i wlan0 -m conntrack --ctstate NEW,ESTABLISHED,RELATED -s 172.16.10.0/24,172.16.9.0/24 -p tcp --dport 8400:8403 -j ACCEPT -m comment --comment "Working! :)"

Je n'ai reçu aucune sortie après cette commande, ce qui signifie que c'est un succès. J'ai également exécuté votre commande multi-source-destination avec succès :

iptables -A INPUT -i wlan0 -s 172.16.10.0/24,172.16.9.0/24 -d 172.16.10.0/24,172.16.9.0/24 -p tcp --dport 8400:8403 -j ACCEPT

Les seules modifications que j'ai apportées à vos commandes étaient pour l'interface et les réseaux sources, car je n'ai pas utilisé de script pour tester vos commandes.

Vous avez publié vos variables réseau dans votre question, mais n'avez pas publié votre variable $INTERFACE. Est-elle absente du script ? Ou peut-être inaccessible si ce script est séparé du script dans lequel la variable est déclarée ?

Quelle est la sortie lorsque vous exécutez votre script iptables avec les règles source/destination combinées ?

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