{"id":110,"date":"2010-03-12T23:23:59","date_gmt":"2010-03-12T22:23:59","guid":{"rendered":"http:\/\/blog.brimbelle.org\/?p=110"},"modified":"2010-11-17T22:10:56","modified_gmt":"2010-11-17T21:10:56","slug":"offrez-vous-une-connectivite-ipv6-internet-lan-et-dmz-pour-0-euro","status":"publish","type":"post","link":"https:\/\/blog.brimbelle.org\/index.php\/2010\/03\/12\/offrez-vous-une-connectivite-ipv6-internet-lan-et-dmz-pour-0-euro\/","title":{"rendered":"Offrez-vous une connectivit\u00e9 IPv6 Internet, LAN et DMZ pour 0 euro"},"content":{"rendered":"<p>En ces temps o\u00f9 toutes \u00e9conomies sont bonnes \u00e0 prendre, je me suis attel\u00e9 \u00e0 mettre en place chez moi un \u00ab\u00a0vrai\u00a0\u00bb acc\u00e8s IPv6. Par vrai, je n&rsquo;entends pas un acc\u00e8s natif (ce serait trop beau, aucun op\u00e9rateur grand public fran\u00e7ais ne le propose \u00e0 l&rsquo;heure actuelle hormis Nerim dont l&rsquo;offre est tout de m\u00eame plus orient\u00e9e vers les TPE), mais un acc\u00e8s offrant un espace d&rsquo;adressage correct, ie. un \/48.<\/p>\n<p>M\u00eame Free qui propose de l&rsquo;IPv6 \u00e0 ses clients ne propose qu&rsquo;un semblant d&rsquo;acc\u00e8s natif, avec du <a href=\"http:\/\/tools.ietf.org\/html\/rfc5569\" target=\"_blank\">6rd<\/a> mais il se limite \u00e0 donner un \/64.<\/p>\n<p>Dans ce billet, je vais donc m&rsquo;attacher \u00e0 pr\u00e9senter les grandes lignes pour mettre en place \u00e0 la maison (et m\u00eame ailleurs) un acc\u00e8s IPv6 avec diff\u00e9rents sous-r\u00e9seaux, en utilisant un tunnel broker. Pour y arriver je pr\u00e9senterai des exemples de configuration pour une passerelle OpenBSD, ainsi que des astuces.<\/p>\n<p><!--more-->Tout d&rsquo;abord, revenons sur quelques bases. Avec IPv4 il se pratique depuis de nombreuse ann\u00e9es un routage ne se basant plus sur les classes avec CIDR (Classless Inter Domain Routing). Ceci est rendu possible par l&rsquo;utilisation de masques r\u00e9seau \u00e0 taille variable (VLSM, Variable Length Subnet Masking). Avec IPv6, les masques disparaissent au profit de pr\u00e9fixes. Un pr\u00e9fixe IPv6 est l&rsquo;\u00e9quivalent d&rsquo;un masque, qui permet de router un sous-r\u00e9seau \u00e0 travers internet. D&rsquo;un point de vue routage, un pr\u00e9fixe a une taille maximale de 64 bits (une adresse IPv6 ayant une taille de 128 bits). Les op\u00e9rateurs peuvent localement d\u00e9couper plus finement cet espace d&rsquo;adressage, mais sur internet, les r\u00e8gles de routage seront communes au \/64.<\/p>\n<p>Ainsi, Free qui propose un \/64 \u00e0 ses clients, ne donne la possibilit\u00e9 d&rsquo;adresser qu&rsquo;un seul sous-r\u00e9seau. Si vous souhaitez vous amuser avec les joies de l&rsquo;IPv6 qui vous permet de poss\u00e9der pour chaque machine une adresse publique routable, alors la solution de Free montre vite ses limites.\u00a0Il vous sera en effet impossible (comme c&rsquo;est \u00e9galement le cas de tous les autres FAIs grand public fran\u00e7ais) de segmenter votre r\u00e9seau pour s\u00e9parer vos clients de vos serveurs en mettant par exemple en place un LAN local, une DMZ, un acc\u00e8s Wifi, etc. le tout sur un espace d&rsquo;adressage IPv6 public.<\/p>\n<p>Mais comme sur internet on trouve de tout, il existe des \u00ab\u00a0tunnel brokers\u00a0\u00bb qui fournissent des points d&rsquo;acc\u00e8s IPv6 un peu partout dans le monde. La technique est simple : depuis votre acc\u00e8s IPv4 natif, on va encapsuler jusqu&rsquo;au point de pr\u00e9sence du tunnel broker l&rsquo;int\u00e9gralit\u00e9 du trafic IPv6 sur de l&rsquo;IPv4. Il y a quelques ann\u00e9es, les points de pr\u00e9sence \u00e9taient bien souvent situ\u00e9s aux \u00c9tats Unis ou assez loin g\u00e9ographiquement de l&rsquo;Europe. Mais d\u00e9sormais, de nombreux tunnel brokers ont fait leur apparition proposant des services tr\u00e8s int\u00e9ressants comme :<\/p>\n<ul>\n<li>Une pr\u00e9sence de proximit\u00e9 avec des points de pr\u00e9sence en France et \u00e0 travers l&rsquo;Europe,<\/li>\n<li>Un sous-r\u00e9seau IPv6 large : \/48 ou plus,<\/li>\n<li>La d\u00e9l\u00e9gation de la zone DNS de votre sous-r\u00e9seau, vous permettant de personnaliser vos enregistrements PTR (pour les r\u00e9solutions inverses),<\/li>\n<li>Des possibilit\u00e9s de peering BGP si vous disposez de votre AS.<\/li>\n<\/ul>\n<p>M\u00eame si toutes ces fonctionnalit\u00e9s sont loin d&rsquo;\u00eatre indispensables pour un acc\u00e8s personnel&#8230; (c&rsquo;est le moins que l&rsquo;on puisse dire \ud83d\ude09 ), les deux premi\u00e8res sont tr\u00e8s all\u00e9chantes. Chez moi, j&rsquo;ai choisi d&rsquo;utiliser <a href=\"http:\/\/www.he.net\/\" target=\"_blank\">Hurricane Electric<\/a> (HE). Il propose l&rsquo;ensemble des services ci-dessus, pour la tr\u00e8s modique somme de 0 euros&#8230;<\/p>\n<p>La premi\u00e8re \u00e9tape est bien \u00e9videmment de s&rsquo;inscrire sur le site, puis de cr\u00e9er un tunnel (en choisissant le point d&rsquo;acc\u00e8s le plus proche de chez sois). Ce tunnel, comme je le disais pr\u00e9c\u00e9demment consiste \u00e0 encapsuler sur votre passerelle, tout le trafic IPv6 dans de l&rsquo;IPv4. Pour cela, il faudra donc \u00e9tablir une lisaison point \u00e0 point IPv4 entre votre passerelle et l&rsquo;autre bout du tunnel chez HE. Une fois celui-ci cr\u00e9\u00e9 depuis l&rsquo;interface web du site, HE vous indique alors les diff\u00e9rents param\u00e8tres d&rsquo;acc\u00e8s.<\/p>\n<ul>\n<li>Client IPv4 address : l&rsquo;adresse IPv4 de votre bout du tunnel (l&rsquo;adresse fournie par votre op\u00e9rateur),<\/li>\n<li>Server IPv4 address : l&rsquo;adresse IPv4 de l&rsquo;autre bout du tunnel (chez HE),<\/li>\n<li>Client IPv6 address : l&rsquo;adresse IPv6 publique que vous assigne HE,<\/li>\n<li>Server IPv6 address : l&rsquo;adresse IPv6 faisant office de passerelle chez HE (liaison point \u00e0 point).<\/li>\n<\/ul>\n<p>Ces param\u00e8tres, vous l&rsquo;aurez compris, vont vous permettre de monter le tunnel vers le point d&rsquo;acc\u00e8s HE. Sous OpenBSD, ce tunnel se concr\u00e9tisera par une interface virtuelle <a href=\"http:\/\/www.openbsd.org\/cgi-bin\/man.cgi?query=gif&amp;apropos=0&amp;sektion=0&amp;manpath=OpenBSD+Current&amp;arch=i386&amp;format=html\" target=\"_blank\">gif(4)<\/a>. Elle se configure tr\u00e8s simplement en ligne de commande (remplacez \u00e9videmment les adresses par celles fournies par HE) :<br \/>\n<code><br \/>\n$ sudo ifconfig gif0 tunnel &lt;client_ipv4&gt; &lt;server_ipv4&gt;<br \/>\n$ sudo ifconfig gif0 inet6 alias &lt;client_ipv6&gt; &lt;server_ipv6&gt; prefixlen 128<br \/>\n$ sudo route -n add -inet6 default &lt;server_ipv6&gt;<br \/>\n<\/code><br \/>\nEt pour automatiquement monter le tunnel au d\u00e9marrage, par un fichier \u00ab\u00a0\/etc\/hostname.gif0\u00a0\u00bb :<br \/>\n<code><br \/>\ntunnel &lt;client_ipv4&gt; &lt;server_ipv4&gt;<br \/>\ninet6 &lt;client_ipv6&gt; 128 &lt;server_ipv6&gt;<br \/>\n! \/sbin\/route add -inet6 default &lt;server_ipv6&gt;<br \/>\n<\/code><br \/>\nLorsque le tunnel est mont\u00e9 sur votre passerelle, cela signifie qu&rsquo;il est fonctionnel et que la passerelle dispose maintenant d&rsquo;un acc\u00e8s public IPv6. A noter que si vous souhaitez filtrer finement les flux du tunnel avec PF (ce qui est plus que recommand\u00e9), des lignes similaires (\u00e0 adapter en fonction de votre config) permettront d&rsquo;autoriser le tunnel sur votre interface physique en IPv4 (l&rsquo;interface gif0 verra le trafic IPv6 non encapsul\u00e9, comme s&rsquo;il venait d&rsquo;une connexion native) :<br \/>\n<code><br \/>\npass in on $ext_if proto ipv6 from $server_ipv4 to $ext_if<br \/>\npass out on $ext_if proto ipv6 from $ext_if to $server_ipv4<br \/>\n<\/code><br \/>\nPour le moment, nous disposons simplement d&rsquo;un acc\u00e8s IPv6 sur la passerelle. Pour votre r\u00e9seau interne, par d\u00e9faut, HE vous propose un sous-r\u00e9seau \/64 rout\u00e9. Mais comme je l&rsquo;expliquais en d\u00e9but de l&rsquo;article, c&rsquo;est insuffisant dans notre cas car nous souhaitons un \/48 pour pouvoir le fractionner et le router sur internet. Il sera donc n\u00e9cessaire de demander l&rsquo;assignation d&rsquo;un \/48 rout\u00e9. Cette op\u00e9ration ne prend que quelques secondes et s&rsquo;effectue en un clique sur l&rsquo;interface de gestion de votre compte HE.<\/p>\n<p>Ce \/48 se pr\u00e9sente sous la forme xxxx:yyyy:zzzz::\/48. C&rsquo;est ce sous-r\u00e9seau que nous allons fractionner. Ainsi on peut imaginer :<\/p>\n<ul>\n<li>xxxx:yyyy:zzzz:1::\/64 : r\u00e9seau local LAN,<\/li>\n<li>xxxx:yyyy:zzzz:2::\/64 : DMZ h\u00e9bergeant nos serveurs,<\/li>\n<li>xxxx:yyyy:zzzz:3::\/64 : r\u00e9seau Wifi personnel (si vous prenez le risque d&rsquo;utiliser IPv6 sur du wifi&#8230;),<\/li>\n<li>etc.<\/li>\n<\/ul>\n<p>Une adresse de ces sous-r\u00e9seaux est \u00e0 assigner \u00e0 chaque interface de la passerelle, dans un fichier \u00ab\u00a0\/etc\/hostname.if\u00a0\u00bb appropri\u00e9. Si vous souhaitez b\u00e9n\u00e9ficier de l&rsquo;autoconfiguration \u00ab\u00a0stateless\u00a0\u00bb, <a href=\"http:\/\/www.openbsd.org\/cgi-bin\/man.cgi?query=rtadvd&amp;apropos=0&amp;sektion=0&amp;manpath=OpenBSD+Current&amp;arch=i386&amp;format=html\" target=\"_blank\">rtadvd(8)<\/a> est fait pour vous. Par exemple, si vous souhaitez configurer vos machines du LAN local, ajoutez cette ligne au fichier \u00ab\u00a0\/etc\/rtadvd.conf\u00a0\u00bb (remplacer \u00ab\u00a0if\u00a0\u00bb par l&rsquo;interface sur laquelle vous souhaitez activer l&rsquo;autoconfiguration) :<br \/>\n<code><br \/>\nif:\\<br \/>\n:addr=\"xxxx:yyyy:zzzz:1::\":prefixlen#64:<\/code><\/p>\n<p>Ensuite vous pouvez activer d\u00e9finitivement rtadvd en ajoutant cette ligne dans le fichier \u00ab\u00a0\/etc\/rc.conf.local\u00a0\u00bb (remplacer \u00ab\u00a0if\u00a0\u00bb par l&rsquo;interface sur laquelle vous souhaitez activer l&rsquo;autoconfiguration) :<br \/>\n<code><br \/>\nrtadvd_flags=\"if\"<\/code><\/p>\n<p>Selon le trafic que vous souhaitez autoriser sur votre passerelle avec PF, il faut noter qu&rsquo;IPv6 n&rsquo;utilise pas le protocole ARP d&rsquo;IPv4 pour faire la r\u00e9solution entre adresse MAC et adresse IP sur un segment r\u00e9seau. Il utilise au contraire une nouvelle fonctionnalit\u00e9 apport\u00e9e par ICMPv6 (version d&rsquo;ICMP pour IPv6) qui est la d\u00e9couverte du voisinage (ND, Neighbor Discovery). Ce m\u00e9canisme repose sur deux types de paquets :<\/p>\n<ul>\n<li>La machine souhaitant communiquer avec une autre envoie un paquet de type \u00ab\u00a0Neighbor solicitation\u00a0\u00bb (icmp6-type neighbrsol dans PF),<\/li>\n<li>La machine concern\u00e9e r\u00e9pond par un paquet de type \u00ab\u00a0Neighbor advertisement\u00a0\u00bb (icmp-type neighbradv dans PF).<\/li>\n<\/ul>\n<p>Il faudra donc absolument autoriser ces paquets pour que les machines puissent communiquer. Des r\u00e8gles PF peuvent ainsi \u00eatre :<br \/>\n<code><br \/>\npass in on gif0 inet6 proto icmp6 icmp6-type neighbrsol<br \/>\n<\/code><\/p>\n<p>Ici on autorise juste le paquet neighbrsol : le paquet neighbradv retourn\u00e9 par l&rsquo;autre machine sera autoris\u00e9 par l&rsquo;\u00e9tat cr\u00e9\u00e9 par le premier paquet.<\/p>\n<p>De m\u00eame que si vous utilisez rtadvd et que vous souhaitez effectuer un filtrage fin, il faudra autoriser les paquets du m\u00e9canisme de d\u00e9couverte de routeur. Le principe :<\/p>\n<ul>\n<li>Le client envoie un paquet \u00ab\u00a0Router solicitation\u00a0\u00bb (icmp6-type routersol dans PF),<\/li>\n<li>Le routeur r\u00e9pond par un paquet \u00ab\u00a0Router advertisement\u00a0\u00bb (icmp6-type routeradv dans PF).<\/li>\n<\/ul>\n<p>Les r\u00e8gles peuvent ainsi \u00eatre :<br \/>\n<code><br \/>\npass in on $int_if inet6 proto icmp6 icmp6-type routersol<\/code><\/p>\n<p>De la m\u00eame fa\u00e7on que pour le m\u00e9canisme de ND pr\u00e9sent\u00e9 pr\u00e9c\u00e9demment, la r\u00e9ponse routeradv est automatiquement accept\u00e9e par PF, un \u00e9tat \u00e9tant cr\u00e9\u00e9 par le premier paquet.<\/p>\n<p>Il faut \u00e9galement noter qu&rsquo;avec IPv6, filtrer l&rsquo;ICMP est tr\u00e8s d\u00e9licat. La bonne pratique avec IPv4 est de ne pas le bloquer. Mais pour IPv6, plus qu&rsquo;une bonne pratique c&rsquo;est \u00e9galement une r\u00e8gle pour \u00e9viter d&rsquo;aller vers de gros probl\u00e8mes. Le meilleur exemple est le <a href=\"http:\/\/tools.ietf.org\/html\/rfc1981\" target=\"_blank\">\u00ab\u00a0Path MTU Discovery\u00a0\u00bb (PMTU)<\/a> qui se base sur les paquets ICMP \u00ab\u00a0Packet too big\u00a0\u00bb.<\/p>\n<p>Enfin, le dernier point \u00e0 aborder, le FTP. C&rsquo;est souvent le protocole qui pose probl\u00e8me. OpenBSD offre un outil tr\u00e8s utile pour automatiquement g\u00e9rer les connexions de donn\u00e9e avec PF : <a href=\"http:\/\/www.openbsd.org\/cgi-bin\/man.cgi?query=ftp-proxy&amp;apropos=0&amp;sektion=0&amp;manpath=OpenBSD+Current&amp;arch=i386&amp;format=html\" target=\"_blank\">ftp-proxy(8)<\/a>. En IPv4 le fonctionnement est assez naturel, mais avec IPv6 il y a quelques particularit\u00e9s \u00e0 prendre en compte. Prenons comme exemple un server FTP h\u00e9berg\u00e9 dans notre DMZ, que nous souhaitons rendre accessible en IPv6 depuis l&rsquo;ext\u00e9rieur.<\/p>\n<p>La page de manuel indique que lorsque ftp-proxy fonctionne en IPv6, l&rsquo;adresse par d\u00e9faut sur laquelle il \u00e9coute est ::1 (\u00e9quivalent de 127.0.0.1 pour IPv6). Or, un bug rend impossible les redirections IPv6 vers ::1. Il faudra donc rediriger avec PF le trafic sur une adresse globale, et non sur le localhost. Par exemple :<br \/>\n<code><br \/>\nanchor \"ftp-proxy\/*\"<br \/>\npass in quick inet6 proto tcp to port ftp rdr-to $client_ipv6 port 8021<\/code><\/p>\n<p>Ensuite, lorsque l&rsquo;on d\u00e9marre ftp-proxy, il faut lui passer les bons arguments pour qu&rsquo;il \u00e9coute sur l&rsquo;adresse en question et redirige le trafic sur notre serveur FTP :<br \/>\n<code><br \/>\n$ sudo \/usr\/sbin\/ftp-proxy -6 -b &lt;client_ipv6&gt; -R &lt;ftp_server&gt;<\/code><\/p>\n<p>Pour conclure cet article, il faut bien garder \u00e0 l&rsquo;esprit que les extraits de configuration dont je parle sont uniquement l\u00e0 pour am\u00e9liorer la compr\u00e9hension. Ils doivent \u00eatre finement adapt\u00e9s selon votre configuration, vos buts et la topologie de votre r\u00e9seau.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En ces temps o\u00f9 toutes \u00e9conomies sont bonnes \u00e0 prendre, je me suis attel\u00e9 \u00e0 mettre en place chez moi un \u00ab\u00a0vrai\u00a0\u00bb acc\u00e8s IPv6. Par vrai, je n&rsquo;entends pas un acc\u00e8s natif (ce serait trop beau, aucun op\u00e9rateur grand public fran\u00e7ais ne le propose \u00e0 l&rsquo;heure actuelle hormis Nerim dont l&rsquo;offre est tout de m\u00eame [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[99,100,92,110,111,112,91,6,109,7,113],"class_list":["post-110","post","type-post","status-publish","format-standard","hentry","category-informations-pour-les-geeks","tag-99","tag-100","tag-free","tag-ftp","tag-ftp-proxy","tag-hurricane-electric","tag-ipv6","tag-openbsd","tag-passerelle","tag-pf","tag-tunnel-broker"],"_links":{"self":[{"href":"https:\/\/blog.brimbelle.org\/index.php\/wp-json\/wp\/v2\/posts\/110","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.brimbelle.org\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.brimbelle.org\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.brimbelle.org\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.brimbelle.org\/index.php\/wp-json\/wp\/v2\/comments?post=110"}],"version-history":[{"count":0,"href":"https:\/\/blog.brimbelle.org\/index.php\/wp-json\/wp\/v2\/posts\/110\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.brimbelle.org\/index.php\/wp-json\/wp\/v2\/media?parent=110"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.brimbelle.org\/index.php\/wp-json\/wp\/v2\/categories?post=110"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.brimbelle.org\/index.php\/wp-json\/wp\/v2\/tags?post=110"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}