Toi aussi, configure ton iptables comme un sauvage :)

Il y a des moments où on est pressé, où on a pas envie de réflechir trop longtemps, de se faire des noeuds au cerveau pour configurer son firewall…

L’avantage, c’est que sous linux, avec iptables (bientôt deprecated au passage, au profit de nftables (wiki, howto)), on peut jouer au parano en quelques minutes.

Le besoin

 » – Bouchard, dépéchez vous, on a mis en prod’ un nouveau serveur, vous me bloquez tout le trafic tcp/udp sur l’interface publique! »

 » – Tout le trafic chef? »

 » – Réflechissez Bouchard! Vous me laissez les ports de base (20/21,22,80,443) en tcp! »

 » – Chef, oui chef! »

La conf

Bon, on fait vite :

On autorise les sessions établies :

iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

 

On autorise le trafic sur les ports des applicatifs utilisés

iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

On bloque toutes les autres communications

 iptables -A INPUT -j DROP

On vérifie tout ça

root@monsuperserveur:/# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
ACCEPT tcp -- anywhere anywhere tcp dpt:http
ACCEPT tcp -- anywhere anywhere tcp dpt:https
DROP all -- anywhere anywhere

 » – C’est bon chef! »

 » – Bravo Bouchard! »

Un peu de finesse dans ce monde de brutes

Maintenant que le chef est parti, un peu de finesse s’impose.

Spécifier l’interface sur laquelle on applique la règle

Rien de plus simple, on introduit le paramètre -i suivi du nom de l’interface, dans une règle précise.

 iptables -A INPUT -i eth0 -p tcp --dport 443 -j ACCEPT
Débloquer le trafic sur une interface précise

Par défaut, une règle ajoutée via iptables se mets en fin de liste. L’autre comportement par défaut du firewall est que les paquets sont filtrés dans l’ordre des règles.

Si on débloque le trafic via une règle tapée après toutes les autres règles de blocage, les paquets ne passeront jamais…

La solution, c’est d’introduire une règle en lui spécifiant qu’elle doit être en position 1.

iptables -I INPUT 1 -i lo -j ACCEPT

Pour vérifier l’effet, rien de plus simple :

root@monsuperserveur:/# iptables -L -v
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target prot opt in out source destination
10695 1915K ACCEPT all -- lo any anywhere anywhere
25871 2047K ACCEPT all -- any any anywhere anywhere ctstate RELATED,ESTABLISHED
 31 1860 ACCEPT tcp -- any any anywhere anywhere tcp dpt:ssh
 16 888 ACCEPT tcp -- any any anywhere anywhere tcp dpt:http
 54 2748 ACCEPT tcp -- any any anywhere anywhere tcp dpt:https
16460 1989K DROP all -- any any anywhere anywhere
 Logguer le trafic

Pour une raison ou une autre, on peut vouloir logguer le trafic et le remonter vers un syslog, serveur ou non.

iptables -I INPUT 5 -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
Backup & restauration

Deux commandes magiques :

iptables-save > /mon/chemin/de/fichier 
iptables-restore < /mon/chemin/de/fichier
Le scripting

Au prochain redémarrage de la machine, Bouchard sera bien embêté : la configuration sera perdue…

Pour éviter ça, et avec les commandes vues au dessus, on fait des scripts de sauvegarde/restauration, respectivement dans /etc/network/if-pre-up.d et /etc/network/if-post-down.d

#!/bin/sh
iptables-restore < /etc/iptables.rules
exit 0
#!/bin/sh
iptables-save > /etc/iptables.rules
exit 0

Allez Bouchard, au boulot!

Source

Laisser un commentaire