{"id":646,"date":"2018-09-09T20:15:36","date_gmt":"2018-09-09T18:15:36","guid":{"rendered":"http:\/\/union31xh.free.fr\/?p=646"},"modified":"2018-09-13T15:51:06","modified_gmt":"2018-09-13T13:51:06","slug":"linux-iptables-fonction-passerelle-dune-vm-ou-dun-pc","status":"publish","type":"post","link":"https:\/\/blogperso.union31.fr\/?p=646","title":{"rendered":"Linux : iptables &#8211;> fonction passerelle d&rsquo;une VM ou d&rsquo;un PC"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_82_2 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Sommaire<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/blogperso.union31.fr\/?p=646\/#I_Introduction\" >I Introduction<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/blogperso.union31.fr\/?p=646\/#II_Avant_de_commencer\" >II Avant de commencer<\/a><ul class='ez-toc-list-level-2' ><li class='ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/blogperso.union31.fr\/?p=646\/#II1_Presentation_generale\" >II.1 Pr\u00e9sentation g\u00e9n\u00e9rale :<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/blogperso.union31.fr\/?p=646\/#II2_Preparation_de_son_labo_de_test\" >II.2 Pr\u00e9paration de son labo de test<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/blogperso.union31.fr\/?p=646\/#III_Monter_une_passerelle\" >III Monter une passerelle<\/a><ul class='ez-toc-list-level-2' ><li class='ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/blogperso.union31.fr\/?p=646\/#III1_Introduction\" >III.1 Introduction<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/blogperso.union31.fr\/?p=646\/#III2_Une_premiere_passerelle\" >III.2 Une premi\u00e8re passerelle<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/blogperso.union31.fr\/?p=646\/#III3_Une_passerelle_plus_evoluee\" >III.3 Une passerelle plus \u00e9volu\u00e9e<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/blogperso.union31.fr\/?p=646\/#III4_Le_suivi_detat_est_fait_avec_%C2%AB_m_state_%C2%BB_alors_que_dautres_le_font_avec_%C2%AB_m_conntrack_%C2%BB\" >III.4 Le suivi d&rsquo;\u00e9tat est fait avec \u00ab\u00a0m state\u00a0\u00bb alors que d&rsquo;autres le font avec \u00ab\u00a0m conntrack\u00a0\u00bb ?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/blogperso.union31.fr\/?p=646\/#III5_Passerelle_avec_les_chaines_a_DROP_pour_la_table_filter\" >III.5 Passerelle avec les chaines \u00e0 DROP pour la table filter<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/blogperso.union31.fr\/?p=646\/#III_Conclusion\" >III. Conclusion<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<h1><span class=\"ez-toc-section\" id=\"I_Introduction\"><\/span>I Introduction<span class=\"ez-toc-section-end\"><\/span><\/h1>\n<p>Ce tuto va tenter de montrer pas \u00e0 pas comment impl\u00e9menter la fonction passerelle sur une VM Linux grace \u00e0 Iptables. Ainsi il sera utilis\u00e9 les tables filter et nat et tentera de montrer les liaisons qui existent ou non avec les chaines INPUT, OUTPUT et FORWARD.<\/p>\n<p>La passerelle est dans notre une VM (mais peut \u00eatre une machine physique) et elle :<\/p>\n<ul>\n<li>est bas\u00e9e sur une installation min de centos 7 ;<\/li>\n<li>comporte 2 cartes r\u00e9seaux :\n<ul>\n<li>une vers un lien internet ;<\/li>\n<li>une autre vers un r\u00e9seau interne priv\u00e9 dans lequel plusieurs VM peuvent \u00eatre pr\u00e9sentes (VM qui devront utiliser donc la passerelle pour avoir internet).<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h1><span class=\"ez-toc-section\" id=\"II_Avant_de_commencer\"><\/span>II Avant de commencer<span class=\"ez-toc-section-end\"><\/span><\/h1>\n<h2><span class=\"ez-toc-section\" id=\"II1_Presentation_generale\"><\/span>II.1 Pr\u00e9sentation g\u00e9n\u00e9rale :<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Ci dessous le sch\u00e9ma de principe qui va nous aider \u00e0 mieux comprendre ce qui va \u00eatre fait :<\/p>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-652 aligncenter\" src=\"http:\/\/union31xh.free.fr\/wp-content\/uploads\/2018\/09\/passerelle1.png\" alt=\"\" width=\"662\" height=\"465\" srcset=\"https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2018\/09\/passerelle1.png 662w, https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2018\/09\/passerelle1-300x211.png 300w\" sizes=\"auto, (max-width: 662px) 100vw, 662px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>La VM <em>PC PASSERELLE<\/em> a donc 2 cartes r\u00e9seaux :<\/p>\n<ul>\n<li>la premi\u00e8re carte est branch\u00e9e sur un r\u00e9seau dont nous pouvons avoir internet (en passant via une autre passerelle).<\/li>\n<li>la deuxi\u00e8me carte est branch\u00e9e sur un r\u00e9seau ferm\u00e9 dans lequel il y a aura une ou plusieurs autres VM.<\/li>\n<\/ul>\n<p>L&rsquo;objectif est donc que les VM du r\u00e9seau priv\u00e9 puissent avoir acc\u00e8s \u00e0 internet via la VM <em>PC PASSERELLE<\/em>. C&rsquo;est que nous verrons avec la VM <em>PC TEST<\/em>.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"II2_Preparation_de_son_labo_de_test\"><\/span>II.2 Pr\u00e9paration de son labo de test<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Ce labo peut \u00eatre mis en oeuvre sur un PC avec Virtual box par exemple.<\/p>\n<p>La VM PC PASSERELLE aura une carte en mode \u00ab\u00a0Acc\u00e8s par pont\u00a0\u00bb qui permettra d&rsquo;acc\u00e9der \u00e0 la box internet. L&rsquo;autre carte sera en mode \u00ab\u00a0R\u00e9seau interne\u00a0\u00bb<\/p>\n<p>Pour la VM <em>PC TEST<\/em> elle aura une carte d\u00e9clar\u00e9e en mode \u00ab\u00a0R\u00e9seau interne\u00a0\u00bb<em>.<\/em><\/p>\n<p>Pour les cartes branch\u00e9es sur le r\u00e9seau interne il faut le m\u00eame sous-r\u00e9seau. Il a \u00e9t\u00e9 choisi le 192.168.1.0\/24.<\/p>\n<p>&nbsp;<\/p>\n<p>Pour retrouver les cartes r\u00e9seaux sur la vm PC PASSERELLE je lance la commande <strong>nmcli d<\/strong>, ce qui donne :<\/p>\n<pre>DEVICE TYPE STATE CONNECTION\r\nenp0s3 ethernet connect\u00e9 enp0s3\r\nenp0s8 ethernet connect\u00e9 System enp0s8<\/pre>\n<p>&nbsp;<\/p>\n<p>L&rsquo;interface enp0S3 est la carte pouvant joindre la box internet<\/p>\n<p>L&rsquo;interface enp0S8 est la carte branch\u00e9e sur le r\u00e9seau priv\u00e9<\/p>\n<p>Ces cartes peuvent \u00eatre configur\u00e9es manuellement ou via l&rsquo;outil graphique \u00ab\u00a0nmtui\u00a0\u00bb.<\/p>\n<p>&nbsp;<\/p>\n<h1><span class=\"ez-toc-section\" id=\"III_Monter_une_passerelle\"><\/span>III Monter une passerelle<span class=\"ez-toc-section-end\"><\/span><\/h1>\n<h2><span class=\"ez-toc-section\" id=\"III1_Introduction\"><\/span>III.1 Introduction<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>La fonction passerelle sera assur\u00e9e par iptables.<\/p>\n<p>Pour avoir des pr\u00e9cisions sur les options de la commandes IP voir ce lien tr\u00e8s bien \u00e9crit : <a href=\"https:\/\/www.inetdoc.net\/guides\/iptables-tutorial\/index.html\" target=\"_blank\" rel=\"noopener\">https:\/\/www.inetdoc.net\/guides\/iptables-tutorial\/index.html<\/a> .Je conseille de regarder ce guide qu&rsquo;apr\u00e8s avoir vu les quelques exemples ci-dessous pour mieux comprendre l&rsquo;utilit\u00e9 et les options utilis\u00e9es par iptables.<\/p>\n<p>Si iptables est totalement inconnu je propose de suivre lien pour bien d\u00e9grossier la chose :<a href=\"http:\/\/debian-facile.org\/doc:reseau:iptables-pare-feu-pour-un-client\" target=\"_blank\" rel=\"noopener\"> http:\/\/debian-facile.org\/doc:reseau:iptables-pare-feu-pour-un-client?&amp;#sauvegarder-ses-reglest<\/a><\/p>\n<h2><span class=\"ez-toc-section\" id=\"III2_Une_premiere_passerelle\"><\/span>III.2 Une premi\u00e8re passerelle<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Dans cet exemple il va \u00eatre impl\u00e9ment\u00e9 la mani\u00e8re la plus simple (et la plus rapide) de monter une passerelle.<\/p>\n<p>Certains dirons que c&rsquo;est une passerelle passoire car aucun filtre ne sera pr\u00e9sent : tout passera de gauche \u00e0 droite.<\/p>\n<p>Tout d&rsquo;abord cr\u00e9\u00e9ons le fichier qui va contenir toutes nos commandes de configurations d&rsquo;iptables.<\/p>\n<pre>echo \"\" &gt; exemple_passerelle1.sh<\/pre>\n<p>Puis rendre se fichier executable<\/p>\n<pre>chmod +x exemple_passerelle1.sh<\/pre>\n<p>Nous allons donc utiliser iptables pour faire notre passerelle. Pour cela il faut :<\/p>\n<ul>\n<li>r\u00e9initialiser toutes les r\u00e8gles existantes des diff\u00e9rentes chaines<\/li>\n<li>ins\u00e9rer nos r\u00e8gles.<\/li>\n<\/ul>\n<p>Pour rappel :<\/p>\n<ul>\n<li>la table FILTER contient les chaines INPUT et OUPUT qui seront utilis\u00e9es pour les flux entrants et sortants de services au sein de la VM.<\/li>\n<li>la table NAT avec les chaines PREROUTING et POSTROUTING qui vont permettre de manipuler la translations d&rsquo;adresses. Dit autrement, tous les m\u00e9canismes qui vont permettre de faire du NAT. C&rsquo;est grace \u00e0 ces chaines que nous allons monter la passerelle en activant le routage.<\/li>\n<li>la table FILTER contient la chaine FORWARD qui va nous permettre d&rsquo;impl\u00e9menter des filtres sur la partie routage.<\/li>\n<\/ul>\n<p>Il va \u00eatre utilis\u00e9 dans la chaine POSTROUTING la cible \u00ab\u00a0MASQUERADE\u00a0\u00bb. Cette cible nous permet de ne pas sp\u00e9cifier d&rsquo;adresse IP sources et de transf\u00e9rer le flux du r\u00e9seau <em>interne<\/em> vers le r\u00e9seau <em>internet<\/em> ou de la carte n\u00b02 vers la carte n\u00b01.<\/p>\n<p>Ce qui se traduit par activer la fonction routage<\/p>\n<p><strong>echo \u00ab\u00a01\u00a0\u00bb&gt; \/proc\/sys\/net\/ipv4\/ip_forward<br \/>\n<\/strong><\/p>\n<p>puis \u00e9crire la r\u00e8gle iptables suivantes :<\/p>\n<p><strong>iptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE<\/strong><\/p>\n<p>En d&rsquo;autres termes, tous les flux (autre que la destination de la VM) qui passe par une interface r\u00e9seau sont \u00ab\u00a0natt\u00e9s\u00a0\u00bb sur l&rsquo;interface \u00ab\u00a0enp0S3\u00a0\u00bb, interface r\u00e9li\u00e9e au r\u00e9seau internet.<\/p>\n<p>\u00ab\u00a0sont natt\u00e9s\u00a0\u00bb signifie que :<\/p>\n<ul>\n<li>en sortie :\n<ul>\n<li>tous les flux r\u00e9seaux d&rsquo;une interface r\u00e9seau sont redirig\u00e9s sur l&rsquo;interface enp0S3<\/li>\n<\/ul>\n<\/li>\n<li>en retour :\n<ul>\n<li>le flux entrant arrive sur l&rsquo;interface enp0S3.  La trame est r\u00e9cup\u00e9r\u00e9e car elle est en lien avec la premi\u00e8re emmision. Elle est \u00e9mise sur l&rsquo;interface enp0S8. Flux qui arrivera alors \u00e0 destination sur le PC TEST.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Notre premier script ressemblera donc \u00e0 celui-ci :<\/p>\n<pre>#!\/bin\/sh\r\n\r\n# Activer le mode routeur\r\necho \"1\"&gt; \/proc\/sys\/net\/ipv4\/ip_forward\r\n\r\n# R\u00e9initialisation des chaines\r\niptables -F\r\niptables -X\r\niptables -t nat -F\r\niptables -t nat -X\r\n\r\n# Politique par d\u00e9faut des chaines\r\niptables -P INPUT ACCEPT\r\niptables -P FORWARD ACCEPT\r\niptables -P OUTPUT ACCEPT\r\n\r\n# Active le snat sp\u00e9cial avec l'option masquerade\r\niptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE<\/pre>\n<p>&nbsp;<\/p>\n<p>Pour v\u00e9rifier, regardons l&rsquo;\u00e9tat de la table FILTER : iptables -L<\/p>\n<pre>Chain <span style=\"color: #ff6600;\">INPUT<\/span> (policy <span style=\"color: #ff6600;\">ACCEPT<\/span>)\r\ntarget prot opt source destination\r\n\r\nChain <span style=\"color: #ff6600;\">FORWARD<\/span> (policy <span style=\"color: #ff6600;\">ACCEPT<\/span>)\r\ntarget prot opt source destination\r\n\r\nChain <span style=\"color: #ff6600;\">OUTPUT<\/span> (policy <span style=\"color: #ff6600;\">ACCEPT<\/span>)\r\ntarget prot opt source destination<\/pre>\n<p>Ainsi que l&rsquo;\u00e9tat de la table NAT : <strong>iptables -t nat -L <\/strong><\/p>\n<pre>Chain PREROUTING (policy ACCEPT)\r\ntarget prot opt source destination\r\n\r\nChain INPUT (policy ACCEPT)\r\ntarget prot opt source destination\r\n\r\nChain OUTPUT (policy ACCEPT)\r\ntarget prot opt source destination\r\n\r\nChain <span style=\"color: #ff6600;\">POSTROUTING<\/span> (policy ACCEPT)\r\ntarget prot opt source destination\r\n<span style=\"color: #ff6600;\">MASQUERADE all -- anywhere anywhere<\/span><\/pre>\n<p>La machine test peut d\u00e9sormais communiquer vers l&rsquo;ext\u00e9rieur via la passerelle \u00ab\u00a0PC PASSERELLE\u00a0\u00bb.<\/p>\n<p>&nbsp;<\/p>\n<h2><span class=\"ez-toc-section\" id=\"III3_Une_passerelle_plus_evoluee\"><\/span>III.3 Une passerelle plus \u00e9volu\u00e9e<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>La passerelle pr\u00e9c\u00e9dente fait son travail mais aucunes r\u00e8gles de s\u00e9curit\u00e9 ne sont impl\u00e9ment\u00e9es. En somme tout est ouvert :<\/p>\n<ul>\n<li>pour tous les fluxs allant sur la VM PC PASSERELLE (le plus critique),<\/li>\n<li>pour tous les fluxs rout\u00e9s du r\u00e9seau priv\u00e9 vers le r\u00e9seau internet.<\/li>\n<\/ul>\n<p>Pour corriger cela, nous allons passer la politique \u00e0 DROP par d\u00e9faut des chaines INPUT et FORWARD.<\/p>\n<pre>#!\/bin\/sh \r\n# Activer le mode routeur \r\necho \"1\"&gt; \/proc\/sys\/net\/ipv4\/ip_forward \r\n\r\n# R\u00e9initialisation des chaines \r\niptables -F \r\niptables -X \r\niptables -t nat -F \r\niptables -t nat -X \r\n\r\n# Politique par d\u00e9faut des chaines \r\niptables -P INPUT <span style=\"color: #ff6600;\">DROP<\/span>\r\niptables -P FORWARD <span style=\"color: #ff6600;\">DROP<\/span>\r\niptables -P OUTPUT TRUE\r\n\r\n# Active le snat sp\u00e9cial avec l'option masquerade \r\niptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE<\/pre>\n<p>Mais \u00e0 ce stade plus rien ne rentre \u00e0 destination de la VM et la fonction routage est bloqu\u00e9e. Nous verrons un peu plus tard les r\u00e8gles \u00e0 impl\u00e9menter quand la chaine OUTPUT sera \u00e0 DROP.<\/p>\n<p>Ainsi dans un premier temps nous allons nous occuper des flux entrants en direction de la VM puis apr\u00e8s des fluxs rout\u00e9s entre les 2 r\u00e9seaux.<\/p>\n<p>Les r\u00e9gles qui vont suivre vont autoriser :<\/p>\n<ul>\n<li>la boucle locale ;<\/li>\n<li>toutes les r\u00e9ponses de flux sortant de la VM ;<\/li>\n<li>le protocole SSH en entr\u00e9e pour prendre le contr\u00f4le de la VM \u00e0 distance.<\/li>\n<\/ul>\n<p>Pour cela nous allons travailler avec les chaines INPUT de la table filter :<\/p>\n<pre># Boucle locale\r\niptables -t filter -A INPUT -i lo -j ACCEPT\r\niptables -t filter -A OUTPUT -o lo -j ACCEPT\r\n\r\n# Autoriser en entr\u00e9e les session connect\u00e9es\r\niptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT\r\n\r\n# Autorise les pings\r\niptables -t filter -A INPUT -p icmp -j ACCEPT\r\n\r\n# Ouvre port ssh pour acc\u00e8s distant\r\niptables -t filter -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT<\/pre>\n<p>Ces r\u00e8gles s&rsquo;appliquent sur toutes les interfaces r\u00e9seaux.<\/p>\n<p>Si nous voulions affiner nos r\u00e9glages comme autoriser le ping sur la carte n\u00b01 (enp0s3) et pas sur la carte n\u00b02 (enp0s8) nous aurions proc\u00e9d\u00e9 de la sorte :<\/p>\n<pre>iptables -t filter -A INPUT <span style=\"color: #ff6600;\">-i enp0s3<\/span> -p icmp -j ACCEPT<\/pre>\n<p>Maintenant nous allons travailler sur le filtrage concernant le routage. Pour cela nous allons manipuler la chaine \u00ab\u00a0FORWARD\u00a0\u00bb.<\/p>\n<p>Ainsi il va \u00eatre autoris\u00e9 :<\/p>\n<ul>\n<li>le passage du ping ;<\/li>\n<li>les flux tcp pour les port 80 et 443 (WEB) ;<\/li>\n<li>les flux udp pour le port 53 (DNS).<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>Pour le ping :<\/p>\n<pre>iptables -t filter -A FORWARD -p icmp -j ACCEPT<\/pre>\n<p>Cela marche mais c&rsquo;est trop g\u00e9n\u00e9raliste. On peut r\u00e9duire le filtre on s\u00e9lectionnant par exemple les interfaces r\u00e9seaux :<\/p>\n<pre>iptables -t filter -A FORWARD -i enp0s8 -o enp0s3 -p icmp -j ACCEPT\r\niptables -t filter -A FORWARD -i enp0s3 -o enp0s8 -p icmp -j ACCEPT<\/pre>\n<p>En sp\u00e9cifiant les interfaces r\u00e9seaux, il faut d\u00e9clarer les autorisations pour le sens sortant de la trame icmp (ping) <span style=\"text-decoration: underline;\">puis<\/span> le sens revenant de la trame icmp. D&rsquo;ou la pr\u00e9sence des <strong>2<\/strong> lignes ci-dessus : la trame icmp qui part du PC TEST entre par enp0s3 et ressort par enp0s8 puis elle revient par enp0S3 et ressort par enp0S3 en direction du pc Test.<\/p>\n<p>Il est possible de r\u00e9duire encore les permissions en sp\u00e9cifiant :<\/p>\n<ul>\n<li>les adresses r\u00e9seaux sources et destinations,<\/li>\n<li>les \u00e9tats de la trame icmp a accept\u00e9 sur chaque sens de communication (NEW, ESTABLISSED, RELATED). Point tr\u00e8s int\u00e9ressant car il peut \u00eatre accept\u00e9 une trame de type nouvelle demande d&rsquo;un c\u00f4t\u00e9 du r\u00e9seau et pas de l&rsquo;autre ou pour le retour de la trame n&rsquo;accept\u00e9 que l&rsquo;\u00e9tat ESTABLISSED ou RELATED.<\/li>\n<\/ul>\n<p>Ce qui donne :<\/p>\n<pre>iptables -t filter -A FORWARD -i enp0s8 -o enp0s3 -s 192.168.1.0\/24 -d 0.0.0.0\/0 -p icmp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT\r\niptables -t filter -A FORWARD -i enp0s3 -o enp0s8 -s 0.0.0.0\/0 -d 192.168.1.0\/24 -p icmp -m state --state ESTABLISHED,RELATED -j ACCEPT<\/pre>\n<p>On pourrait aller plus loin en n&rsquo;acceptant que certains type de trames ICMP.<\/p>\n<p>Ce principe d&rsquo;autorisation de flux sortants et entrants est \u00e0 r\u00e9peter pour autant de protocoles que l&rsquo;on souhaite autoriser \u00e0 transiter entre les 2 cartes r\u00e9seaux. Ce qui pourrait donner ceci :<\/p>\n<pre># FORWARD : ping\r\niptables -t filter -A FORWARD -i enp0s8 -o enp0s3 -s 192.168.1.0\/24 -d 0.0.0.0\/0 -p icmp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT\r\niptables -t filter -A FORWARD -i enp0s3 -o enp0s8 -s 0.0.0.0\/0 -d 192.168.1.0\/24 -p icmp -m state --state ESTABLISHED,RELATED -j ACCEPT\r\n\r\n# FORWARD : udp dns\r\niptables -t filter -A FORWARD -i enp0s8 -o enp0s3 -s 192.168.1.0\/24 -d 0.0.0.0\/0 -p udp --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT\r\niptables -t filter -A FORWARD -i enp0s3 -o enp0s8 -s 0.0.0.0\/0 -d 192.168.1.0\/24 -p udp --sport 53 -m state --state ESTABLISHED -j ACCEPT\r\n\r\n# FORWARD flux http\r\niptables -t filter -A FORWARD -i enp0s8 -o enp0s3 -s 192.168.1.0\/24 -d 0.0.0.0\/0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT\r\niptables -t filter -A FORWARD -i enp0s3 -o enp0s8 -s 0.0.0.0\/0 -d 192.168.1.0\/24 -p tcp --dport 80 -m state --state ESTABLISHED -j ACCEPT\r\n\r\n# FORWARD flux https\r\niptables -t filter -A FORWARD -i enp0s8 -o enp0s3 -s 192.168.1.0\/24 -d 0.0.0.0\/0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT\r\niptables -t filter -A FORWARD -i enp0s3 -o enp0s8 -s 0.0.0.0\/0 -d 192.168.1.0\/24 -p tcp --dport 443 -m state --state ESTABLISHED -j ACCEPT<\/pre>\n<p>Attention l&rsquo;\u00e9tat RELATED ne vaut que pour l&rsquo;icmp (ping)<\/p>\n<p>Au final nous pouvons avoir le script suivant :<\/p>\n<pre>#!\/bin\/sh\r\n\r\n# Activer le mode routeur\r\necho \"1\"&gt; \/proc\/sys\/net\/ipv4\/ip_forward\r\n\r\n# R\u00e9initialisation des chaines\r\niptables -F\r\niptables -X\r\niptables -t nat -F\r\niptables -t nat -X\r\n\r\n# Politique par d\u00e9faut des chaines\r\niptables -P INPUT DROP\r\niptables -P FORWARD DROP\r\niptables -P OUTPUT ACCEPT\r\n\r\n# Active le snat sp\u00e9cial avec l'option masquerade\r\niptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE\r\n\r\n#######################\r\n# Chaine OUPUT \/ INPUT\r\n\r\n# Boucle locale\r\niptables -t filter -A INPUT -i lo -j ACCEPT\r\niptables -t filter -A OUTPUT -o lo -j ACCEPT\r\n# Session connect\u00e9e\r\n\r\niptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT\r\n# Autorise les pings que sur la carte r\u00e9seau n\u00b01 (c\u00f4t\u00e9 internet)\r\niptables -t filter -A INPUT -i enp0s3 -p icmp -j ACCEPT\r\n# Ouvre port ssh pour acc\u00e8s distant\r\niptables -t filter -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT\r\n\r\n#########################\r\n# Chaine FORWARD\r\n\r\n# FORWARD : ping\r\niptables -t filter -A FORWARD -i enp0s8 -o enp0s3 -s 192.168.1.0\/24 -d 0.0.0.0\/0 -p icmp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT\r\niptables -t filter -A FORWARD -i enp0s3 -o enp0s8 -s 0.0.0.0\/0 -d 192.168.1.0\/24 -p icmp -m state --state ESTABLISHED,RELATED -j ACCEPT\r\n\r\n# FORWARD : udp dns\r\niptables -t filter -A FORWARD -i enp0s8 -o enp0s3 -s 192.168.1.0\/24 -d 0.0.0.0\/0 -p udp --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT\r\niptables -t filter -A FORWARD -i enp0s3 -o enp0s8 -s 0.0.0.0\/0 -d 192.168.1.0\/24 -p udp --sport 53 -m state --state ESTABLISHED -j ACCEPT\r\n\r\n# FORWARD flux http\r\niptables -t filter -A FORWARD -i enp0s8 -o enp0s3 -s 192.168.1.0\/24 -d 0.0.0.0\/0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT\r\niptables -t filter -A FORWARD -i enp0s3 -o enp0s8 -s 0.0.0.0\/0 -d 192.168.1.0\/24 -p tcp --dport 80 -m state --state ESTABLISHED -j ACCEPT\r\n\r\n# FORWARD flux https\r\niptables -t filter -A FORWARD -i enp0s8 -o enp0s3 -s 192.168.1.0\/24 -d 0.0.0.0\/0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT\r\niptables -t filter -A FORWARD -i enp0s3 -o enp0s8 -s 0.0.0.0\/0 -d 192.168.1.0\/24 -p tcp --dport 443 -m state --state ESTABLISHED -j ACCEPT<\/pre>\n<p>&nbsp;<\/p>\n<p>Maintenant on v\u00e9rifie les r\u00e8gles impl\u00e9ment\u00e9es : <strong>iptables -L<\/strong><\/p>\n<pre><strong>Chain INPUT (policy <span style=\"color: #ff6600;\">DROP<\/span>)<\/strong>\r\n<strong>target prot opt source destination<\/strong>\r\n<span style=\"color: #ff6600;\">ACCEPT all -- anywhere anywhere<\/span>\r\n<span style=\"color: #ff6600;\">ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED<\/span>\r\n<span style=\"color: #ff6600;\">ACCEPT icmp -- anywhere anywhere<\/span>\r\n<span style=\"color: #ff6600;\">ACCEPT tcp -- anywhere anywhere tcp dpt:ssh<\/span>\r\n\r\n<strong>Chain FORWARD (policy <span style=\"color: #ff6600;\">DROP<\/span>)<\/strong>\r\n<strong>target prot opt source destination<\/strong>\r\n<span style=\"color: #ff6600;\">ACCEPT icmp -- 192.168.1.0\/24 anywhere state NEW,RELATED,ESTABLISHED<\/span>\r\n<span style=\"color: #ff6600;\">ACCEPT icmp -- anywhere 192.168.1.0\/24 state RELATED,ESTABLISHED<\/span>\r\n<span style=\"color: #ff6600;\">ACCEPT udp -- 192.168.1.0\/24 anywhere udp dpt:domain state NEW,ESTABLISHED<\/span>\r\n<span style=\"color: #ff6600;\">ACCEPT udp -- anywhere 192.168.1.0\/24 udp spt:domain state ESTABLISHED<\/span>\r\n<span style=\"color: #ff6600;\">ACCEPT tcp -- 192.168.1.0\/24 anywhere tcp dpt:http state NEW,ESTABLISHED<\/span>\r\n<span style=\"color: #ff6600;\">ACCEPT tcp -- anywhere 192.168.1.0\/24 tcp dpt:http state ESTABLISHED<\/span>\r\n<span style=\"color: #ff6600;\">ACCEPT tcp -- 192.168.1.0\/24 anywhere tcp dpt:https state NEW,ESTABLISHED<\/span>\r\n<span style=\"color: #ff6600;\">ACCEPT tcp -- anywhere 192.168.1.0\/24 tcp dpt:https state ESTABLISHED<\/span>\r\n\r\n<strong>Chain OUTPUT (policy <span style=\"color: #ff6600;\">ACCEPT<\/span>)<\/strong>\r\ntarget prot opt source destination\r\nACCEPT all -- anywhere anywhere<\/pre>\n<p>Et \u00e9galement dans la table NAT : <strong>iptables -t nat -L<\/strong><\/p>\n<pre>Chain PREROUTING (policy ACCEPT)\r\ntarget prot opt source destination\r\n\r\nChain INPUT (policy ACCEPT)\r\ntarget prot opt source destination\r\n\r\nChain OUTPUT (policy ACCEPT)\r\ntarget prot opt source destination\r\n\r\nChain POSTROUTING (policy ACCEPT)\r\ntarget prot opt source destination\r\n<span style=\"color: #ff6600;\">MASQUERADE all -- anywhere anywhere<\/span><\/pre>\n<p>A ce stade nous avons une passerelle qui permet au PC test :<\/p>\n<ul>\n<li>sur le r\u00e9seau internet :\n<ul>\n<li>d&rsquo;\u00e9tablir un traffic web (http et https) ;<\/li>\n<li>de r\u00e9soudre des noms de dommaines (DNS) ;<\/li>\n<li>de \u00ab\u00a0pinger\u00a0\u00bb les machines ;<\/li>\n<\/ul>\n<\/li>\n<li>sur le r\u00e9seau interne\n<ul>\n<li>d&rsquo;\u00e9tablir une connexion ssh sur le PC PASSERELLE (\u00e9galement c\u00f4t\u00e9 \u00ab\u00a0internet\u00a0\u00bb).<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h2><span class=\"ez-toc-section\" id=\"III4_Le_suivi_detat_est_fait_avec_%C2%AB_m_state_%C2%BB_alors_que_dautres_le_font_avec_%C2%AB_m_conntrack_%C2%BB\"><\/span>III.4 Le suivi d&rsquo;\u00e9tat est fait avec \u00ab\u00a0m state\u00a0\u00bb alors que d&rsquo;autres le font avec \u00ab\u00a0m conntrack\u00a0\u00bb ?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Qu\u00e9sako ?<\/p>\n<p>Pour router des paquets d&rsquo;une carte r\u00e9seau vers une autre et g\u00e9r\u00e9s le retour nous avons ecris cela pour le ping  :<\/p>\n<pre># FORWARD : ping \r\niptables -t filter -A FORWARD -i enp0s8 -o enp0s3 -s 192.168.1.0\/24 -d 0.0.0.0\/0 -p icmp <span style=\"color: #ff6600;\">-m state --state NEW,ESTABLISHED,RELATED<\/span> -j ACCEPT \r\niptables -t filter -A FORWARD -i enp0s3 -o enp0s8 -s 0.0.0.0\/0 -d 192.168.1.0\/24 -p icmp <span style=\"color: #ff6600;\">-m state --state ESTABLISHED,RELATED<\/span> -j ACCEPT<\/pre>\n<p>L&rsquo;option -m state nous permet d&rsquo;effectuer des contr\u00f4les sur la nature d&rsquo;\u00e9tat du paquet : NEW,ESTABLISHED ou RELATED.<\/p>\n<p>Ainsi nous autorisons la sortie du r\u00e9seau priv\u00e9 vers le r\u00e9seau internet d&rsquo;un ping pour toute nouvelle demande par exemple (\u00e9tat NEW). Ce qui n&rsquo;est pas le cas dans l&rsquo;autre sens (du r\u00e9seau internet au r\u00e9seau priv\u00e9).<\/p>\n<p>Mais la commande m state est consid\u00e9r\u00e9e comme obsolete par certains (bien qu&rsquo;elle fonctionne). D&rsquo;autres disent que c&rsquo;est une version \u00e9tendue de la correspondance d&rsquo;\u00e9tat. Dans tous les cas elle propose plus d&rsquo;options et permet par exemple la n\u00e9gation dans les expressions comme par ex :  <strong>-m -conntrack ! &#8211;ctstate  NEW,INVALID <\/strong><\/p>\n<p>Donc si nous devions utiliser la directive m conntrack, les 2 lignes s&rsquo;\u00e9criraient de la mani\u00e8re suivante :<\/p>\n<pre># FORWARD : ping\r\niptables -t filter -A FORWARD -i enp0s8 -o enp0s3 -s 192.168.1.0\/24 -d 0.0.0.0\/0 -p icmp <span style=\"color: #ff6600;\"><strong>-m conntrack --ctstate<\/strong> NEW,ESTABLISHED,RELATED<\/span> -j ACCEPT\r\niptables -t filter -A FORWARD -i enp0s3 -o enp0s8 -s 0.0.0.0\/0 -d 192.168.1.0\/24 -p icmp <span style=\"color: #ff6600;\"><strong>-m conntrack --ctstate<\/strong> ESTABLISHED,RELATED<\/span> -j ACCEPT<\/pre>\n<p>&nbsp;<\/p>\n<p>Le script r\u00e9cris sera donc celui (avec ajout de la r\u00e9initialisation de la table mangle) :<\/p>\n<pre>#!\/bin\/sh\r\n\r\n# Activer le mode routeur\r\necho \"1\"&gt; \/proc\/sys\/net\/ipv4\/ip_forward\r\n\r\n# R\u00e9initialisation des chaines\r\niptables -F\r\niptables -X\r\niptables -t nat -F\r\niptables -t nat -X\r\niptables -t mangle -F\r\niptables -t mangle -X\r\n\r\n# Politique par d\u00e9faut des chaines\r\niptables -P INPUT DROP\r\niptables -P FORWARD DROP\r\niptables -P OUTPUT ACCEPT\r\n\r\n# Active le snat sp\u00e9cial avec l'option masquerade\r\niptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE\r\n\r\n#######################\r\n# Chaine OUPUT \/ INPUT\r\n\r\n# Boucle locale\r\niptables -t filter -A INPUT -i lo -j ACCEPT\r\niptables -t filter -A OUTPUT -o lo -j ACCEPT\r\n# Session connect\u00e9e\r\niptables -t filter -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT\r\n# Autorise les pings que sur la carte r\u00e9seau n\u00b01 (c\u00f4t\u00e9 internet)\r\niptables -t filter -A INPUT -i enp0s3 -p icmp -j ACCEPT\r\n# Ouvre port ssh pour acc\u00e8s distant\r\niptables -t filter -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT\r\n\r\n#########################\r\n# Chaine FORWARD\r\n\r\n# FORWARD : ping\r\niptables -t filter -A FORWARD -i enp0s8 -o enp0s3 -s 192.168.1.0\/24 -d 0.0.0.0\/0 -p icmp -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT\r\niptables -t filter -A FORWARD -i enp0s3 -o enp0s8 -s 0.0.0.0\/0 -d 192.168.1.0\/24 -p icmp -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT\r\n\r\n# FORWARD : udp dns\r\niptables -t filter -A FORWARD -i enp0s8 -o enp0s3 -s 192.168.1.0\/24 -d 0.0.0.0\/0 -p udp --dport 53 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT\r\n\r\niptables -t filter -A FORWARD -i enp0s3 -o enp0s8 -s 0.0.0.0\/0 -d 192.168.1.0\/24 -p udp --sport 53 -m conntrack --ctstate ESTABLISHED -j ACCEPT\r\n\r\n# FORWARD flux http\r\niptables -t filter -A FORWARD -i enp0s8 -o enp0s3 -s 192.168.1.0\/24 -d 0.0.0.0\/0 -p tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT\r\niptables -t filter -A FORWARD -i enp0s3 -o enp0s8 -s 0.0.0.0\/0 -d 192.168.1.0\/24 -p tcp --dport 80 -m conntrack --ctstate ESTABLISHED -j ACCEPT\r\n\r\n# FORWARD flux https\r\niptables -t filter -A FORWARD -i enp0s8 -o enp0s3 -s 192.168.1.0\/24 -d 0.0.0.0\/0 -p tcp --dport 443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT\r\niptables -t filter -A FORWARD -i enp0s3 -o enp0s8 -s 0.0.0.0\/0 -d 192.168.1.0\/24 -p tcp --dport 443 -m conntrack --ctstate ESTABLISHED -j ACCEPT<\/pre>\n<p>&nbsp;<\/p>\n<h2><span class=\"ez-toc-section\" id=\"III5_Passerelle_avec_les_chaines_a_DROP_pour_la_table_filter\"><\/span>III.5 Passerelle avec les chaines \u00e0 DROP pour la table filter<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Nous allons passer toutes les chaines \u00e0 DROP de la table FILTER. Ainsi nous controllerons exactement ce qui entre \u00e0 destination de la VM et ce qui en sort.<\/p>\n<p>Ainsi la politique par d\u00e9faut des chaines de la table \u00ab\u00a0FILTER\u00a0\u00bb sera la suivante :<\/p>\n<pre># Politique par d\u00e9faut des chaines\r\n iptables -P INPUT <span style=\"color: #ff6600;\">DROP<\/span>\r\n iptables -P FORWARD <span style=\"color: #ff6600;\">DROP<\/span>\r\n iptables -P OUTPUT <strong><span style=\"color: #ff6600;\">DROP<\/span><\/strong><\/pre>\n<p>Si nous \u00e9xecutons notre script avec juste ces modifications :<\/p>\n<ul>\n<li>la chaine \u00ab\u00a0FORWARD\u00a0\u00bb n&rsquo;est pas impact\u00e9e donc la fonction passerelle fonctionne toujours. Le PC TEST peut faire des pings ou des r\u00e9solutuions D?S<\/li>\n<li>en revanche la chaine \u00ab\u00a0OUTPUT\u00a0\u00bb ne contient aucune r\u00e8gle (sauf pour la boucle locale), toutes les sorties de la VM sont bloqu\u00e9es.<\/li>\n<\/ul>\n<p>Donc dans la chaine OUTPUT il faut :<\/p>\n<ul>\n<li>autoriser ce que nous souhaitons en sortie (de l&rsquo;OS de la VM vers l&rsquo;ext\u00e9rieur)\n<ul>\n<li>ping, r\u00e9solution dns, navigation web, etc&#8230;<\/li>\n<\/ul>\n<\/li>\n<li>autoriser les connexions \u00e9tablies en liaison avec la chaine INPUT :\n<ul>\n<li>r\u00e9pondre \u00e0 un ping<\/li>\n<li>r\u00e9pondre \u00e0 un service support\u00e9 par la VM (serveur ssh, web, autres)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Pour r\u00e9pondre aux r\u00e9ponses d&rsquo;un ping ou tout autre service nous pouvons \u00e9crire :<\/p>\n<pre>iptables -t filter -A OUTPUT -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT<\/pre>\n<p>Ici tout est autoris\u00e9 en sortie que ce soit pour une nouvelle connexion ou pour une connxion d\u00e9j\u00e0 \u00e9tablie.<\/p>\n<p>Soit cette r\u00e8gle suffit, soit on d\u00e9cide alors d&rsquo;affiner nos r\u00e8gles. C&rsquo;est ce que nous allons faire.<\/p>\n<p>Si on prend le cas du ping, nous pouvons \u00e9crire :<\/p>\n<pre>iptables -t filter -A OUTPUT -m conntrack -p icmp --ctstate ESTABLISHED,RELATED -j ACCEPT<\/pre>\n<p>Cette r\u00e8gle n&rsquo;est pas compl\u00e8te. Mais elle est int\u00e9ressante en terme de comportement. Elle permet que la VM PC PASSERELLE de r\u00e9pondre au ping mais elle bloque toute tentative de faire du ping \u00e0 partir de cette VM.<\/p>\n<p>En effet dans la chaine INPUT, il est autoris\u00e9 le PING.<\/p>\n<p>Mais dans la chaine OUTPUT on n&rsquo;authorise que la r\u00e9ponse (il n&rsquo;y a pas de NEW pour autoriser l&rsquo;\u00e9mission).<\/p>\n<p>Donc pour r\u00e9pondre au ping et faire du ping \u00e0 partir de la VM il faudra \u00e9crire :<\/p>\n<pre>iptables -t filter -A OUTPUT -m conntrack -p icmp --ctstate <span style=\"color: #ff6600;\">NEW<\/span>,ESTABLISHED,RELATED -j ACCEPT<\/pre>\n<p>Ensuite on g\u00e9n\u00e9ralise sur tous les protocoles que l&rsquo;on souhaite faire passer :<\/p>\n<pre>iptables -t filter -A OUTPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT\r\niptables -t filter -A OUTPUT -p tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT\r\niptables -t filter -A OUTPUT -p tcp --dport 443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT<\/pre>\n<p>Enfin il faut que la chaine \u00ab\u00a0OUTPUT\u00a0\u00bb accepte toutes les trames qui ont \u00e9t\u00e9 inscrites dans l&rsquo;INPUT. Mais on ne connait pas forc\u00e9ment le port de r\u00e9ponse. Donc nous allons accepter tout les flux dont l&rsquo;\u00e9tat correpond \u00e0 une connexion \u00e9tablie (ESTABLISHED)<\/p>\n<pre># flux autoris\u00e9 \u00e0 sortir si autoris\u00e9 dans la chaine INPUT ...\r\niptables -t filter -A OUTPUT -p TCP -m conntrack --ctstate ESTABLISHED -j ACCEPT<\/pre>\n<p>Ce qui donnera le script suivant :<\/p>\n<pre>#!\/bin\/sh\r\n\r\n# Activer le mode routeur\r\necho \"1\"&gt; \/proc\/sys\/net\/ipv4\/ip_forward\r\n\r\n# R\u00e9initialisation des chaines\r\niptables -F\r\niptables -X\r\niptables -t nat -F\r\niptables -t nat -X\r\niptables -t mangle -F\r\niptables -t mangle -X\r\n\r\n# Politique par d\u00e9faut des chaines\r\niptables -P INPUT DROP\r\niptables -P FORWARD DROP\r\niptables -P OUTPUT DROP\r\n\r\n# Active le snat sp\u00e9cial avec l'option masquerade\r\niptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE\r\n\r\n#######################\r\n# Chaine OUPUT \/ INPUT\r\n\r\n# Boucle locale\r\niptables -t filter -A INPUT -i lo -j ACCEPT\r\niptables -t filter -A OUTPUT -o lo -j ACCEPT\r\n# Session connect\u00e9e\r\niptables -t filter -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT\r\n# Autorise les pings que sur la carte r\u00e9seau n\u00b01 (c\u00f4t\u00e9 internet)\r\niptables -t filter -A INPUT -i enp0s3 -p icmp -j ACCEPT\r\n# Ouvre port ssh pour acc\u00e8s distant\r\niptables -t filter -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT\r\n\r\n#iptables -t filter -A OUTPUT -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT\r\niptables -t filter -A OUTPUT -p icmp -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT\r\n\r\n# Protocole autoris\u00e9s \u00e0 consulter de la VM vers l'ext\u00e9rieur\r\niptables -t filter -A OUTPUT -p udp --dport 53 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT\r\niptables -t filter -A OUTPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT\r\niptables -t filter -A OUTPUT -p tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT\r\niptables -t filter -A OUTPUT -p tcp --dport 443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT\r\n\r\n# flux autoris\u00e9 \u00e0 sortir si entr\u00e9e accept\u00e9e ...\r\niptables -t filter -A OUTPUT -p TCP -m conntrack --ctstate ESTABLISHED -j ACCEPT\r\n\r\n#########################\r\n# Chaine FORWARD\r\n\r\n# FORWARD : ping\r\niptables -t filter -A FORWARD -i enp0s8 -o enp0s3 -s 192.168.1.0\/24 -d 0.0.0.0\/0 -p icmp -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT\r\niptables -t filter -A FORWARD -i enp0s3 -o enp0s8 -s 0.0.0.0\/0 -d 192.168.1.0\/24 -p icmp -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT\r\n\r\n# FORWARD : udp dns\r\niptables -t filter -A FORWARD -i enp0s8 -o enp0s3 -s 192.168.1.0\/24 -d 0.0.0.0\/0 -p udp --dport 53 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT\r\niptables -t filter -A FORWARD -i enp0s3 -o enp0s8 -s 0.0.0.0\/0 -d 192.168.1.0\/24 -p udp --sport 53 -m conntrack --ctstate ESTABLISHED -j ACCEPT\r\n\r\n# FORWARD flux http\r\niptables -t filter -A FORWARD -i enp0s8 -o enp0s3 -s 192.168.1.0\/24 -d 0.0.0.0\/0 -p tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT\r\niptables -t filter -A FORWARD -i enp0s3 -o enp0s8 -s 0.0.0.0\/0 -d 192.168.1.0\/24 -p tcp --dport 80 -m conntrack --ctstate ESTABLISHED -j ACCEPT\r\n\r\n# FORWARD flux https\r\niptables -t filter -A FORWARD -i enp0s8 -o enp0s3 -s 192.168.1.0\/24 -d 0.0.0.0\/0 -p tcp --dport 443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT\r\niptables -t filter -A FORWARD -i enp0s3 -o enp0s8 -s 0.0.0.0\/0 -d 192.168.1.0\/24 -p tcp --dport 443 -m conntrack --ctstate ESTABLISHED -j ACCEPT<\/pre>\n<p>Apr\u00e8s lanc\u00e9 ce script nous aurons le comportement suivant :<\/p>\n<p><strong> iptables -L <\/strong><\/p>\n<pre><strong>Chain INPUT (policy DROP)<\/strong>\r\n<strong>target prot opt source destination<\/strong>\r\nACCEPT all -- anywhere anywhere\r\nACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED\r\nACCEPT icmp -- anywhere anywhere\r\nACCEPT tcp -- anywhere anywhere tcp dpt:ssh\r\n\r\n<strong>Chain FORWARD (policy DROP)<\/strong>\r\n<strong>target prot opt source destination<\/strong>\r\nACCEPT icmp -- 192.168.1.0\/24 anywhere ctstate NEW,RELATED,ESTABLISHED\r\nACCEPT icmp -- anywhere 192.168.1.0\/24 ctstate RELATED,ESTABLISHED\r\nACCEPT udp -- 192.168.1.0\/24 anywhere udp dpt:domain ctstate NEW,ESTABLISHED\r\nACCEPT udp -- anywhere 192.168.1.0\/24 udp spt:domain ctstate ESTABLISHED\r\nACCEPT tcp -- 192.168.1.0\/24 anywhere tcp dpt:http ctstate NEW,ESTABLISHED\r\nACCEPT tcp -- anywhere 192.168.1.0\/24 tcp dpt:http ctstate ESTABLISHED\r\nACCEPT tcp -- 192.168.1.0\/24 anywhere tcp dpt:https ctstate NEW,ESTABLISHED\r\nACCEPT tcp -- anywhere 192.168.1.0\/24 tcp dpt:https ctstate ESTABLISHED\r\n\r\n<strong>Chain OUTPUT (policy DROP)<\/strong>\r\n<strong>target prot opt source destination<\/strong>\r\nACCEPT all -- anywhere anywhere\r\nACCEPT icmp -- anywhere anywhere ctstate NEW,RELATED,ESTABLISHED\r\nACCEPT udp -- anywhere anywhere udp dpt:domain ctstate NEW,ESTABLISHED\r\nACCEPT tcp -- anywhere anywhere tcp dpt:ssh ctstate NEW,ESTABLISHED\r\nACCEPT tcp -- anywhere anywhere tcp dpt:http ctstate NEW,ESTABLISHED\r\nACCEPT tcp -- anywhere anywhere tcp dpt:https ctstate NEW,ESTABLISHED\r\nACCEPT tcp -- anywhere anywhere ctstate ESTABLISHED<\/pre>\n<p><strong>iptables -t nat -L<\/strong><\/p>\n<pre><strong>Chain PREROUTING (policy ACCEPT)<\/strong>\r\n<strong>target prot opt source destination<\/strong>\r\n\r\n<strong>Chain INPUT (policy ACCEPT)<\/strong>\r\n<strong>target prot opt source destination<\/strong>\r\n\r\n<strong>Chain OUTPUT (policy ACCEPT)<\/strong>\r\n<strong>target prot opt source destination<\/strong>\r\n\r\n<strong>Chain POSTROUTING (policy ACCEPT)<\/strong>\r\n<strong>target prot opt source destination<\/strong>\r\nMASQUERADE all -- anywhere anywhere<\/pre>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h2><span class=\"ez-toc-section\" id=\"III_Conclusion\"><\/span>III. Conclusion<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Nous pourrions continuer le param\u00e9trage iptables pour encore am\u00e9liorer la configuration de la passerelle. En effet nous n&rsquo;avons pas impl\u00e9ment\u00e9 des r\u00e8gles de s\u00e9curit\u00e9 pour contrer des failles et certaines formes de type d&rsquo;attaque. Dans un autre domaine, le procotole FTP en mode passif ou actif n&rsquo;a pas \u00e9t\u00e9 abord\u00e9. Nous n&rsquo;avons pas \u00e9galement parler du monitoring en logguant les trames refus\u00e9es par iptables. Ou bien encore l&rsquo;int\u00e9gration, de services comme un serveur DHCP pour le r\u00e9seau interne ou un cache DNS. La liste est longue &#8230;<\/p>\n<p>N\u00e9anmoins l&rsquo;objectif premier \u00e9tait surtout de voir comment impl\u00e9menter iptables pour router tout ou partie des paquets d&rsquo;un r\u00e9seau vers un autre. Soit, sous iptables, de manipuler les chaines INPUT, OUTPUT et FORWARD de la table FILTER et de voir leur interactions pour du flux \u00ab\u00a0normal\u00a0\u00bb et du flux dit \u00ab\u00a0rout\u00e9s\u00a0\u00bb.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I Introduction Ce tuto va tenter de montrer pas \u00e0 pas comment impl\u00e9menter la fonction passerelle sur une VM Linux grace \u00e0 Iptables. Ainsi il sera utilis\u00e9 les tables filter et nat et tentera de montrer les liaisons qui existent<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-646","post","type-post","status-publish","format-standard","hentry","category-_systeme"],"_links":{"self":[{"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=\/wp\/v2\/posts\/646","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=646"}],"version-history":[{"count":41,"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=\/wp\/v2\/posts\/646\/revisions"}],"predecessor-version":[{"id":689,"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=\/wp\/v2\/posts\/646\/revisions\/689"}],"wp:attachment":[{"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=646"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=646"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=646"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}