Un peu (bcp?) d'aide pour mon premier iptables

Bonjour à tous

J’ai récolté ici et là divers informations pour la création d’un fichier de règles iptables mais je suis assez septique sur la qualité de mon fichier !
La topologie de mon réseau de test est la suivante :
Un modem/routeur qui vient dans l’interface eth0 de mon firewall.
Je ressors de ce firewall par eth1 dans un switch derrière lequel se trouve un serveur NAS et un client banal …
Sur le firewall, tourne un service DHCP, DNS, SSH, Webmin.
Sur le serveur NAS, tourne un service Apache, FTP, MySQL et Samba

Le fichier actuel est disponible http://dl.free.fr/getfile.pl?file=/3yVAVB3l/firewall.txt

Le firewall est sur Debian Etch

Merci pour vos prochains avis :smiley:

Première réaction : c’est un gruyère (gros trou à cause des règles DNS), il y a quelques incohérences et on peut faire avec deux fois moins de règles.
Les détails demain, là je suis trop fatigué.

LOL ça part fort mais en même temps j’en avais bien l’impression !

Tout d’abord un rectificatif : j’ai été injuste, le vrai gruyère n’a pas de trous.

Pourquoi ignorer tous les ICMP echo requests (ping) ? C’est se priver d’un outil qui peut être bien utile pour diagnostiquer des problèmes.

[code]# Nous faisons de meme avec toutes les autres tables,

a savoir “nat” et “mangle”,[/code]

Je ne vois pas les commandes de réinitialisations de la table “mangle”.

[code]######################################################################

G E S T I O N M A C H I N E L O C A L E

######################################################################
[…]
iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 -j DNAT --to-destination 192.168.1.100:80[/code]
Que vient faire cette règle de redirection de port dans cette section ?

#on permet toutes les liaisons firewall-LAN #iptables -A INPUT -i eth0 -m state --state ESTABLISHED -j ACCEPT #iptables -A OUTPUT -o eth0 -m state --state NEW,ESTABLISHED -j ACCEPT
Je croyais que eth0 était l’interface internet ?

#On permet l'utilisation de VNC iptables -A INPUT -i eth0 -p tcp --sport 5900 -m state --state ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --dport 5900 -m state --state NEW,ESTABLISHED -j ACCEPT
Ces règles sont redondantes avec les précédentes.
Le commentaire devrait préciser qu’il s’agit de VNC sortant.

# Resolution DNS pour le firewall iptables -A INPUT -i eth0 --protocol udp --source-port 53 -j ACCEPT iptables -A OUTPUT -o eth0 --protocol udp --destination-port 53 -j ACCEPT iptables -A INPUT -i eth0 --protocol tcp --source-port 53 -j ACCEPT iptables -A OUTPUT -o eth0 --protocol tcp --destination-port 53 -j ACCEPT
Question pratique : que se passe-t-il si j’envoie un paquet TCP ou UDP vers n’importe quel port destination depuis le port source 53 ? Gagné, ces règles l’acceptent sans rechigner ainsi que la réponse que va gentiment faire ta machine. Pour l’empêcher, il faut utiliser le suivi de connexion comme dans les autres règles.
Ceci s’applique également aux règles relatives à la résolution DNS du LAN.

[code]# On permet toutes les connexions sur le LAN depuis le firewall
iptables -A INPUT -i eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -o eth1 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

On permet toutes les connexions sur le firewall depuis le LAN

iptables -A INPUT -i eth1 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT[/code]
Il y a de la redondance, on peut obtenir le même résultat en deux règles.

# connexions Firewall-Internet (www) iptables -A OUTPUT -p tcp --dport 80 -o eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -p tcp --dport 443 -o eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p tcp --sport 80 -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p tcp --sport 443 -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
L’état RELATED n’existe pas pour les protocoles “simples” (du point de vue des flux) comme HTTP, POP, IMAP, SMTP… Il n’existe que pour les messages d’erreur ICMP et les flux de données séparés de protocoles “complexes” comme FTP, TFTP, SIP, H.323…
On peut combiner les deux ports dans une seule règle avec la correspondance “-m multiport --{d,s}ports 80,443” au lieu de --{d,s}port.
Cette remarque s’applique aussi aux règles relatives aux connexions web LAN-internet.

# connexions LAN-Internet (ftp) iptables -A FORWARD -p tcp --dport 21 -i eth1 -o eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -p tcp --sport 21 -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -p tcp --sport 20 -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -p tcp --dport 20 -i eth1 -o eth0 -m state --state ESTABLISHED -j ACCEPT
L’état RELATED n’existe pas pour un paquet d’une connexion de commande FTP (port 21). Il n’existe que pour le premier paquet de la connexion de données, si le module de suivi de connexion FTP est chargé (ip_conntrack_ftp ou nf_conntrack_ftp).
Ces règles n’autorisent que les connexions de données en mode actif, pas celle en mode passif contrairement aux règles plus bas.

