Forum Astuces.divers [Admin] firewall iptables minimal, mais efficace

Posté par  .
Étiquettes : aucune
0
16
mai
2005
Voici un firewall iptables minimal, mais efficace, pour un ordinateur qui ne fait tourner aucun serveur et qui n'est pas un routeur (certains P2P sont assimilables à des serveurs si on n'active pas leur option "firewall" ). Ce script peut bien-sûr être enrichi par la suite. Il doit être lancé automatiquement à chaque boot, avant le lancement des programmes utilisables depuis internet.


#! /bin/sh
iptables -P INPUT DROP
iptables -F INPUT
iptables -A INPUT -m state --state established -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT

iptables -P FORWARD DROP
iptables -F FORWARD

iptables -P OUTPUT ACCEPT
iptables -F OUTPUT

C'est tout.

Explications :
-P fixe le comportement (Policy) par défaut
-F efface les règles précédentes, s'il y en avait (Flush)
-A ajoute (Add) une règle

-m state --state established précise que cette règle ne concerne que les connexions déjà établies (utilisation du module state)

-i lo précise que cette règle concerne l'interface locale (lo), c'est à dire pour les communications entre 2 programmes de la même machine.

Voici un enrichissement élémentaire, pour aller plus loin :
iptables -A INPUT -p tcp --dport ssh -j ACCEPT pour autoriser les connexions depuis l'extérieur vers un serveur local, ici le port est celui de ssh (équivalent à 22 en chiffres)

Un enrichissement plus compliqué : voici l'ajout du NAT/masquerading pour en faire un routeur/firewall internet pour un réseau local : (remplacer eth0 par l'interface de votre réseau local, et ppp0 par votre interface internet)
iptables -A FORWARD -m state --state established -j ACCEPT
iptables -A FORWARD -i eth0 -j ACCEPT
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
echo 1 >/proc/sys/net/ipv4/ip_forward

  • # petit oubli: flush NAT

    Posté par  . Évalué à 3.

    Il vaut mieux vider la table NAT avant de s'en servir, on ne sait jamais.
    la fin de l'astuce devient donc:
    iptables -A FORWARD -m state --state established -j ACCEPT
    iptables -A FORWARD -i eth0 -j ACCEPT
    iptables -t nat -F POSTROUTING
    iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
    echo 1 >/proc/sys/net/ipv4/ip_forward
  • # mieux?

    Posté par  . Évalué à 1.

    là je pense que tu autorises l'ack tunneling (quoique moi aussi dans l'exemple que je fais je pense que je l'autorise :).

    certes ton exemple est simple, mais rapport aux clients sortants, le script ne sert à rien.

    à la ligne iptables -A INPUT -m state --state established -j ACCEPT

    je met comme toi: iptables -A INPUT -m state --state established -j ACCEPT
    mais aussi: iptables -A OUTPUT -m state --state NEW,ESTABLISHED -j ACCEPT

    le mieux est de préciser via -o pour l'output et -i pour l'input l'interface précisement ciblée. (ppp0 ou eth0)
    C'est ce point, avec le fait de préciser les ports, qui sécurisent "vraiment".

    l'objectif etait le simple, mais cela n'empeche pas :

    # news (wanadoo)
    iptables -A OUTPUT -o eth0 -p tcp -m state --state NEW,ESTABLISHED -d 193.252.117.183 --dport 119 -j ACCEPT
    iptables -A INPUT -i eth0 -p tcp -m state --state ESTABLISHED -s 193.252.117.183 --sport 119 -j ACCEPT

    car je suis recemment en dhcp via mon provider donc j'appliques ça sur eth0, avant c'etait pppoe donc ppp0. 119=port des newsgroups
    tcp car c'est du mode connecte. dport destination port.. s source addresse..

    un truc sympa :

    iptables -A OUTPUT -o eth0 -p tcp -m owner --cmd-owner bash -j ACCEPT
    autorisera n'importe quel processus s'intitulant bash à sortir par eth0 (noyaux recents) :p en tcp pour l'input il faut voir au port bien sûr, sous windows ce genre de choses est completement fait...artis(anal)ement (buffering.."intelligent")car on sait juste ip:port pour l'input.
  • # Attention au conntrack

    Posté par  . Évalué à 2.

    J'ajouterais une précision qui peut être utile, ajouter la ligne suivante permet d'éviter de faire un full sur sa table conntrack... La limite est définit dans /proc/sys/net/ipv4/ip_conntrack_max, un DoS (volontaire ou involontaire) peut se faire en atteignant ce seuil. Le résultat d'un full dans cette table est dans syslog (dmesg): "ip_conntrack: table full, dropping packet.", et le seul moyen pour résoudre ce problème est de décharger le module ip_conntrack quand cela est possible, sinon reboot :°|
    echo $((24*3600)) >/proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
    (Ici une journée pour le timeout)

    On peut augmenter la taille de la table ainsi:
    echo 32760 >/proc/sys/net/ipv4/ip_conntrack_max
    Pour calculer la bonne taille pour une machine: http://www.wallfire.org/misc/netfilter_conntrack_perf.txt(...)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.