• [^] # Re: Une soluce

    Posté par (site web personnel) . En réponse au message iptables + naviguation sur internet + port 80. Évalué à 2.

    Bon, désolé d'avoir semblé un peu abrupt, même si tu l'as noté, ce n'était que de premier abord. Encore désolé.

    M'enfin bon, il fallait bien le décortiquer un peu, ton script, en relevant ligne par ligne, parce que c'est comme ça qu'il faut faire la première fois.

    Souvent, les valeureux débutants de l'iptables trafiquent les lignes de leur script comme autant d'incantations khabalistiques, autant de formules magiques leur apportant gloire et sécurité. Je me suis lancé sur le terrain du raseur constructif (j'aime bien cette définition, elle colle bien au BOFH proactif que je suis à mes heures).

    Bref, lire les scripts des autres permet de découvrir pleins de fonctions d'iptables que l'on ne soupçonnerais pas. Une fois le concept touché du doigt, on pose la bonne idée sur une liste. Une fois les bonnes idées réunies, on les classe par groupe, pour ne rien oublier.

    Ensuite, on pose à plat toutes les interfaces disponibles sur le firewall, à savoir l'interface externe, puis l'interface interne principale. Eventuellement, on pose une ou plusieurs interfaces internes, pour le cas où le firewall devrait gérer plusieurs zones.

    Ensuite, on crée l'architecture de base de ses tables, ainsi que leur articulation.

    Le shéma INPUT-OUTPUT, avec PREROUTING, FORWARD et POSTROUTING se trouve partout. (http://www.c-sait.net/cours/iptables.php)



    #on prend soin de définir la variable IPTABLES="/usr/sbin/iptables"
    #On Flushe tout, on recommence à partir de rien
    $IPTABLES -F
    $IPTABLES -F -t mangle
    $IPTABLES -F -t nat
    $IPTABLES -X
    $IPTABLES -X -t mangle
    $IPTABLES -X -t nat

    #Politique par défaut à DROP, et oui, en bas de chaque table,
    # il y a DROP, si une ligne n'autorise pas, on tombe sur le
    # DROP (refus sans report d'erreur, à la différence de REJECT,
    # qui refuse explicitement la conenxiopn)
    $IPTABLES -P INPUT DROP
    $IPTABLES -P OUTPUT DROP
    $IPTABLES -P FORWARD DROP


    On peut créer une table en plus, comme pour logguer les paquets DROPpés:

    $IPTABLES -N LDROP


    Et on y rajoute quoi faire avec les paquets en question, ici on loggue et on droppe, mais on peut faire d'autres choses. Ici on loggue les paquets TCP, au maximum 2 fois par seconde.

    $IPTABLES -A LDROP -p tcp -m limit --limit 2/s --limit-burst 10 -j LOG --log-prefix "fp=TCP:1 a=DROP "

    Il va de soi qu'on peut coller " -p udp" ou "-p icmp" en plus.

    On vient de créer une tatable à nous, LDROP, vers laquelle on peut jumper quand on veut. on peut en faire pleins comme ça, pour faciliter la lecture du script. Chaque tatable fait bien un truc, que l'on peut appeller souvent.

    Une bonne pratique cool, limiter l'acceptation de paquets d'ouverture de session

    #Logging of possible TCP-SYN-Floods
    $IPTABLES -N LSYNFLOOD
    $IPTABLES -A LSYNFLOOD -m limit --limit 2/s --limit-burst 10 -j LOG --log-prefix "fp=SYNFLOOD:1 a=DROP "
    $IPTABLES -A LSYNFLOOD -j DROP

    #on note le log-prefix qui permet de modifier la ligne
    #s'affichant dans les logs.

    $IPTABLES -N TCPACCEPT
    $IPTABLES -A TCPACCEPT -p tcp --syn -m limit --limit 2/s --limit-burst 10 -j ACCEPT
    $IPTABLES -A TCPACCEPT -p tcp --syn -j LSYNFLOOD
    $IPTABLES -A TCPACCEPT -p tcp ! --syn -j ACCEPT


    On peut créer une table pour faire des choses particulières, puis rendre la main, un peu comme un sous programme, ici pour virer le verbage des partages windows:

    #SMB-Traffic
    $IPTABLES -N SMB

    $IPTABLES -A SMB -p tcp --dport 137 -j DROP
    $IPTABLES -A SMB -p tcp --dport 138 -j DROP
    $IPTABLES -A SMB -p tcp --dport 139 -j DROP
    $IPTABLES -A SMB -p tcp --dport 445 -j DROP
    $IPTABLES -A SMB -p udp --dport 137 -j DROP
    $IPTABLES -A SMB -p udp --dport 138 -j DROP
    $IPTABLES -A SMB -p udp --dport 139 -j DROP
    $IPTABLES -A SMB -p udp --dport 445 -j DROP

    $IPTABLES -A SMB -p tcp --sport 137 -j DROP
    $IPTABLES -A SMB -p tcp --sport 138 -j DROP
    $IPTABLES -A SMB -p tcp --sport 139 -j DROP
    $IPTABLES -A SMB -p tcp --sport 445 -j DROP
    $IPTABLES -A SMB -p udp --sport 137 -j DROP
    $IPTABLES -A SMB -p udp --sport 138 -j DROP
    $IPTABLES -A SMB -p udp --sport 139 -j DROP
    $IPTABLES -A SMB -p udp --sport 445 -j DROP


    Pour résumer, on a fait LDROP, TCPACCEPT, LSYNFLOOD et SMB pour nos besoins.

    Ensuite, on peut peut commencer la table INPUT de base


    #Local IF
    $IPTABLES -A INPUT -i lo -j ACCEPT
    #Kill connections to the local interface from the outside world (--> Should be already catched by kernel/rp_filter)
    $IPTABLES -A INPUT -d 127.0.0.0/8 -j REJECT


    ## On note l'interface sous forme de variable après le -i, de même l'adresse source après le -s
    ##Allow unlimited traffic from internal network using legit addresses to firewall-box
    ##If protection from the internal interface is needed, alter it

    $IPTABLES -A INPUT -i $INTIF -s $INTLAN -j ACCEPT

    #Kill anything from outside claiming to be from internal network (Address-Spoofing --> Should be already catched by rp_filter)
    $IPTABLES -A INPUT -s $INTLAN -j REJECT



    Ensuite, on peut commencer à rajouter les lignes de tables provenant de l'extérieur

    #On commence à virer silencieusement tout le verbage samba
    #Drop all SMB-Traffic
    $IPTABLES -A INPUT -i $EXTIF -j SMB


    On poursuit les autorisations de services tournant sur la linux box

    ##Public services running ON FIREWALL-BOX (comment out to activate):

    # Le protocole FTP a été pensé par des individus toxocophiles
    # abusant de substances mentalocomplexifiantes
    # ftp-data
    #$IPTABLES -A INPUT -i $EXTIF -p tcp --dport 20 -j TCPACCEPT
    # ftp
    #$IPTABLES -A INPUT -i $EXTIF -p tcp --dport 21 -j TCPACCEPT


    FTP est vraiment un protocole qui a trop fumé, pour info, cf:
    http://christian.caleca.free.fr/ftp/les_bases.htm
    http://pintday.org/whitepapers/ftp-review.shtml
    http://www-igm.univ-mlv.fr/~roussel/RESEAUJAVA/tcp.html

    Et la réponse est OUI, c'est chiant à gérer sur un firewall si on ne veut pas avoir tout ouvert en grand. Rassurez vous, il y a pire, H323 par exemple.

    On continue avec les services de base, ssh, mail, DNS, web serveur.


    # ssh
    $IPTABLES -A INPUT -i $EXTIF -p tcp --dport 22 -j TCPACCEPT
    # smtp
    $IPTABLES -A INPUT -i $EXTIF -p tcp --dport 25 -j TCPACCEPT
    # DNS
    $IPTABLES -A INPUT -i $EXTIF -p tcp --dport 53 -j TCPACCEPT
    $IPTABLES -A INPUT -i $EXTIF -p udp --dport 53 -j ACCEPT
    # http
    $IPTABLES -A INPUT -i $EXTIF -p tcp --dport 80 -j TCPACCEPT



    On permet aussi les connexions établies, ce qui permet de redémarrer le firewall sans couper toutes les sessions.


    ##Allow ESTABLISHED/RELATED connections in
    $IPTABLES -A INPUT -i $EXTIF -m state --state ESTABLISHED -j ACCEPT
    $IPTABLES -A INPUT -i $EXTIF -p tcp -m state --state RELATED -j TCPACCEPT
    $IPTABLES -A INPUT -i $EXTIF -p udp -m state --state RELATED -j ACCEPT

    ##Catch all rule
    # On finit par jetter tout le reste
    $IPTABLES -A INPUT -j LDROP


    Là on a finit avec la table INPUT, on poursuit avec la table OUTPUT


    ##Packets TO FIREWALL-BOX ITSELF
    #Local IF
    $IPTABLES -A OUTPUT -o lo -j ACCEPT

    ##Packets TO INTERNAL NET

    #Allow unlimited traffic to internal network using legit addresses
    $IPTABLES -A OUTPUT -o $INTIF -d $INTLAN -j ACCEPT

    ##Packets TO EXTERNAL NET
    ##Silent Drops/Rejects (Things we don't want in our logs)
    #SMB
    $IPTABLES -A OUTPUT -o $EXTIF -j SMB

    ##Public services running ON FIREWALL-BOX (comment out to activate):

    # ftp-data
    $IPTABLES -A OUTPUT -o $EXTIF -p tcp --sport 20 -j ACCEPT

    # ftp
    $IPTABLES -A OUTPUT -o $EXTIF -p tcp --sport 21 -j ACCEPT

    # ssh
    $IPTABLES -A OUTPUT -o $EXTIF -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

    # smtp
    $IPTABLES -A OUTPUT -o $EXTIF -p tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT

    # DNS
    $IPTABLES -A OUTPUT -o $EXTIF -p tcp --sport 53 -j ACCEPT
    $IPTABLES -A OUTPUT -o $EXTIF -p udp --sport 53 -j ACCEPT

    # http
    #$IPTABLES -A OUTPUT -o $EXTIF -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT


    Pour finir, on interdit le reste qui ne soit pas explicitement autorisé


    ##Catch all rule

    $IPTABLES -A OUTPUT -j LDROP



    Enfin, on s'occupe de la table de forward


    ##Filtering FROM INTERNAL NET


    ##Silent Drops/Rejects (Things we don't want in our logs)
    #SMB
    $IPTABLES -A FORWARD -o $EXTIF -j SMB

    #On traloque les ports que l'on veut, ici le http, caché derrière le fw sur une autre machine, par exmeple.
    #Port-Forwarding from Ports < 1024 [outbound] (--> Also see chain PREROUTING)
    #HTTP-Forwarding
    #$IPTABLES -A FORWARD -o $EXTIF -s $HTTPIP -p tcp --sport 80 -j ACCEPT

    ##Filtering FROM EXTERNAL NET


    ##Silent Drops/Rejects (Things we don't want in our logs)

    #SMB
    $IPTABLES -A FORWARD -i $EXTIF -j SMB


    ##Allow replies coming in
    $IPTABLES -A FORWARD -i $EXTIF -m state --state ESTABLISHED -j ACCEPT
    $IPTABLES -A FORWARD -i $EXTIF -p icmp -m state --state RELATED -j ACCEPT


    ##Port-Forwarding [inbound] (--> Also see chain PREROUTING)

    #HTTP-Forwarding
    #$IPTABLES -A FORWARD -i $EXTIF -p tcp -d $HTTPIP --dport 80 -j ACCEPT

    ##Catch all rule/Deny every other forwarding

    $IPTABLES -A FORWARD -j LDROP





    ################
    ## PREROUTING ##
    ################

    ##Port-Forwarding (--> Also see chain FORWARD)
    # On aura pris soin de définir les variables, comme l'interface EXTIF externe, avec son ip publique EXTIP, ainsi que l'adresse inerne du serveur wouaibe HTTPIP
    ##HTTP
    #$IPTABLES -A PREROUTING -t nat -i $EXTIF -p tcp -d $EXTIP --dport 80 -j DNAT --to $HTTPIP


    Et mainenant, la ligne qui permet la magie du NAT, le partage de connexion


    ###################
    ## POSTROUTING ##
    ###################

    #Masquerade from Internal Net to External Net
    $IPTABLES -A POSTROUTING -t nat -o $EXTIF -j MASQUERADE



    Voilà, si vous avez suivi jusqu'ici, vous pouvez adapter http://www.linuxguruz.com/iptables/scripts/rc.firewall_023.t(...) à vos besoins. L'architecture en est simple et élégante.

    Rafael