# Ouverture pour le ftp (actif) [...] iptables -A INPUT -i eth0 -p tcp --sport 1024:65535 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 1024:65535 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT
Contrairement à ce qu’indique le commentaire, ces règles acceptent aussi les connexions de données FTP en mode passif. Bonne gestion des états.

# Ouverture pour le serveur ssh iptables -A OUTPUT -o eth0 -p tcp --sport 22 -j ACCEPT iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
Il manque la gestion des états. Sans cela ces règles permettent théoriquement d’établir des connexions TCP vers n’importe où à partir du port local 22 (certes pour cela il faudrait la complicité du démon SSH).

Autres remarques :

  • Utiliser des variables avec des noms explicites dans les règles plutôt que les noms des interfaces améliore la lisibilité et la maintenabilité du script.

LAN=eth1 NET=eth0 iptables -A FORWARD -i $LAN -o $NET ...

  • Il serait préférable d’autoriser les messages d’erreur ICMP qui sont dans l’état RELATED, les bloquer peut causer des problèmes de connectivité.

  • Tu gères le suivi de connexion séparément pour chaque type de flux avec des règles spécifiques. Ce n’est pas nécessaire et alourdit inutilement le script. Le plus souvent on se contente d’une règle générique en début de chaîne acceptant les paquets ESTABLISHED et RELATED car un paquet ne peut être dans ces états que si le paquet NEW correspondant a été accepté. Ainsi les autres règles n’ont plus qu’à s’occuper des paquets NEW. Et en bonus ça s’occupe tout seul des messages d’erreur ICMP. Voici un petit exemple où j’en profite pour montrer comment on peut “factoriser” des critères de correspondances communs à plusieurs règles grâce à des chaînes utilisateur afin d’alléger les règles.

# suivi de connexion
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# chaîne utilisateur des connexions sortantes vers internet
iptables -N out_net
iptables -A OUTPUT -o $NET -m state --state NEW -j out_net

# requêtes DNS sortantes
iptables -A out_net -p udp --dport 53 -j ACCEPT
iptables -A out_net -p tcp --dport 53 -j ACCEPT

# chaîne utilisateur des connexions entrantes depuis internet
iptables -N in_net
iptables -A INPUT -i $NET -m state --state NEW -j in_net

# connexions SSH entrantes
iptables -A in_net -p tcp --dport 22 -j ACCEPT

# connexions de commande FTP entrantes (le suivi de connexion s'occupe du reste)
iptables -A in_net -p tcp --dport 21 -j ACCEPT

Tu peux éventuellement continuer à gérer l’état RELATED au cas par cas (types ICMP, connexions FTP en mode actif et passif…)

  • Il ne manquerait pas du masquerading (NAT source) pour les connexions du LAN vers internet si le LAN est en adressage privé ? Ou bien le modem-routeur fait déjà le NAT et a une route de retour vers le bloc d’adresses du LAN ?

Code:
######################################################################

G E S T I O N M A C H I N E L O C A L E

######################################################################
[…]
iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 -j DNAT --to-destination 192.168.1.100:80

Que vient faire cette règle de redirection de port dans cette section ?

Mon modem/routeur est en 10.10.10.x et le LAN en 192.168.1.x sur lequel tourne un serveur web.
Dans ce modem/routeur, je ne peux effectuer une redirection de port que sur les adresses de la même classe que le routeur.
Hors le serveur web est en 192.168.1.x, avec cette règle il est joinable …

Ce script iptables a été généré en ligne sur le site de canonne.net parce que je n’y connais pas grand chose à iptables !
Mais là ça en fou un coup LOL parce que je ne peut plus trop compter dessus donc …

Merci de tous les avis donnés sur ce script, je ne sais pas trop comment je vais m’y prendre maintenant :laughing:

Personne pour m’aider à commencer un script sain adapté à ma configuration, tout au moins pour DNS(Bind9) et apache ?

Plus je lis de tuto, plus je m’embrouille car parfois basique, parfois trop fin .

:wink:

Je veux bien te donner un coup de main, mais il faut que tu spécifies quels flux client->serveur sont autorisés :

  • en sortie du firewall vers internet
  • en sortie du firewall vers le LAN
  • en entrée d’internet vers le firewall
  • en entrée du LAN vers le firewall
  • en transit d’internet vers le LAN
  • en transit du LAN vers internet

Les redirections de ports d’internet vers des machines du LAN.
Faut-il du masquerading sur l’interface internet ?

