Forum Linux.noyau iptables + naviguation sur internet + port 80

Posté par  .
Étiquettes :
0
20
jan.
2006
Salut
Voici mon problème:
J'essaye d'affiner mon firewall, pour naviguer sur internet.

Avec ce firewall, je peux naviguer sur internet sans pbs
#! /bin/sh
iptables -F
iptables -X
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT


Mais j'aimerais l'affiner, et ne permettre l'accés que sur le port 80 (en entrant):

#! /bin/sh
iptables -F
iptables -X
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 80 -m state --state ESTABLISHED,RELATED -j ACCEPT


et là, plus moyen d'accéder à aucun site, ni même à mon modem-routeur ADSL(olitec d'IP 192.168.0.250)....

Bon, je remets l'ancien firewall, me connecte via firefox à mon routeur et je regarde du coup /sys/proc/ip_conntrack pour y voir les ports concernés qd je vais sur internet) :

tcp 6 37 TIME_WAIT src=192.168.0.2 dst=192.168.0.250 sport=2545 dport=80 src=192.168.0.250 dst=192.168.0.2 sport=80 dport=2545 [ASSURED] use=1 mark=0
tcp 6 78 TIME_WAIT src=192.168.0.2 dst=192.168.0.250 sport=2553 dport=80 src=192.168.0.250 dst=192.168.0.2 sport=80 dport=2553 [ASSURED] use=1 mark=0
tcp 6 119 TIME_WAIT src=192.168.0.2 dst=192.168.0.250 sport=2560 dport=80 src=192.168.0.250 dst=192.168.0.2 sport=80 dport=2560 [ASSURED] use=1 mark=0
tcp 6 78 TIME_WAIT src=192.168.0.2 dst=192.168.0.250 sport=2552 dport=80 src=192.168.0.250 dst=192.168.0.2 sport=80 dport=2552 [ASSURED] use=1 mark=0
tcp 6 17 TIME_WAIT src=192.168.0.2 dst=192.168.0.250 sport=2543 dport=80 src=192.168.0.250 dst=192.168.0.2 sport=80 dport=2543 [ASSURED] use=1 mark=0
tcp 6 37 TIME_WAIT src=192.168.0.2 dst=192.168.0.250 sport=2547 dport=80 src=192.168.0.250 dst=192.168.0.2 sport=80 dport=2547 [ASSURED] use=1 mark=0
etc.....


je ne suis pas sûr de mon interprétation de ce fichier, mais j'ai l'impression que mon routeur renvoi des messages à mon ordi sur les ports 2545,2553,2560....
Je croyais qu'en entrant, juste en consultant des pages web, le port de "réception sur mon ordi était 80 ????
Et s'il change tout le temps, est-ce possible de régler mon firewall par ports ?

J'ai consulté plusieurs doc et tutoriaux, mais je n'arrive pas à affiner mon firewall...

Merci de votre aide.

