{"id":690,"date":"2018-09-13T15:52:26","date_gmt":"2018-09-13T13:52:26","guid":{"rendered":"http:\/\/union31xh.free.fr\/?p=690"},"modified":"2018-11-06T16:36:13","modified_gmt":"2018-11-06T15:36:13","slug":"linux-iptables-fonction-reverse-proxy","status":"publish","type":"post","link":"https:\/\/blogperso.union31.fr\/?p=690","title":{"rendered":"Linux : iptables \u2013> fonction reverse proxy"},"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=690\/#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=690\/#II_Avant_de_commencer\" >II Avant de commencer<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/blogperso.union31.fr\/?p=690\/#III_Mise_en_oeuvre\" >III Mise en oeuvre<\/a><ul class='ez-toc-list-level-2' ><li class='ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/blogperso.union31.fr\/?p=690\/#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-5\" href=\"https:\/\/blogperso.union31.fr\/?p=690\/#III2_Mise_en_oeuvre_simple\" >III.2 Mise en oeuvre simple<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/blogperso.union31.fr\/?p=690\/#III3_Mise_en_oeuvre_avancee\" >III.3 Mise en oeuvre avanc\u00e9e<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<h1><span class=\"ez-toc-section\" id=\"I_Introduction\"><\/span><span id=\"I_Introduction\" class=\"ez-toc-section\">I Introduction<\/span><span class=\"ez-toc-section-end\"><\/span><\/h1>\n<p>Ce tuto va tenter de montrer pas \u00e0 pas comment impl\u00e9menter la reverse Proxy avec Iptables.<\/p>\n<p>Le reverse proxy est impl\u00e9ment\u00e9 dans une VM (mais qui 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 1 carte r\u00e9seau (ce tuto marche \u00e9galement pour 2 cartes r\u00e9seaux)<\/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<p>Soit le sch\u00e9ma suivant :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-710\" src=\"http:\/\/blogperso.union31.fr\/wp-content\/uploads\/2018\/09\/Rproxy1.png\" alt=\"\" width=\"425\" height=\"306\" srcset=\"https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2018\/09\/Rproxy1.png 627w, https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2018\/09\/Rproxy1-300x216.png 300w\" sizes=\"auto, (max-width: 425px) 100vw, 425px\" \/><\/p>\n<p>L&rsquo;objectif est que le client s&rsquo;adresse au serveur (192.168.0.10) seulement. Enfin suivant le port d&rsquo;interrogation, le serveur va renvoyer la question au PC de type PC Dest. La r\u00e9ponse sera retransmise au serveur qui \u00e0 son tour retransmettra la r\u00e9ponse au client.<\/p>\n<p>Ainsi dans le cas d&rsquo;une interrogation du serveur sur le port :<\/p>\n<ul>\n<li>8080 : c&rsquo;est le r\u00e9sultat de PC Dest1 qui sera retourn\u00e9 au \u00ab\u00a0client 1\u00a0\u00bb,<\/li>\n<li>443 : c&rsquo;est le r\u00e9sultat du PC Dest2 qui sera retourn\u00e9 au \u00ab\u00a0client 1\u00a0\u00bb.<\/li>\n<\/ul>\n<p>Sch\u00e9matiquement, nous cherchons donc \u00e0 produire ceci :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-711\" src=\"http:\/\/blogperso.union31.fr\/wp-content\/uploads\/2018\/09\/Rproxy2.png\" alt=\"\" width=\"330\" height=\"544\" srcset=\"https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2018\/09\/Rproxy2.png 471w, https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2018\/09\/Rproxy2-182x300.png 182w\" sizes=\"auto, (max-width: 330px) 100vw, 330px\" \/><\/p>\n<h1><span class=\"ez-toc-section\" id=\"III_Mise_en_oeuvre\"><\/span>III Mise en oeuvre<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>Nous allons donc mettre en oeuvre la notion de \u00ab\u00a0port forwarding\u00a0\u00bb, c&rsquo;est \u00e0 dire la redirection de paquets r\u00e9seaux recus sur une machine vers une autre.<\/p>\n<p>La solution sera impl\u00e9ment\u00e9e avec Iptables.<\/p>\n<p>Mais avant revenons sur le sch\u00e9ma d&rsquo;iptables (simplifi\u00e9) ci-dessous :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-714\" src=\"http:\/\/blogperso.union31.fr\/wp-content\/uploads\/2018\/09\/Rproxy3.png\" alt=\"\" width=\"475\" height=\"285\" \/><\/p>\n<p>Pour faire du \u00ab\u00a0port forwarding\u00a0\u00bb nous allons devoir utiliser les chaines suivantes :<\/p>\n<ul>\n<li>PREROUTING de la table Nat<\/li>\n<li>FORWARD de la table Filter<\/li>\n<li>POSTROUTING de la table Nat<\/li>\n<\/ul>\n<p>Il faut aussi activer la fonction \u00ab\u00a0routage\u00a0\u00bb.<\/p>\n<p>&nbsp;<\/p>\n<h2><span class=\"ez-toc-section\" id=\"III2_Mise_en_oeuvre_simple\"><\/span>III.2 Mise en oeuvre simple<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Ce premier exemple vise \u00e0 rester simple pour bien comprendre les m\u00e9canismes de bases \u00e0 impl\u00e9menter.<\/p>\n<p>Dans un premier temps :<\/p>\n<ul>\n<li>on active la fonction routage ;<\/li>\n<li>on vide les r\u00e8gles existantes ;<\/li>\n<li>on ouvre tout par d\u00e9faut pour les chaines INPUT, OUTPUT et FORWARD.<\/li>\n<\/ul>\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 de la table filter\r\niptables -t filter -P INPUT ACCEPT\r\niptables -t filter -P FORWARD ACCEPT\r\niptables -t filter -P OUTPUT ACCEPT<\/pre>\n<p>Nous devons maintenant donner des directives pour les chaines PREROUTING et POSTROUTING.<\/p>\n<p>Si nous utilisons l&rsquo;option MASQUERADE de la chaine POSTROURING, il ne sera plus n\u00e9cessaire de d\u00e9finir de r\u00e8gles suppl\u00e9mentaire sur la chaine POSTROUTING.<\/p>\n<pre>iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE<\/pre>\n<p>Enfin il faut sp\u00e9cifier la chaine PREROUTING. C&rsquo;est dans cette chaine qu&rsquo;il sera sp\u00e9cifi\u00e9 :<\/p>\n<ul>\n<li>l&rsquo;@IP source [directive <span style=\"color: #3366ff;\">-s 192.168.0.1<\/span>]<\/li>\n<li>le type de protocole [<span style=\"color: #ff6600;\">-p tcp<\/span>]<\/li>\n<li>le port \u00e0 traiter\u00a0 [directive<span style=\"color: #99cc00;\"> &#8211;dport 8080<\/span>]<\/li>\n<li>l&rsquo;@IP sur laquelle il faut rediriger les paquets [directive <span style=\"color: #33cccc;\">-j DNAT &#8211;to 10.2.36.110<\/span>]<\/li>\n<\/ul>\n<p>Ce qui donne :<\/p>\n<pre>iptables -t nat -A PREROUTING <span style=\"color: #3366ff;\">-s 192.168.0.1<\/span> <span style=\"color: #ff6600;\">-p tcp<\/span> <span style=\"color: #99cc00;\">--dport 8080<\/span> <span style=\"color: #33cccc;\">-j DNAT --to 192.168.0.100<\/span><\/pre>\n<p>Cette r\u00e8gle fonctionne donc pour ce cas de figure :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-718\" src=\"http:\/\/blogperso.union31.fr\/wp-content\/uploads\/2018\/09\/Rproxy2a.png\" alt=\"\" width=\"227\" height=\"185\" srcset=\"https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2018\/09\/Rproxy2a.png 467w, https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2018\/09\/Rproxy2a-300x245.png 300w\" sizes=\"auto, (max-width: 227px) 100vw, 227px\" \/><\/p>\n<p>Pour le deuxi\u00e8me cas, la r\u00e8gle sera la suivante :<\/p>\n<pre>iptables -t nat -A PREROUTING -s 192.168.0.1 -p tcp --dport <strong>443<\/strong>-j DNAT --to 192.168.0.<strong>101<\/strong><\/pre>\n<p>Avec le deuxi\u00e8me cas de figure ci-dessous :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-719\" src=\"http:\/\/blogperso.union31.fr\/wp-content\/uploads\/2018\/09\/Rproxy2b.png\" alt=\"\" width=\"222\" height=\"182\" srcset=\"https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2018\/09\/Rproxy2b.png 457w, https:\/\/blogperso.union31.fr\/wp-content\/uploads\/2018\/09\/Rproxy2b-300x246.png 300w\" sizes=\"auto, (max-width: 222px) 100vw, 222px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>Ce qui donne le script final 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 de la table filter \r\niptables -t filter -P INPUT ACCEPT \r\niptables -t filter -P FORWARD ACCEPT \r\niptables -t filter -P OUTPUT ACCEPT\r\n\r\n# Chaine POSTROUTING en mode MASQUERADE\r\niptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE\r\n\r\n# R\u00e8gle DNAT \u00e0 mettre en oeuvre\r\niptables -t nat -A PREROUTING -s 192.168.0.1 -p tcp --dport 8080 -j DNAT --to 192.168.0.100\r\niptables -t nat -A PREROUTING -s 192.168.0.1 -p tcp --dport 443 -j DNAT --to 192.168.0.101<\/pre>\n<p>&nbsp;<\/p>\n<h2><span class=\"ez-toc-section\" id=\"III3_Mise_en_oeuvre_avancee\"><\/span>III.3 Mise en oeuvre avanc\u00e9e<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>L&rsquo;id\u00e9e est d&rsquo;avoir une politique \u00e0 DROP par d\u00e9faut pour la table FILTER.<\/p>\n<p>Ainsi l&rsquo;initialisation d&rsquo;iptables sera la suivante :<\/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 de la table filter\r\niptables -t filter -P INPUT <strong>DROP<\/strong>\r\niptables -t filter -P FORWARD <span style=\"color: #800000;\"><strong>DROP<\/strong><\/span>\r\niptables -t filter -P OUTPUT <strong>DROP<\/strong><\/pre>\n<p>Les fonctions de routages sont les m\u00eames :<\/p>\n<pre># Chaine POSTROUTING en mode MASQUERADE\r\niptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE\r\n\r\n# R\u00e8gle DNAT \u00e0 mettre en oeuvre\r\niptables -t nat -A PREROUTING -s 192.168.0.1 -p tcp --dport 8080 -j DNAT --to 192.168.0.100\r\niptables -t nat -A PREROUTING -s 192.168.0.1 -p tcp --dport 443 -j DNAT --to 192.168.0.101<\/pre>\n<p>Mais \u00e0 ce stade cela ne marchera pas car la chaine FORWARD bloque tout les paquets par d\u00e9faut (Rappel, la politique par defaut est \u00e0 drop).<\/p>\n<p>Ainsi la ligne suivante autorise le paquet dans la chaine FORWARD :<\/p>\n<pre>iptables -t filter -A FORWARD -s 192.168.0.1 -d 192.168.0.100 -p tcp --dport 8080 -j ACCEPT<\/pre>\n<p>Pour \u00eatre encore plus fin nous pouvons \u00e9galement d\u00e9finir les \u00e9tats de connexions : ce qui alors se traduit par ces 2 lignes :<\/p>\n<pre>iptables -t filter -A FORWARD -s 192.168.0.1 -d 192.168.0.100 -p tcp --dport 8080 <span style=\"color: #800000;\"><strong>-m conntrack --ctstate NEW,ESTABLISHED<\/strong><\/span> -j ACCEPT\r\niptables -t filter -A FORWARD -s 192.168.0.1 -d 192.168.0.100 -p tcp <span style=\"color: #800000;\"><strong>-m conntrack --ctstate ESTABLISHED<\/strong><\/span> -j ACCEPT<\/pre>\n<p>Enfin une troisi\u00e8me ligne serait interessante si nous souhaitons logguer toute nouvelle connexion :<\/p>\n<pre>iptables -t filter -A FORWARD -s 192.168.0.1 -d 192.168.0.100 -p tcp --dport 8080 <strong>-m conntrack --ctstate NEW -j LOG --log-prefix '[8080 --&gt; 192.168.0.1-&gt;192.168.0.100]<\/strong> : '<\/pre>\n<p>Pour le deuxi\u00e8me PC les r\u00e8gles seront les suivantes :<\/p>\n<pre>iptables -t filter -A FORWARD -s 192.168.0.1 -d 192.168.0.101 -p tcp --dport 443 <strong>-m conntrack --ctstate NEW,ESTABLISHED<\/strong> -j ACCEPT\r\niptables -t filter -A FORWARD -s 192.168.0.1 -d 192.168.0.101 -p tcp <strong>-m conntrack --ctstate ESTABLISHED<\/strong> -j ACCEPT\r\niptables -t filter -A FORWARD -s 192.168.0.1 -d 192.168.0.100 -p tcp --dport 443 <strong>-m conntrack --ctstate NEW -j LOG --log-prefix '[443 --&gt; 192.168.0.1-&gt;192.168.0.101]<\/strong> : '\r\n<\/pre>\n<p>Soit le script final suivant :<\/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 de la table filter\r\niptables -t filter -P INPUT <strong>DROP<\/strong>\r\niptables -t filter -P FORWARD <strong>DROP<\/strong>\r\niptables -t filter -P OUTPUT <strong>DROP\r\n\r\n<\/strong># Chaine POSTROUTING en mode MASQUERADE\r\niptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE\r\n\r\n# R\u00e8gle DNAT \u00e0 mettre en oeuvre 8080 vers pc dest 1\r\niptables -t nat -A PREROUTING -s 192.168.0.1 -p tcp --dport 8080 -j DNAT --to 192.168.0.100\r\niptables -t filter -A FORWARD -s 192.168.0.1 -d 192.168.0.100 -p tcp --dport 8080 <strong>-m conntrack --ctstate NEW,ESTABLISHED<\/strong> -j ACCEPT\r\niptables -t filter -A FORWARD -s 192.168.0.1 -d 192.168.0.100 -p tcp <strong>-m conntrack --ctstate ESTABLISHED<\/strong> -j ACCEPT\r\niptables -t filter -A FORWARD -s 192.168.0.1 -d 192.168.0.100 -p tcp --dport 8080 <strong>-m conntrack --ctstate NEW -j LOG --log-prefix '[8080 --&gt; 192.168.0.1-&gt;192.168.0.100]<\/strong> : '\r\n\r\n# R\u00e8gle DNAT \u00e0 mettre en oeuvre 443 vers pc dest 2\r\niptables -t nat -A PREROUTING -s 192.168.0.1 -p tcp --dport 443 -j DNAT --to 192.168.0.101\r\niptables -t filter -A FORWARD -s 192.168.0.1 -d 192.168.0.101 -p tcp --dport 443 <strong>-m conntrack --ctstate NEW,ESTABLISHED<\/strong> -j ACCEPT\r\niptables -t filter -A FORWARD -s 192.168.0.1 -d 192.168.0.101 -p tcp <strong>-m conntrack --ctstate ESTABLISHED<\/strong> -j ACCEPT\r\niptables -t filter -A FORWARD -s 192.168.0.1 -d 192.168.0.100 -p tcp --dport 443 <strong>-m conntrack --ctstate NEW -j LOG --log-prefix '[443 --&gt; 192.168.0.1-&gt;192.168.0.101]<\/strong> : '<\/pre>\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 reverse Proxy avec Iptables. Le reverse proxy est impl\u00e9ment\u00e9 dans une VM (mais qui peut \u00eatre une machine physique) et elle : est bas\u00e9e sur une<\/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-690","post","type-post","status-publish","format-standard","hentry","category-_systeme"],"_links":{"self":[{"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=\/wp\/v2\/posts\/690","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=690"}],"version-history":[{"count":16,"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=\/wp\/v2\/posts\/690\/revisions"}],"predecessor-version":[{"id":728,"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=\/wp\/v2\/posts\/690\/revisions\/728"}],"wp:attachment":[{"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=690"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=690"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogperso.union31.fr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=690"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}