[quote=“PascalHambourg”]Je veux bien te donner un coup de main, mais il faut que tu spécifies quels flux client->serveur sont autorisés :

  • en sortie du firewall vers internet
  • en sortie du firewall vers le LAN
  • en entrée d’internet vers le firewall
  • en entrée du LAN vers le firewall
  • en transit d’internet vers le LAN
  • en transit du LAN vers internet

Les redirections de ports d’internet vers des machines du LAN.
Faut-il du masquerading sur l’interface internet ?[/quote]

Je ne suis pas sûr de pouvoir répondre à tout cela … :laughing:
Je vais t’envoyer un MP afin de ne pas laisser trainer des infos sur la topologie du (modeste) réseau

D’ore et déjà merci

Comme la fosse? :wink:
MP pour notre bon Ricardo, défenseur de la langue française: “Alors Ricardo, tu dors?”

ibulldog, tu n’as pas à craindre de dévoiler l’architecture de ton réseau. Si ton FW est bien fait, et nul doute qu’avec l’aide de PascalHambourg il ne devienne pas, il ne risquera rien. Et pour nous, il serait intéressant de suivre un fil qui promet d’être intéressant. Et puis, de toutes les façons, on ne sais pas où se trouve ton réseau.

PascalHambourg semble effectivement largement compétent dans ce domaine, ça ne fait pas de doute !

J’ai recommencé mon fichiers, en définissant des variables comme le proposait PascalH, et j’en suis là :
######################################################################

D E F I N I T I O N D E V A R I A B L E S

######################################################################
WAN=eth0
LAN=eth1
IPTABLES=/usr/sbin/iptables
MODPROBE="/sbin/modprobe -k"
######################################################################

I N I T I A L I S A T I O N R E S E A U / K E R N E L

######################################################################

affiche GREEN "+ activation du forwarding"
echo 1 > /proc/sys/net/ipv4/ip_forward

#####################################################################################

I N I T I A L I S A T I O N D E S C H A I N E S

#####################################################################################

Initialise la table Filter (par defaut tous les echanges sont refuses)

affiche GREEN “+ Initialisation de la table Filter”
$IPTABLES -t filter -F
$IPTABLES -t filter -X
$IPTABLES -t filter -P INPUT DROP
$IPTABLES -t filter -P FORWARD DROP
$IPTABLES -t filter -P OUTPUT DROP

#####################################################################################

C H A R G E M E N T D E S M O D U L E S D E S U I V I D E C O N N E C T I O N

#####################################################################################

affiche GREEN “+ chargement des modules ip_conntrack, …”
/sbin/depmod -a

$MODPROBE ip_tables
$MODPROBE ip_conntrack
$MODPROBE iptable_filter
$MODPROBE iptable_mangle
$MODPROBE iptable_nat
$MODPROBE ipt_LOG
$MODPROBE ipt_limit
$MODPROBE ipt_state

####################################################################################

G E S T I O N M A C H I N E L O C A L E

####################################################################################

Nous considerons que la machine elle meme est secure

et que les processus locaux peuvent communiquer entre eux

via l’interface locale :

$IPTABLES -A INPUT -i lo -j ACCEPT
$IPTABLES -A OUTPUT -o lo -j ACCEPT

###############################################################################$

G E S T I O N F I R E W A L L

###############################################################################$

$IPTABLES -A INPUT -p tcp -m tcp --dport 20 -j ACCEPT #(ftp)
$IPTABLES -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT #(ftp)
$IPTABLES -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT #(ssh)
$IPTABLES -A INPUT -p tcp -m tcp --dport 53 -j ACCEPT #(DNS)
$IPTABLES -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT #(web)
$IPTABLES -A INPUT -p tcp -m tcp --dport 631 -j ACCEPT #(imprimante)
$IPTABLES -A INPUT -p tcp -m tcp --dport 5222 -j ACCEPT #(XMPP)
$IPTABLES -A INPUT -p tcp -m tcp --dport 5223 -j ACCEPT #(XMPPS)
$IPTABLES -A INPUT -p tcp -m tcp --dport 5269 -j ACCEPT #(XMPP/Server)
$IPTABLES -A INPUT -p tcp -m tcp --dport 8010 -j ACCEPT #(FTP/XMPP)
$IPTABLES -A INPUT -p tcp -m tcp --dport 51413 -j ACCEPT #(torrent)

Tu as un bon tutos sur le forum l’as-tu lu?

Suis en train de lire celui-ci : olivieraj.free.fr/fr/linux/infor … ewall.html

ashgenesis.debian-fr.net/ricardo/iptables/
et aussi
viewtopic.php?f=8&t=1901

merci, je jette un coup d’oeil mais il y a des règles qui me “pertubent” un peu comme celle-ci :

iptables -A INPUT -p tcp -m tcp --dport 20 -j ACCEPT #(ftp)
iptables -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT #(ftp)
iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT #(ssh)
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT #(web)
iptables -A INPUT -p tcp -m tcp --dport 631 -j ACCEPT #(imprimante)

Je vois ce à quoi elles sont destinées mais je ne comprend pas pourquoi il n’est pas indiqué à quelle interface elles s’appliquent.
Si je comprend bien, par exemple la première ajoute une règle qui autorise toute les connections, entrantes, au format TCP, sur le port 20.
Cela serait donc suffisant pour tout le LAN sans spécifier l’interface de sortie du LAN ?

Par les tutos que j’ai lu et l’aide (big) de PHambourg, je souhaitais savoir la différence entre ces deux règles qui pour moi me semblait faire la même chose :

iptables -t filter -A tcp_packet_out -p tcp --dport 22 -j ACCEPT
iptables -t filter -A tcp_packet_in -p tcp --sport 22 -j ACCEPT

ET

iptables -A output_wan_new -p tcp --dport 22 -j ACCEPT
iptables -A input_wan_new -p tcp --dport 22 -j ACCEPT

iptables -t filter -A tcp_packet_out -p tcp --dport 22 -j ACCEPT
iptables -t filter -A tcp_packet_in -p tcp --sport 22 -j ACCEPT

Je suppose que la chaîne utilisateur tcp_packet_out est appelée depuis la chaîne OUTPUT et tcp_packet_in depuis INPUT.
La première règle accepte les paquets TCP émis par la machine à destination du port 22. Il s’agit normalement de paquets envoyés par la machine à un serveur auquel elle est connectée ou tente de se connecter.
La seconde règle accepte les paquets TCP reçus par la machine en provenance du port source 22. Il s’agit normalement de paquets envoyés par un serveur SSH auquel la machine est connectée ou tente de se connecter, mais ça peut être n’importe quoi d’autre. C’est pourquoi un firewall digne de ce nom ne se contente pas de regarder le port source mais se base sur le suivi de connexion pour déterminer si un paquet appartient à une connexion existante autorisée.

iptables -A output_wan_new -p tcp --dport 22 -j ACCEPT
iptables -A input_wan_new -p tcp --dport 22 -j ACCEPT

La première règle accepte les paquets TCP émis par la machine pour créer une nouvelle connexion vers le port 22 d’un serveur. C’est donc une situation où la machine est cliente.
La seconde règle accepte les paquets TCP reçus par la machine pour créer une nouvelle connexion vers son port 22. C’est donc une situation où la machine est serveur.
Les paquets émis et reçus dans le sens retour sont acceptés par d’autres règles relatives au suivi de connexion.

[quote]C’est pourquoi un firewall digne de ce nom ne se contente pas de regarder le port source mais se base sur le suivi de connexion pour déterminer si un paquet appartient à une connexion existante autorisée.
[/quote]

Cela n’étant pas le cas de cette règle ?

Laquelle privilèges tu ?

Je ne sais pas, il faudrait connaître le reste du jeu de règles. J’en profite pour rappeler qu’une règle isolée hors de son contexte n’a pas beaucoup de sens.

Je préfère les jeux de règles basés sur le suivi de connexion plutôt que sur le port source, évidemment.

J’ai oublié de te mentionner que mon serveur se connectait à un server NTP
J’ai tenté d’ajouter cetter règle dans la section “Sortie Firewall-Internet”

NTP

iptables -A output_wan_new -p udp -dport 123 -j ACCEPT

Mais n’a pas l’air d’apprécier le “123”

Bittorrent ne fonctionne pas et le NAS n’est pas joinable.
Pour bittorent, les règles suivantes fcontionnent et j’ai essayé de les traduire avec ta façon de rédiger les règles, mais sans succès
iptables -t filter -A tcp_packet_out -p tcp --dport 6881 -j authorized
iptables -t filter -A tcp_packet_in -p tcp --sport 6881 -j authorized

azureus

iptable -t filter -A tcp_packet_out -p tcp --dport 64433 -j authorized
iptable -t filter -A tcp_packet_in -p tcp --dport 64433 -j authorized

en faisant ceci :

Bittorrent

iptables -A lan_to_wan_new -p tcp --dport 6881:6999 -j ACCEPT

C’est --dport avec deux tirets.

Ces règles fonctionnent ?

Quant au NAS, j’y accède bien en HTTP et FTP, à moins que tu aies changé d’adresse IP et que celui qui l’a récupérée ait aussi un NAS Synology derrière une redirection de port.