PS : mon ordi a pour IP 192.168.0.2, le modem-routeur 192.168.0.250
  • # sur le serveur

    Posté par  . Évalué à 0.

    le port 80, c'est du coté du serveur.
    Sur le client, c'est aléatoire

    je pense que tu devrai plutot mettre:
    --sport 80


    • [^] # Re: sur le serveur

      Posté par  . Évalué à 1.

      même avec un --sport 80 (en udp et tcp), pas moyen de naviguer sur le net (sur aucun site ni vers mon routeur)

      quid ??
  • # pas la bonne ligne

    Posté par  . Évalué à 2.

    tu ne dois pas autoriser le 80 (sur le sport on est d'accord) dans cette ligne
    car cette ligne concerne les connexions etablies ou relatives à une connexion établie.
    il faut recréer une ligne à l'identique excepté l'état qui doit être à NEW et le sport à 80 sur l'INPUT à insérer avant la ligne des connexions RELATED et ESTABLISHED (car pour avoir un de ces états, une connexion doit être initiée :] ).

    Documente toi sur ce qu'est une connnexion d'un client vers un serveur:port, car tu mélanges port source/destination/fixe/ouvert à la connexion...

    le projet firestarter peut aussi t'aider voir tout faire à ta place.
    http://freshmeat.net/projects/firestarter/
    • [^] # Re: pas la bonne ligne

      Posté par  . Évalué à 1.

      "il faut recréer une ligne à l'identique excepté l'état qui doit être à NEW et le sport à 80 sur l'INPUT "

      Dans ce cas, je pourrai me connecter à son serveur ssh pour peu
      que j'ai un source port à 80.
      • [^] # Re: pas la bonne ligne

        Posté par  . Évalué à 1.

        lors de l'initiation d'une connexion ssh, c'est le port destination qui est connu (22 normalement), le source port est déterminé ("bindé") dynamiquement par le système et normalement au dessus de 1024.

        le cas d'une connexion ssh est autorisé par l'ouverture en sortie du "dport" 22 et l'autorisation des connexions "related" et "established" en entrée. (déjà positionnée lors de la configuration d'autres règles en ayant besoin)
  • # iptables

    Posté par  . Évalué à 3.

    Voilà ce que j'avais chez moi y'a pas longtemps :

    # Allow all output traffic
    iptables -A OUTPUT -m state --state NEW,ESTABLISHED -j ACCEPT

    # Allow input traffic we have established
    iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT

    Allow input HTTP comunications
    iptables -A INPUT -p tcp --dport 80 -j ACCEPT

    et j'ai ca aussi dans mes marques pages mais je ne sais pas ce que ca vaut :
    http://webenic.enic.fr/~vanoudendycke/mise_en_place_firewall(...)

    si ca peut t'aider un peu....

    a+
    Xavier
  • # Une soluce

    Posté par  (site web personnel) . Évalué à 3.

    La première chose, indispensable dès lors qu'on tripote un firewall, c'est de lire un peu la doc. Je regrette de le répéter, mais lire la doc est indispensable.

    Analysons un peu ton script (enfin c'est celui que tu rapportes, il est évident que tu as pompé ça sur le ternet sans rien lire de la doc)

    #1 #! /bin/sh
    #2 iptables -F
    #3 iptables -X
    #4 iptables -P INPUT DROP
    #5 iptables -P OUTPUT ACCEPT
    #6 iptables -A INPUT -i lo -j ACCEPT
    #7 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT


    Après avoir vidé (#2) les chaines, tu les efface (#3). inutile, autant tou t effacer d'emblée, m'enfin c'est pas grave tout le monde fait comme ça c'est plus propre.

    Ligne 4, tu places la règle par défaut à DROP, parfait
    ensuite, tu acceptes tout les paquets en sortie, bon ok.
    La ligne 6 autorise tout trafic sur le loopback, rien que de très logique.

    La ligne 7 autorise toutes les connexions établies. Ca ne fonctionne que si tu ne lances ton script après avoir ouvert ton navigateur. (une fois les connexions établies vers tel ou tel site) Il ya d'autres états (-state) qui seront tous refusés avec ce script. C'est bête comme tout, mais toutes les nouvelles connexions finiront à la trappe. Allons-y, fendons nous d'une petite capture de man iptables.

    --state state
    Where state is a comma separated list of the connection states to match. Possible states are INVALID meaning that the packet could not be identified for some reason which includes running out of memory and ICMP errors which don't correspond to any known connection, ESTABLISHED meaning that the packet is associated with a connection which has seen packets in both directions, NEW meaning that the packet has started a new connection,or otherwise associated with a connection which has not seen packets in both directions, and RELATED meaning that the packet is starting a new connection, but is associated with an existing connection, such as an FTP data transfer, or an ICMP error.


    Après -state vient une liste, séparée par des virgules, des états de connexion à reconnaitre. Les états possibles sont: INVALID pour les paquets ne pouvant pas être indentifiés pour un certaines raisons parmis lesquelles être en panne de mémoire, ainsi que des erreurs ICMP ne correspondant à aucune connexion établie connue, ESTABLISHED pour un paquet associé à une connexion qui a vu passer des paquets dans les 2 directions, NEW pour un paquet qui a débuté une connexion ou sinon associé à une connexion qui n'a pas vu des paquets dans les 2 directions, et enfin RELATED pour un paquet débutant une connexion, mais associé à une connexion existante, comme un transfert de données FTP, ou une erreur ICMP.


    Tu modifies du script avec la ligne

    iptables -A INPUT -p tcp -m tcp --dport 80 -m state --state ESTABLISHED,RELATED -j ACCEPT


    On devine que tu voudrais avoir des connexions entrantes sur ton serveur wouaibe.

    Le problème, enfin les problèmes, c'est que tu ne précises pas de quelle interface tu parles. Netfilter permet une grande précision, dont on peut parfaitement ne pas se servir dans sa totalité, mais un petit peu de précision ne nuit pas... Tu as une interface sur laquelle le ternet est joignable, tu dois la présiser. Une ligne du type

    iptables -INPUT -i eth0_ou_ton_interface_a_toi -p tcp --dport 80 -j ACCEPT
    Comme ça ça devrait le faire.
    Là ça autorise les accès en entrée sur ton serveur wouaibe. Enfin, je dis ça si c'est ça ce que tu veux, parce que ce n'est pas du tout préçi, ce que tu demandes.

    Bref, lis la doc, netfilter le vaut bien. Je sais, c'est chiant, mais ça vaut le coup. Une petite requète del.icio.us: http://del.icio.us/search/?all=iptables

    Sinon, mattes donc firestarter (lien déjà cité) ou bien http://www.linuxguruz.com/iptables/scripts/rc.firewall_023.t(...) pour t'inspirer.

    Rafael
    • [^] # trop loin

      Posté par  . Évalué à -1.

      parce que ce n'est pas du tout préci(sé), ce que tu demandes

      si si

      J'essaye d'affiner mon firewall, pour naviguer sur internet.

      donc c'est le port 80 en destination pour les nouvelles connexions
      et le port 80 en source-port pour les established et related qu sont à autoriser.
      • [^] # Re: trop loin

        Posté par  (site web personnel) . Évalué à 1.

        J'ajouterai que si tu visites des sites sécurisés (en https) il faut penser à inclure des règles pour le port 443 qui seront similiaires à celles pour le port 80.
    • [^] # Re: Une soluce

      Posté par  . Évalué à 2.

      merci pour toutes ces précisions, mais je tiens qd même à signaler que je m'étais documenté avt de poser ma question, et pas qu'un peu:

      olivieraj.free.fr/fr/linux/information/firewall/fw-03-06.html
      http://christian.caleca.free.fr/netfilter/iptables.htm
      (mais effectivement, j'avais abandonné la lecture de man iptables...)

      et je ne donne qu'un extrait de mon firewall, car mes 2 ordis partagent des fichiers avec NFS (dont j'ai "fixé" les ports pour pouvoir régler mon firewall)

      Bref, tout ça pour dire que je n'ai pas pompé un script sans le lire....

      Mais vu l'ampleur de ta réponse, le temps que tu y as passé, et la source d'information qu'elle me procure, non seulement je ne t'en veux absolument pas (même si je me suis senti un peu véxé au début de ton post), et au contraire, je te remercie infiniment !!

      Merci encore
      • [^] # Re: Une soluce

        Posté par  (site web personnel) . É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
        • [^] # Re: Une soluce

          Posté par  . Évalué à 1.

          Merci pour ce nvx post très instructif !

          Dans mon cas, il me manquait le port 53 pour pouvoir naviguer sur le net ( --sport 53), en plus des ports 80 et 443, et du port 21 pour le ftp.
          Pas de tchat pour l'instant, mais ça ne saurait tarder...

          Encore merci
  • # merci à tous...

    Posté par  . Évalué à 2.

    Je vous remercie pour ttes ces précisions, et je me remets au travail aussitôt (lecture de man iptables etc, etc...)

Suivre le flux des commentaires

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