Lenny routeur

:005

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 :041

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 :075

Bon, voici ce que je pense qui cloche dans ton script iptables :

  • D’abord initialiser les politiques par défaut AVANT de vider les règles et les chaînes (pour pas qu’il y ait de laps de temps durant lequel le pare feu est une passoire) :
# 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.

  • Pour les règles de port forwarding, tu n’es pas obligé de préciser le port de destination lorsque celui ci ne change pas : Ex :
    iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 5962 -j DNAT --to-destination 192.168.10.3:5962
    Tu peux écrire : iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 5962 -j DNAT --to-destination 192.168.10.3

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 :087

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

adresse IP de l’interface exterieure

IP_EXT=192.168.1.1

interface interieure

IF_INT=eth1

adresse IP de l’interface interieure

IP_INT=192.168.10.1

(re)initialisation de la table FILTER (utilisee)

politiques par defaut des chaines : bloquer

iptables -t filter -P INPUT DROP
iptables -t filter -P FORWARD DROP
iptables -t filter -P OUTPUT DROP

Supression des regles existantes

iptables -t filter -F

Supression des chaines utilisateur existantes

iptables -t filter -X

(re)initialisation de la table NAT (utilisee)

politiques par defaut des chaines : accepter

iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
iptables -t nat -P POSTROUTING ACCEPT

Supression des regles existantes

iptables -t nat -F

Supression des chaines utilisateur existantes

iptables -t nat -X

test et reinitialisation de la table MANGLE si existe (non utilisee)

if grep -q mangle /proc/net/ip_tables_names
then

politiques par defaut des chaines : accepter

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

Supression des regles existantes

iptables -t mangle -F

Supression des chaines utilisateur existantes

iptables -t mangle -X
fi

test et reinitialisation de la table RAW si existe (non utilisee)

if grep -q raw /proc/net/ip_tables_names
then

politiques par defaut des chaines : accepter

iptables -t raw -P PREROUTING ACCEPT
iptables -t raw -P OUTPUT ACCEPT

Supression des regles existantes

iptables -t raw -F

Supression des chaines utilisateur existantes

iptables -t raw -X
fi

autorise les paquets appartenant ou lies aux connexions existantes

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

autorise le trafic en entree et sortie sur l’interface de loopback

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -i lo -j ACCEPT

autorise les connexions en sortie depuis la machine

iptables -A OUTPUT -m state --state NEW -j ACCEPT

autorise le ping ICMP en entree vers la machine

iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

autorise les connexions en entree depuis l’interieur vers la machine

iptables -A INPUT -i $IF_INT -m state --state NEW -j ACCEPT

autorise les connexions SSH en entree vers la machine

iptables -A INPUT -m state --state NEW -p tcp --dport 22 -j ACCEPT

(idem pour les autres ports TCP/UDP et protocoles a autoriser)

rejeter les autres paquets vers la machine

iptables -A INPUT -j REJECT

autorise les connexions en transit de l’interieur vers l’exterieur

iptables -A FORWARD -i $IF_INT -o $IF_EXT -m state --state NEW -j ACCEPT

masquerading/NAT source des connexions vers l’exterieur

iptables -t nat -A POSTROUTING -o $IF_EXT -j SNAT --to $IP_EXT

redirections de port de l’exterieur vers l’interieur

iptables -t nat -A PREROUTING -i $IF_EXT -p tcp --dport 6022 -j DNAT --to-destination 192.168.10.2:22

autorisation des connexions en transit redirigees de l’exterieur vers l’interieur

iptables -A FORWARD -i $IF_EXT -m state --state NEW -d 192.168.10.2 -p tcp --dport 22 -j ACCEPT

(idem pour les autres ports TCP/UDP et protocoles a rediriger)

[/code]

Bonjour,

Merci je vais regarder cela de plus près et … :slight_smile: