 mise en place d une passerelle sous debian avec iptables but de ce document ce document me sert de mémo pour installer une passerelle avec iptables sous debian ce document n expliquera pas le fonctionnement d iptable mais uniquement la mise en place des scripts et la configuration d un firewall minimaliste script pour désactiver le firewall ce script que nous pouvons nommer et placer dans   etc firewallstop  permettra de désactiver le firewall bin sh nous vidons les chaînes iptables f nous supprimons d éventuelles chaînes personnelles iptables x nous les faisons pointer par défaut sur accept iptables p input accept iptables p output accept iptables p forward accept cette ligne permet de supprimer toutes les redirections de ports iptables t nat f attention  nous verrons au chapitre  utilisation des dossiers ifpreup et ifpostdown  qu il ne faut pas utiliser de caractères spéciaux d espaces et de points dans le nom de ce fichier il est important également de ne pas oublier la première ligne bin sh  script pour activer le firewall ce script que nous pouvons nommer et placer dans   etc firewallstart  permettra de démarrer le firewall bin sh remise à zero des règles de filtrage iptables f iptables t nat f mise en place des régles par défaut iptables p input drop iptables p forward accept iptables p output accept on enlève le firewall sur le loopback et le reseau local iptables a input i lo j accept iptables a input i eth0 j accept iptables a input m state state related established j accept ouverture de ports exemple pour un port tcp ici 80 iptables a input p tcp dport 80 j accept exemple pour un port udp ici 110 iptables a input p udp dport 110 j accept exemple d un ensemble de ports de 2072 a 2080 inclus iptables a input p tcp dport 20722080 j accept j accepte le protocole icmp ie le ping iptables a input p icmp j accept j accepte le protocole igmp pour le multicast iptables a input p igmp j accept j accepte les packets entrants relatifs à des connexions déjà établies iptables a input m state state related established j accept décommentez les deux lignes suivantes pour que le serveur ftp éventuel soit joignable de l extérieur iptables a input p tcp dport 20 j accept iptables a input p tcp dport 21 j accept décommentez la ligne suivante pour que le serveur ssh éventuel soit joignable de l extérieur iptables a input p tcp dport 22 j accept a placer en fin du fichier iptables a input j drop arrêt et démarrage manuel du firewall avant de lancer les scripts il faut les rendre exécutables chmod x etc firewallstart chmod x etc firewallstop ensuite il est possible de lancer manuellement le firewall et de vérifier le résultat etc firewallstart iptables l v il est possible également de l arrêter manuellement et de vérifier le résultat etc firewallstop iptables l v nous allons voir dans les chapitres suivants deux méthodes pour activer ou désactiver automatiquement le firewall lancement automatique du firewall au démarrage de l ordinateur pour activer le firewall automatiquement au démarrage de l ordinateur il faut créer le script   etc initd firewall  contenant les lignes suivantes bin sh stop etc firewallstop case 1 in start etc firewallstart stop stop restart stop etc firewallstart esac rendre ce script exécutable avec la commande chmod x etc initd firewall créer les liens permettant de démarrer automatiquement le script au démarrage de l ordinateur updatercd firewall defaults la commande suivante permet d arrêter le firewall etc initd firewall stop la commande suivante permet de vérifier que les règles sont biens effacées iptables l v la commande suivante permet de démarrer le firewall etc initd firewall start la commande suivante permet de vérifier que les règles sont bien mises en place iptables l v utilisation des dossiers ifpreup et ifpostdown  les scripts placés dans le dossier   etc network ifpostdownd  seront lancés automatiquement après chaque arrêt d une interface réseau les scripts placés dans le dossier   etc network ifpreupd  seront lancés automatiquement avant chaque démarrage d une interface réseau mais pour que les scripts fonctionnement il faut respecter quelques règles il doivent être exécutables chmod x ils doivent indiquer l interpréteur de commande sur la première ligne ex bin sh le nom ne doit contenir que des caractères chiffres et pas de points quand le script est exécuté il peut utiliser plusieurs variables iface nom de l interface physique concernée eth0 lo logical nom de l interface logique addrfam method mode phase et verbosity le script peut donc utiliser ces variables pour s adapter en conséquence attention  en plaçant le script d arrêt du firewall dans le dossier ifpostdown celuici sera exécuté quelque soit l interface réseau arrêté par exemple si le firewall est destiné à filtrer l interface eth0 il sera désactivé lorsque l interface lo sera arrêtée ce qui peut entraîner une grosse faille de sécurité pour remédier à ce problème il faut ajouter au début du script un test pour qu il s exécute uniquement pour l interface concernée f iface eth2 then exit fi configuration du fichier etc network interfaces  une autre méthode pour arrêter et démarrer un firewall est d utiliser les directives  preup  et  postdown  dans le fichier   etc network interfaces  exemple auto eth0 iface eth0 inet dhcp preup etc firewallstart postdown etc firewallstop activation de l ip forwarding pour autoriser les paquets entrant sur une interface réseau à transiter sur une autre interface réseau il faut activer l ip forwarding cela peut se faire manuellement avec la commande suivante echo 1 proc sys net ipv4 ipforward mais dans ce cas l ip forwarding sera désactivé au prochain redémarrage de l ordinateur pour l activer en permanence sous debian il existe au moins trois méthodes la première consiste à ajouter la ligne précédente dans le fichier de lancement du firewall  firewallstart  la deuxième méthode consiste à l activer lors du démarrage d une interface réseau ex lo en modifiant le fichier   etc network interfaces  ce qui donne iface lo inet loopback up echo 1 proc sys net ipv4 ipforward la troisième méthode est de mettre  ipforward yes  à la place de  ipforward no  dans le fichier   etc network options  ce qui donne dans mon cas ipforward yes spoofprotect yes syncookies no détail configuration netfilter iptables netfilter utilise 3 tables   filter c est la table par défaut si l option t est omise elle contient les chaînes prédéfinies input  pour les paquets entrant dans la machine  forward  pour les paquets routés à travers la machine et output  pour les paquets générés localement nat cette table est consultée lorsqu on rencontre un paquet qui crée une nouvelle connexion la table est composée de trois chaînes prédéfinies  prerouting  pour modifier les paquets dès qu ils entrent  output  pour modifier les paquets générés localement avant le routage et postrouting  pour modifier les paquets lorsqu ils sont sur le point de sortir mangle cette table est employée pour effectuer une modification spéciale des paquets jusqu au noyau 2417 elle offrait deux chaînes prédéfinies  prerouting  pour modifier les paquets entrants avant le routage et output  pour modifier les paquets générés localement avant le routage depuis le noyau 2418 trois autres chaînes prédéfinies sont aussi prises en charge  input  pour les paquets entrants destinés à la machine ellemême  forward  pour modifier les paquets routés à travers la machine et postrouting  pour modifier les paquets lorsqu ils sont sur le point de sortir  début du script du firewall cette première ligne est importante bin sh ensuite il est possible de mettre des commentaires script de configuration d iptables créé par tony galmiche le 26062006 il est possible et même conseillé de définir des variables inet eth0 ilan eth1 idmz eth2 les modules selon vos besoins vous allez avoir besoin de charger les modules suivants ou d autres placez ces lignes au début de votre script de firewall modprobe ipconntrackftp modprobe iptables modprobe ipnatftp modprobe ipnatirc modprobe iptablefilter modprobe iptablemangle modprobe iptablenat par exemple le module ipconntrackftp vous permettra de faire du ftp passif aussi bien que du ftp actif effacer les règles existantes les commandes suivantes permettent d effacer toutes les règles existantes supprime les chaînes de la table filter input forward et output iptables f supprime les chaînes personnelles de la table filter iptables x supprime les chaînes de la table nat prerouting output et postrouting iptables t nat f supprime les chaînes personnelles de la table nat iptables t nat x supprime les chaînes de la table mangle prerouting output input forward et postrouting iptables t mangle f supprime les chaînes personnelles de la table mangle iptables t mangle x définir les règles par défaut  définition du comportement par défaut pour les chaines de la table filter on bloque les entrées et on autorise tout le reste iptables p input drop iptables p output accept iptables p forward accept pour accepter tout ce qui ce passe sur l interface lo  autoriser les paquets pour lo iptables a input i lo j accept iptables a output o lo j accept j ai également vu ces règles mais je ne suis pas certain de leur utilité iptables a forward i lo j accept iptables a forward o lo j accept pour accepter tout ce qui ce passe sur le lan première méthode trouvée iptables a input s 1921680024 j accept iptables a forward s 1921680024 j accept iptables a forward d 1921680024 j accept deuxième méthode trouvée  accepter les connexions http iptables a input i eth0 p tcp sport www m state state new established related j accept commentaire  on veut pouvoir se connecter à notre serveur web de l extérieur et naviguer depuis notre serveur on autorise donc les connexions entrantes nouvelles new déjà établies established ou en relation related comme http possède un port bien défini 80 il est présent dans la liste des ports de etc services on peut donc l indiquer comme mdash sport port source ou dport port de destination en indiquant son nom il en va de même pour ssh car il est aussi présent dans etc services modprobe ipconntrack iptables a input i eth0 protocol tcp sport 80 m state state established j accept iptables a output o eth0 protocol tcp dport 80 m state state new established j accept accepter les connexions ssh premier exemple on accepte en entrée uniquement si une connexion est déjà établie iptables a input i eth0 p tcp sport ssh m state state new established related j accept deuxième exemple on accepte en entrée et sortie dans tous les cas iptables a input p tcp dport ssh i eth0 j accept iptables a output p tcp sport ssh o eth0 j accept accepter les connexions smtp iptables a output o ppp0 p tcp sport 1024 d smtpwanadoofr dport 25 m state state invalid j accept iptables a input i ppp0 p tcp s smtpwanadoofr sport 25 dport 1024 m state state related established j accept accepter les connexions dns iptables a output o ppp0 p udp sport 1024 dport 53 m state state invalid j accept iptables a input i ppp0 p udp sport 53 dport 1024 m state state related established j accept accepter les connexions ftp modprobe ipconntrackftp iptables a input i eth0 p tcp sport 21 m state state established j accept iptables a output o eth0 p tcp dport 21 m state state new established j accept iptables a input i eth0 p tcp sport 20 m state state established related j accept iptables a output o eth0 p tcp dport 20 m state state established j accept iptables a input i eth0 p tcp sport 102465535 dport 102465535 m state state established j accept iptables a output o eth0 p tcp sport 102465535 dport 102465535 m state state established related j accept pour cette connexion il faut charger le module  conntrackftp  on autorise la réception de paquets provenant d une machine extérieure utilisant le protocole tcp sur le port de départ 21 avec une connexion déjà établie l émission de paquets vers une machine extérieure utilisant le protocole tcp sur le port d arrivé 21 pour une connexion déjà établie ou une nouvelle connexion la réception de paquets provenant d une machine extérieure utilisant le protocole tcp sur le port de départ 20 avec une connexion déjà établie l émission de paquets vers une machine extérieure utilisant le protocole tcp sur le port d arrivé 20 pour une connexion déjà établie ou provenant d une autre connexion la réception de paquets provenant d une machine extérieure utilisant le protocole tcp sur le port de départ et arrivée entre 1024 et 65535 avec une connexion déjà établie l émission de paquets vers une machine extérieure utilisant le protocole tcp sur le port de départ et arrivée 1024 et 65535 pour une connexion déjà établie ou provenant d une autre connexion se protéger des scan de port iptables a forward p tcp tcpflags syn ack fin rst rst m limit limit 1 s j accept se protéger contre le ping de la mort iptables a forward p icmp icmptype echorequest m limit limit 1 s j accept autoriser le protocole icmp ex ping  autoriser le ping sans restriction iptables a input p icmp j accept autoriser le ping mais dans la limite de 2 pings par seconde mdash limit 2 s iptables a output p icmp m state state new established related j accept iptables a input p icmp m state state new established related j accept iptables a input p icmp m limit limit 2 s j accept le protocole icmp même s il présente quelques dangers rend tout de même quelques services appréciables dans le cas d erreurs de transmission et aussi dans la découverte du mtu il se trouve que pour les messages d erreur icmp l entête du paquet qui a généré l erreur est reproduite dans le message le suivi de connexion icmp s en sert pour déclarer ce paquet related en revanche pour la passerelle ellemême si on a activé smtp et dns il peut s avérer intéressant d ajouter la ligne iptables a input p icmp m state state related j accept de cette manière une erreur icmp passera mais votre passerelle ne répondra pas aux pings ni à aucune autre interrogation icmp autoriser le protocole igmp pour le multicast  iptables a input p igmp j accept autoriser les connexions tcp et udp déjà établies à rentrer iptables a input p tcp m state state established related j accept iptables a input p udp m state state established related j accept refuse les connections de la machine 12131415 iptables i input s 12131415 j drop refuser l accès web pour tous les utilisateurs sauf root iptables a output o eth0 p tcp dport http j reject rejectwith tcpreset iptables i output o eth0 p tcp dport http m owner uidowner root j accept activer le masquerading translation d adresses  le masquerading permet aux ordinateurs d un réseau de se connecter à internet en utilisant l adresse publique du routeur internet iptables t nat a postrouting o eth0 j masquerade nous pourrions restreindre le masquerading à une plage d ips du réseau local iptables t nat a postrouting s 192168002552552550 o ppp0 j masquerade la même règle écrite différemment pour le masque de sousréseau iptables t nat a postrouting s 1921680024 o ppp0 j masquerade ou même à une liste d ip bien définie iptables t nat a postrouting s 192168010 o ppp0 j masquerade iptables t nat a postrouting s 192168011 o ppp0 j masquerade transférer des ports sur la passerelle dans certain cas il peutêtre intéressant de rediriger un port particulier sur un autre port par exemple la commande suivante permet de rediriger les requêtes envoyées sur le port 1000 vers le port 2000 iptables t nat i prerouting p tcp dport 1000 j redirect toports 2000 pour information la commande suivante permet d avoir la liste des ports redirigés iptables t nat l chain prerouting policy accept target prot opt source destination redirect tcp anywhere anywhere tcp dpt 1000 redir ports 2000 transférer des ports sur d autres serveurs nat  vous n avez qu une seule adresse ip et deux serveurs doivent être accessibles le serveur web et la passerelle internet la translation d adresses va venir à votre rescousse on va rediriger les ports concernés vers les bonnes destinations iptables t nat a prerouting j dnat i eth0 p tcp dport smtp todestination 19216811 iptables t nat a prerouting j dnat i eth0 p tcp dport http todestination 19216812 si vous souhaitez que tous les surfeurs passent par votre cache internet et que tous les mails circulent via la passerelle de messagerie ce n est pas un problème il n y aura même pas à configurer les clients cela est particulièrement utilisé pour des entreprises ayant un antivirus sur le relais de messagerie iptables t nat a prerouting j dnat i eth2 p tcp dport http todestination 192168133128 iptables t nat a prerouting j dnat i eth2 p tcp dport smtp todestination 19216811 optimisation de la taille des paquets iptables a forward p tcp tcpflags syn rst syn j tcpmss o eth0 clampmsstopmtu liste succincte des adresses de ports  pour plus d informations voir etc services port service 20 ftp 21 ftp 22 ssh 25 smtp 80 http 110 pop3 143 imap 220 imap3 443 https 2401 cvs 6667 irc gestion des logs du firewall les commandes suivantes permettent d activer les logs attention désactiver cette ligne pour ne pas saturer syslog loglevel permet de forcer le niveaux des logs iptables t filter a input j log logprefix fw loglevel 0 iptables t filter a input j log logprefix fw log uniquement si input vient du réseau local iptables t filter a input i ilan j log logprefix fw log uniquement si input vient de l adresse ip 19216802 iptables t filter a input s 19216802 j log logprefix fw iptables t filter a input s 1920013 j log logprefix fw la commande suivante permet de ne pas afficher les logs du noyau dans la console fonctionnement par défaut ne pas afficher les logs dans la console le premier chiffre correspond au niveau des logs à afficher je ne connais pas l utilité des 3 autres chiffres donc je n y touche pas 0 aucun log 7 valeur par défaut 8 tous les logs debug echo 0 4 1 7 proc sys kernel printk pour info voici la signification des niveaux de logs  niveau niveau description emerg 0 le système est inutilisable alert 1 une action doit être entreprise immédiatement crit 2 conditions critiques err 3 conditions d erreurs warning 4 conditions d avertissements notice 5 normal mais conditions significatives info 6 informatif debug 7 messages de niveau déboguage pour avoir un fichier spécial de log pour le firewall il faut ajouter la ligne suivante dans le fichier   etc syslogconf  kernwarning var log firewalllog stocker les logs dans mysql avec ulog je n ai pas testé mais j ai noté quelques liens intéressants sur le sujet  http ftptraducorg docvf gazettelinux html 2005121 lg121ahtml   http iptablestutorialfrozentuxnet fr x4032html   http wwwregitorg articlephp3 idarticle 20   http wwwinlfr nulog 35html test du firewall avec nmap nmap sans option permet déjà d afficher les ports ouverts sur un serveur nmap 192003 starting nmap 410 http wwwinsecureorg nmap at 20060628 1318 cest interesting ports on ws003ltsp 192003 not shown 1675 closed ports port state service 22 tcp open ssh 111 tcp open rpcbind 113 tcp open auth 984 tcp open unknown l option a permet d afficher le nom et la version des logiciels utilisés et l option t4 permet d accélérer le rendu du résultat nmap a t4 192003 starting nmap 410 http wwwinsecureorg nmap at 20060628 1320 cest interesting ports on ws003ltsp 192003 not shown 1675 closed ports port state service version 22 tcp open ssh openssh 381p1 debian8sarge4 protocol 20 111 tcp open rpcbind 2 rpc 100000 113 tcp open ident openbsd identd 984 tcp open status 1 rpc 100024 service info os openbsd l option o permet de détecter le système d exploitation nmap o 192003 mac address 00 a0 cc 668735 liteon communications device type general purpose running linux 24x 25x 26x os details linux 247 2611 uptime 0135 days since wed jun 28 100941 2006 la commande suivante permet de scanner tout un réseau en même temps nmap 19200124 l option a permet d avoir un maximum d informations scan agressif nmap a 192003 il est possible de spécifier plusieurs postes à analyser en les séparant par une virgule et un espace nmap 192003 192001 il est possible d analyser une série consécutive de postes avec cette syntaxe nmap 192168019 pour plus d option  man nmap analyses des paquets avec tcpdump le paquet et le programme tcpdump permettent d analyser les paquets envoyés ou reçus sur une interface réseau par exemple la commande suivante permet d analyser tous les paquets qui passent par par l interface par défaut eth0 tcpdump cette commande permet d analyser uniquement les paquets en provenance de l adresse 19216801 tcpdump src 19216801 analyser uniquement le port 80 de la source 19216801 tcpdump src 19216801 and port 80 la commande suivante avec un maximum de paramètres permet d afficher les informations en clair pour éventuellement récupérer les mots de passes qui circulent en clair avec une messagerie tcpdump x x s 0 src host 19216801 and dst host 2122082251 and port 53 and udp la commande suivante permet d écouter sur l interface tun0 les paquets en provenance de 10801 de type icmp ping tcpdump i tun0 src 10801 and icmp analyses des paquets avec ethereal ethereal utilise tcpdump et d autres logiciels pour analyser d une manière très évoluée les paquets qui transitent sur un réseau il est quasiment capable de reconstituer une page web complète en assemblant tous les paquets qui transitent sur le réseau autres sources d informations page de man d iptable en français incontournable  http wwwdelafondorg traducmanfr man man8 iptables8html plusieurs mémos dont je me suis inspiré pour ce document  http wwwtryxynet indexphp firewalletrouteuraveciptables   http peopleviaecpfr alexis formationlinux firewallhtml historique des modifications version date commentaire 01 270606 création par tony galmiche 02 150806 mise en ligne 03 250906 ajout de compléments concernant les redirections de ports 04 160207 ajout refuser l accès web pour tous les utilisateurs sauf root 05 080407 petite correction suite à remarque sur le forum  mise en place d une passerelle sous debian avec iptables tu appele ton script etc firewallstart puis dans ton fichier etc initd firewall tu mets etc firewallstart avec un tu dis nous verrons plus loin qu il ne faut pas utiliser de caractères spéciaux d espaces et de points dans le nom de ce fichier mais tu ne semble pas l expliquer plus tard j avoue avoir sauté les parties spécifiques a debian n étant pas connaisseur la dessus j aimerais pourtant en connaitre la raison concernant ulog ca fonctionne bien a condition de ne pas avoir trop de trafic je n avais en effet pas trouvé de moyen de faire des rotations de logs propre il y a presque 2 ans de cela il existe peut etre une solution pour cela maintenant   mise en place d une passerelle sous debian avec iptables quelle perspicacité pour ta remarque j ai donc corrigé cette erreur cette limitation dans le nom du fichier est lié au chapitre utilisation des dossiers ifpreup et ifpostdown j ai galèré un moment avant de comprendre qu il ne fallait pas de point dans le nom du fichier comme c est indiqué dans la doc en anglais sur le sujet ou dans le man merci pour ta relecture  mise en place d une passerelle sous debian avec iptables ok je n avais pas lu cette partie c est pour cela concernant la perspicacité c est me focalisant sur mais pourquoi pas de que j ai vu que tu en avais mis dans le script  mise en place d une passerelle sous debian avec iptables bonsoir tony bonne synthèse sur le sujet cette synthèse reste en effet difficile comptetenu de la multitude d articles qui se contredisent qui plus est je regarderait sur le parefeu de mon job si quelque chose peut être ajouté a propos de ulog la société inl a mis en place le parefeu authentifiant dans mon établissement et je pourrai te donner des informations complémentaires si tu es intéressé a savoir l auteur de regitorg est un des cofondateurs de nufw inl a bientôt patrice  mise en place d une passerelle sous debian avec iptables bonjour patrice merci pour la relecture concernant ulog je veux bien des informations complèmentaires a bientôt tony article très interressant merci pour cet article très clair davy article très interressant merci  mise en place d une passerelle sous debian avec iptables merci bcp pour ton travail wam mise en place d une passerelle sous debian avec iptables merci c est toujours encourageant pour continuer  mise en place d une passerelle sous debian avec iptables c est vraiment bien fait tn article chapeau  mise en place d une passerelle sous debian avec iptables merci  mise en place d une passerelle sous debian avec iptables merci pour cette aide tutoriale j ai tout de meme rencontré un problème pour le fichier firewallstop ou l ordre inversé des iptables p de output et forward m a generé un iptables bad builtin chain name  mise en place d une passerelle sous debian avec iptables très bon article petite correction toutefois les fichiers dans ifpreup sont lancés avant le démarrage des interfaces réseau a part ca bon boulot ca devrait aider du monde mise en place d une passerelle sous debian avec iptables merci pour la remarque c est corrigé mise en place d une passerelle sous debian avec iptables bonjour quel est l interêt à établir des règles de sortie si la règle par défaut est de tout laisser sortir ca me parait assez contradictoire dans la mesure ou même si le paquet sortant ne correspond pas à la règle de sortie il finira en bout de chaîne à se conformer à la règle par défaut mise en place d une passerelle sous debian avec iptables bonjour cette méthode laisse tout passer en sortie sauf ce qui explicitement interdit mise en place d une passerelle sous debian avec iptables bonjour j ai 2 machines sur debian une machine serveur et l autre client le serveur a 2 carte réseau une qui sort sur internet et l autre qui sert de passerelle pour la machine du réseau interne j ai suivi vos conseils concernant l installation d une passerelle sous debian comme je ne dispose que 2 de mahines j ai pas juger utile de faire du dhcp j ai configuré la passerelle selon vos conseils lorsque je branche le laptop d un ami qui tourne sous windows au niveau de mon réseau local avec des configurations statiques ca marche je sors sur internet en passant par la machine serveur mais lorsque j utilise la meme configuration statique pour la machine cliente qui est sous debian ca marche pas j arrive pas à sortir sur internet si tu peu m aider à configurer cette machine àfin de sortir sur internet mise en place d une passerelle sous debian avec iptables bonjour si le poste windows fonctionne c est soit un problème de parefeu ou de passerelle par défaut sur le poste client sous debian mise en place d une passerelle sous debian avec iptables merci ca marche en fait le problème était du au fichier resolconf il ne voyait as les dns primaire et secondaire merci tony  mise en place d une passerelle sous debian avec iptables bonjour en fait c est pour une question stpide mais c est qui la machine 12131415 et pourquoi l interdire  article très interressant merci monsieur très bon boulot complet nikel moi qui cherchai j ai enfin trouvé merci pour tout ps si tu as d autres tuto indique les je suis preneur p  dhcp  