un jour si tu veux bien, je voudrais te montrer les 2 miens (un qui fait du routage avancé avec marquage de paquets, et un tout simple sur une station de travail), histoire de me dire ce que tu en penses ![]()
un jour si tu veux bien, je voudrais te montrer les 2 miens (un qui fait du routage avancé avec marquage de paquets, et un tout simple sur une station de travail), histoire de me dire ce que tu en penses ![]()
Je ne suis pas gourou auto-proclamé d’iptables, hein.
Il me faudra le cahier des charges, autrement difficile de donner un avis.
Concernant le jeu de règles de patix, on peut voir des incohérences même sans connaître le cahier des charges.
[quote=“PascalHambourg”]Je ne suis pas gourou auto-proclamé d’iptables, hein.
Il me faudra le cahier des charges, autrement difficile de donner un avis.
Concernant le jeu de règles de patix, on peut voir des incohérences même sans connaître le cahier des charges.[/quote]
Certes (encore que…), mais tu as souvent des remarques pertinentes sur des incohérences qui ne sautent pas aux yeux d’un utilisateur moyen tel que moi, ou au moins pas avant la 30ème relecture du script (et encore)… A l’occasion, je te montrerais, et je te dirais ce que j’ai cherché à faire (ca fonctionne, mais il y a peut être justement des incohérences que je n’ai pas vue, ou dont je n’ai même pas conscience) Mais ca ne presse pas, et maintenant j’arrête de pourrir le fil de patix ![]()
Bon, voici ce que je pense qui cloche dans ton script iptables :
# initialisation de la table FILTER
iptables -t filter -P INPUT DROP
iptables -t filter -P OUTPUT ACCEPT
iptables -t filter -P FORWARD ACCEPT
iptables -t filter -F # Supression de toutes les règles existantes
iptables -t filter -X # Supression de toutes les chaines existantes
# Test et Initialisation de la table NAT
if grep -q nat /proc/net/ip_tables_names
then
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
iptables -t nat -F
iptables -t nat -X
fi
# Test et Initialisation de la table MANGLE
if grep -q mangle /proc/net/ip_tables_names
then
iptables -t mangle -P PREROUTING ACCEPT
iptables -t mangle -P INPUT ACCEPT
iptables -t mangle -P OUTPUT ACCEPT
iptables -t mangle -P FORWARD ACCEPT
iptables -t mangle -P POSTROUTING ACCEPT
iptables -t mangle -F
iptables -t mangle -X
fi
# Test et Initialisation de la table RAW
if grep -q raw /proc/net/ip_tables_names
then
iptables -t raw -P PREROUTING ACCEPT
iptables -t raw -P OUTPUT ACCEPT
iptables -t raw -F
iptables -t raw -X
fi
Dans les politiques par défaut, il faudrait initialiser aussi les tables MANGLE et NAT et RAW (Ex ci dessus)
Rajouter la règle OUTPUT/ACCEPT sur l’interface lo (pas indispensable car OUTPUT est en ACCEPT, mais au cas ou tu décides de changer cette règle plus tard, il n’y aura pas de problème sur lo):
iptables -A OUTPUT -o lo -j ACCEPT
Peut être préciser dans chaque règle l’interface sur laquelle elle s’applique, quitte à doubler une règle destinée aux deux interfaces eth0 et eth1, car si pas précisée, la règle s’applique sur toutes (A confirmer).
Au niveau des règles FTP :
#iptables -A INPUT -p tcp --dport 20 -j ACCEPT <-- Celle ci ne va pas.
Le port 20 = port source des connexions sortant du serveur en mode actif, donc pas besoin de règles INPUT sur port 20/tcp
[color=#FF0000]il faut charger le module de suivi de connexion (nf_conntrack_ftp) et accepter les paquets dans l’état RELATED. Le port source, ce n’est pas fiable. Charger le module de NAT FTP nf_nat_ftp tant qu’on y est, ça permettra aux connexion de données FTP en mode actif passant à travers le routeur d’être redirigées automatiquement.
Si le module de suivi de connexion FTP est chargé le premier paquet d’une connexion de données FTP en mode actif ou passif est classé RELATED, quelle que soit la direction.
[/color]
Explication de la différence actif/passif avec un schéma plutôt bien faite je trouve, ici : slacksite.com/other/ftp.html
Concernant le trafic DNS entrant :
le protocole DNS peut utiliser le transport TCP sur le port 53 pour certains types de requêtes ou lorsque la réponse dépasse une certaine taille.
Mais ces règles ne sont utiles que si le routeur fait tourner un service DNS, or cela n’a pas l’air d’être le cas car le serveur DHCP indique l’adresse des DNS du FAI et non celle du routeur.
Concernant le trafic HTTPS entrant :
iptables -A INPUT -p udp --dport 443 -j ACCEPT <-- cette règle n’est à ma connaissance pas utile pour https, et ouvre une brèche sur le port 443/udp de ton serveur.
Concernant le serveur samba, il me semble qu’il y a une règle inutile :
iptables -A INPUT -p udp --dport 139 -j ACCEPT
Et qu’il en manque une :
iptables -A INPUT -p tcp --dport 445 -j ACCEPT
Si un jour tu décides de passer la politique OUTPUT par défaut à DROP, il faudra autoriser 137/udp et 138/udp en sortie.
Voila voila… J’espère ne pas avoir raconté trop de sottises, je te conseille néanmoins d’attendre d’autres avis/critiques avant d’appliquer aveuglément ce que je t’ai identifié.
EDIT : initialisation des tables améliorée selon le conseil de pascal
EDIT (bis) : en rouge, les corrections de Pascal
Et la table raw, elle pue de la gueule ?
Accessoirement, je suggèrerais une approche plus subtile du nettoyage. En effet si une table n’était pas chargée, elle le sera à coup sûr après les commandes -P, -F ou -X, ce qui est dommage si elle n’est pas utilisée par la suite. Je pense en particulier aux tables nat, mangle et raw qui sont facultatives pour un pare-feu et dont les politiques par défaut sont normalement ACCEPT. Pour éviter cela, tester d’abord si une table est chargée en examinant le contenu de /proc/net/ip_tables_names. Ça pourrait donner quelque chose du genre :
if grep -q <table> /proc/net/ip_tables_names
then
<commandes d'initialisation>
fi
erf, je la connaissais pas ![]()
Bon, j’édite mon post avec l’initialisation de la table raw.
Mes commentaires sur les commentaires (citations en rouge, avec des blocs de citation ça va faire un peu lourd).
- Rajouter la règle OUTPUT/ACCEPT sur l’interface lo (pas indispensable car OUTPUT est en ACCEPT, mais au cas ou tu décides de changer cette règle plus tard, il n’y aura pas de problème sur lo)
Ehm… si la politique par défaut d’OUTPUT devient DROP, il y aura bien d’autres soucis que l’interface de loopback.
- Peut être préciser dans chaque règle l’interface sur laquelle elle s’applique, quitte à doubler une règle destinée aux deux interfaces eth0 et eth1, car si pas précisée, la règle s’applique sur toutes (A confirmer).
Je confirme. Et il vaut mieux se fier à l’interface d’entrée (-i) qu’à l’adresse source.
- Au niveau des règles FTP :
#iptables -A INPUT -p tcp --dport 20 -j ACCEPT <-- Celle ci ne va pas.
Le port 20 = port source des connexions sortant du serveur en mode actif, donc pas besoin de règles INPUT sur port 20/tcp
Je confirme.
Si tu veux à la limite pour le port 20, il faudrait rajouter :
iptables -A OUTPUT -o eth0 -p tcp --sport 20 -j ACCEPT
Non, il faut charger le module de suivi de connexion (nf_conntrack_ftp) et accepter les paquets dans l’état RELATED. Le port source, ce n’est pas fiable. Charger le module de NAT FTP nf_nat_ftp tant qu’on y est, ça permettra aux connexion de données FTP en mode actif passant à travers le routeur d’être redirigées automatiquement.
En passif (si t’en a l’utilité, sinon, laisse tomber), faudrait autoriser une plage de port (définie dans la conf du service ftp) en entrée
Non, si le module de suivi de connexion FTP est chargé le premier paquet d’une connexion de données FTP en mode actif ou passif est classé RELATED, quelle que soit la direction.
- Concernant le trafic DNS entrant :
iptables -A INPUT -p tcp --dport 53 -j ACCEPT <-- cette règle est inutile car ton service dns écoute le port 53/udp uniquement, pas le 53/tcp (donc tu ouvres une brèche sur ce dernier avec cette règle).
Non, le protocole DNS peut utiliser le transport TCP sur le port 53 pour certains types de requêtes ou lorsque la réponse dépasse une certaine taille.
Mais ces règles ne sont utiles que si le routeur fait tourner un service DNS, or cela n’a pas l’air d’être le cas car le serveur DHCP indique l’adresse des DNS du FAI et non celle du routeur.
Bonsoir,
Bon je voie avec un peu de retard les commentaires sur iptables.
Serait il possible d’avoir un exemple complet d’un fichier iptables bien écrit ?
Avec mangle et tout et tout …
pour mieux comprendre et donc mieux faire !
Voici un échantillon de script à peu près propre. A adapter à ses besoins.
Note : Ton script contient la mention “/etc/network/if-pre-up.d/iptables-start”. S’il est effectivement dans /etc/network/if-pre-up.d/, alors il est exécuté à chaque fois qu’une interface est activée avec ifup. Ce n’est pas souhaitable, il vaut mieux l’exécuter une seule fois. Méthode simple : avec une option pre-up sous l’interface de loopback dans le fichier /etc/network/interfaces. Cette interface est en premier dans le fichier donc activée en premier, et en général on ne l’active qu’une seule fois. Méthode plus élaborée : avec un script d’init, voir le sujet pare-feu avec iptables de Ricardo dans le forum trucs & astuces.
[code]# interface exterieure
IF_EXT=eth0
IP_EXT=192.168.1.1
IF_INT=eth1
IP_INT=192.168.10.1
iptables -t filter -P INPUT DROP
iptables -t filter -P FORWARD DROP
iptables -t filter -P OUTPUT DROP
iptables -t filter -F
iptables -t filter -X
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -F
iptables -t nat -X
if grep -q mangle /proc/net/ip_tables_names
then
iptables -t mangle -P PREROUTING ACCEPT
iptables -t mangle -P INPUT ACCEPT
iptables -t mangle -P FORWARD ACCEPT
iptables -t mangle -P OUTPUT ACCEPT
iptables -t mangle -P POSTROUTING ACCEPT
iptables -t mangle -F
iptables -t mangle -X
fi
if grep -q raw /proc/net/ip_tables_names
then
iptables -t raw -P PREROUTING ACCEPT
iptables -t raw -P OUTPUT ACCEPT
iptables -t raw -F
iptables -t raw -X
fi
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -i lo -j ACCEPT
iptables -A OUTPUT -m state --state NEW -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -i $IF_INT -m state --state NEW -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -j REJECT
iptables -A FORWARD -i $IF_INT -o $IF_EXT -m state --state NEW -j ACCEPT
iptables -t nat -A POSTROUTING -o $IF_EXT -j SNAT --to $IP_EXT
iptables -t nat -A PREROUTING -i $IF_EXT -p tcp --dport 6022 -j DNAT --to-destination 192.168.10.2:22
iptables -A FORWARD -i $IF_EXT -m state --state NEW -d 192.168.10.2 -p tcp --dport 22 -j ACCEPT
[/code]
Bonjour,
Merci je vais regarder cela de plus près et … 