{"id":4706,"date":"2025-12-22T11:00:00","date_gmt":"2025-12-22T10:00:00","guid":{"rendered":"https:\/\/www.unicoda.com\/?p=4706"},"modified":"2025-12-18T17:45:20","modified_gmt":"2025-12-18T16:45:20","slug":"v6-sinvite-au-demenagement","status":"publish","type":"post","link":"https:\/\/www.unicoda.com\/?p=4706","title":{"rendered":"V6 s&rsquo;invite au d\u00e9m\u00e9nagement"},"content":{"rendered":"\n<p>Un d\u00e9m\u00e9nagement. Une id\u00e9e simple quand on y pense: il suffit de d\u00e9placer des choses d&rsquo;un point A vers un point B. Dans les faits, des objets \u00e0 ranger dans des cartons en vu du transport, des meubles \u00e0 vider, \u00e0 d\u00e9placer, de l&rsquo;aide \u00e0 trouver (un meuble m\u00eame vide, p\u00e8se son poids), le tout \u00e0 planifier et \u00e0 ordonnancer pour terminer \u00e0 temps. Et bien s\u00fbr, au milieu de tout \u00e7a, des ordinateurs, switchs et router, bref, l&rsquo;infrastructure qui h\u00e9berge mon lot de service \u00e0 arr\u00eater, d\u00e9placer et \u00e0 reconnecter ailleurs, possiblement dans un nouveau r\u00e9seau. Au moment o\u00f9 j&rsquo;\u00e9cris ces lignes, pas loin de 24 mois se sont \u00e9coul\u00e9s depuis que j&rsquo;ai eu \u00e0 d\u00e9placer mon homelab.<\/p>\n\n\n\n<p>Occup\u00e9 par l&rsquo;organisation de mon d\u00e9m\u00e9nagement, je n&rsquo;avais pas pris le temps d&rsquo;anticiper le d\u00e9placement de mon infra, en la migrant temporairement dans une machine virtuelle chez un h\u00e9bergeur. Bien qu&rsquo;ayant automatis\u00e9 la majeure partie du d\u00e9ploiement, je savais que cela n\u00e9cessiterait plusieurs v\u00e9rifications, notamment que les processus de sauvegarde se soient bien remis en place. M\u00eame chose pour le renouvellement des certificats, sans parler des adaptations n\u00e9cessaires sur les scripts ansible, si j&rsquo;en avais profit\u00e9 pour passer sur une version plus r\u00e9cente de Debian. Bref, pas suffisamment de temps \u00e0 d\u00e9dier au sujet. J&rsquo;ai donc attendu jusqu&rsquo;au dernier moment, avant d&rsquo;arr\u00eater mon homelab et de d\u00e9placer ses composants, avec bien entendu, un temps d&rsquo;indisponibilit\u00e9 dans l&rsquo;intervalle, jusqu&rsquo;\u00e0 reconnecter le tout dans le nouveau r\u00e9seau.<\/p>\n\n\n\n<p>La bonne nouvelle, c&rsquo;est que tout a red\u00e9marr\u00e9 correctement, pas de casse pendant le d\u00e9placement, pas de stockage corrompu, tout a fonctionn\u00e9 \u00e0 merveille. La mauvaise, c&rsquo;est que le r\u00e9seau d&rsquo;arriv\u00e9e comportait des nouveaut\u00e9s ! Le r\u00e9seau que je quittais \u00e9tait enti\u00e8rement sous mon contr\u00f4le. En effet, j&rsquo;avais r\u00e9ussi \u00e0 utiliser mon propre router \u00e0 la place de la livebox du FAI et je disposais alors d&rsquo;une IPv4 d\u00e9di\u00e9e. Dynamique, mais relativement fixe; avec un dynamique DNS bien configur\u00e9 pour pouvoir contacter mes services, m\u00eame en cas de changement d&rsquo;IP. En changeant de r\u00e9seau, je me retrouvais \u00e0 devoir exposer mon homelab derri\u00e8re une box de FAI et, oh surprise, j&rsquo;ai vu arriver de l&rsquo;IPv6, et d\u00e9couvert que le point d&rsquo;entr\u00e9e dans le r\u00e9seau, la box du FAI, ne disposait pas d&rsquo;une adresse IPv4 pour son seul usage, mais d&rsquo;une IPv4 partag\u00e9e entre plusieurs box. Cette technique portant le nom de CGNAT pour Carrier-Grade Network Address Translation.<\/p>\n\n\n\n<p>Impossible donc de contacter mes services en v4, j&rsquo;ai adapt\u00e9 mes plans pour faire fonctionner le tout en v6. Apr\u00e8s quelques essais, la connectivit\u00e9 vers mon homelab \u00e9tait r\u00e9tablie. Tout aurait pu s&rsquo;arr\u00eater l\u00e0 si je n&rsquo;avais pas constat\u00e9, quelques jours plus tard, que mes services \u00e9taient inaccessibles depuis un r\u00e9seau que j&rsquo;utilisais r\u00e9guli\u00e8rement durant cette p\u00e9riode. La raison la plus probable: pas d&rsquo;IPv6 sur ce r\u00e9seau et aucun m\u00e9canisme de compatibilit\u00e9 entre v6 et v4. Mes cours de r\u00e9seaux sur IPv6 semblaient bien loin. Ni une, ni deux, j&rsquo;ai donc enfourch\u00e9 mon renard de feu \u00e0 la recherche de solutions \u00e0 mon probl\u00e8me.<\/p>\n\n\n\n<p>Apr\u00e8s plusieurs lectures pour comprendre ce fameux CGNAT, je suis arriv\u00e9 \u00e0 la conclusion qu&rsquo;il allait me falloir un point relais capable de recevoir du trafic en IPv4 et de le transf\u00e9rer vers mon r\u00e9seau via IPv6. Je me suis alors souvenu que Google, dans sa plateforme cloud, propose des network load balancers intervenant au niveau de la couche TCP, soit bien plus bas que le proxy dont je me sers dans mon infrastructure pour faire de la terminaison SSL sur du trafic HTTPS. En continuant mes recherches autour de la notion de proxy passthrough, j&rsquo;ai d\u00e9couvert que je pouvais configurer un serveur HAProxy, de telle sorte qu&rsquo;il puisse recevoir du trafic HTTPS en IPv4 et IPv6 et le rediriger vers une adresse IPv6, sans que celui-ci ait besoin de toucher \u00e0 la couche HTTPS, et donc sans avoir \u00e0 reconfigurer les certificats de mes noms de domaines au niveau de ce proxy. Une fois connu, cela semble \u00e9vident.<\/p>\n\n\n\n<p>Au final, la solution aura \u00e9t\u00e9 relativement simple et rapide \u00e0 mettre en place. Commander un petit VPS disposant d&rsquo;une IPv4, modifier les DNS pour faire pointer les noms de domaines vers ce serveur pour le trafic en v4, installer HAProxy et le configurer en mode proxy passthrough. Pour le trafic en v6, on peut au choix utiliser le m\u00eame proxy, ou d\u00e9clarer directement l&rsquo;IPv6 du serveur cible dans les DNS. Cette solution m&rsquo;aura donc permis de r\u00e9tablir rapidement l&rsquo;acc\u00e8s \u00e0 mes services quel que soit le r\u00e9seau (v4 ou v6), et surtout, avec pratiquement pas de modification du c\u00f4t\u00e9 de mon infrastructure auto-h\u00e9berg\u00e9.<\/p>\n\n\n\n<p>Pour terminer, voici la configuration utilis\u00e9e au niveau de HAProxy (\/etc\/haproxy\/haproxy.cfg) pour mettre en \u0153uvre la solution trouv\u00e9e:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>global\n\tlog \/dev\/log\tlocal0\n\tlog \/dev\/log\tlocal1 notice\n\tchroot \/var\/lib\/haproxy\n\tstats socket \/run\/haproxy\/admin.sock mode 660 level admin\n\tstats timeout 30s\n\tuser haproxy\n\tgroup haproxy\n\tdaemon\n\n\t# Default SSL material locations\n\tca-base \/etc\/ssl\/certs\n\tcrt-base \/etc\/ssl\/private\n\n\t# See: https:\/\/ssl-config.mozilla.org\/#server=haproxy&amp;server-version=2.0.3&amp;config=intermediate\n\tssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384\n\tssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256\n\tssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets\n\ndefaults\n\tlog\tglobal\n\tmode\thttp\n\toption\thttplog\n\toption\tdontlognull\n\ttimeout connect 5000\n\ttimeout client  50000\n\ttimeout server  50000\n\terrorfile 400 \/etc\/haproxy\/errors\/400.http\n\terrorfile 403 \/etc\/haproxy\/errors\/403.http\n\terrorfile 408 \/etc\/haproxy\/errors\/408.http\n\terrorfile 500 \/etc\/haproxy\/errors\/500.http\n\terrorfile 502 \/etc\/haproxy\/errors\/502.http\n\terrorfile 503 \/etc\/haproxy\/errors\/503.http\n\terrorfile 504 \/etc\/haproxy\/errors\/504.http\n\nfrontend www_https\n\tbind *:443 v4v6\n\tmode tcp\n\toption tcplog\n\tdefault_backend backend_servers\n\nbackend backend_servers\n\tmode tcp\n\t# balance roundrobin\n\toption ssl-hello-chk\n\t# TODO: replace ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff with the target IPv6\n\tserver server1 &#91;ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff]:443 verify none\n\nfrontend http_in\n\tbind :::80 v4v6\n\toption forwardfor\n\tdefault_backend http_back\n\nbackend http_back\n\t# TODO: replace ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff with the target IPv6\n\tserver server2 &#91;ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff]:80<\/code><\/pre>\n\n\n\n<p>Sources:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/webhostinggeeks.com\/howto\/how-to-configure-haproxy-with-ssl-pass-through\/\" data-type=\"link\" data-id=\"https:\/\/webhostinggeeks.com\/howto\/how-to-configure-haproxy-with-ssl-pass-through\/\">How to Configure HAProxy with SSL Pass-Through<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/webhostinggeeks.com\/howto\/how-to-configure-haproxy-with-ipv6-support\/\" data-type=\"link\" data-id=\"https:\/\/webhostinggeeks.com\/howto\/how-to-configure-haproxy-with-ipv6-support\/\">How to Configure HAProxy with IPv6 Support<\/a><\/li>\n<\/ul>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Un d\u00e9m\u00e9nagement. Une id\u00e9e simple quand on y pense: il suffit de d\u00e9placer des choses d&rsquo;un point A vers un point B. Dans les faits, des objets \u00e0 ranger dans des cartons en vu du transport, des meubles \u00e0 vider, \u00e0 d\u00e9placer, de l&rsquo;aide \u00e0 trouver (un meuble m\u00eame vide, p\u00e8se son poids), le tout &hellip; <a href=\"https:\/\/www.unicoda.com\/?p=4706\" class=\"more-link\">Continuer la lecture<span class=\"screen-reader-text\"> de &laquo;&nbsp;V6 s&rsquo;invite au d\u00e9m\u00e9nagement&nbsp;&raquo;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[337],"tags":[614,359,613],"class_list":["post-4706","post","type-post","status-publish","format-standard","hentry","category-auto-hebergement","tag-cgnat","tag-haproxy","tag-load-balancer"],"_links":{"self":[{"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/posts\/4706","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4706"}],"version-history":[{"count":3,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/posts\/4706\/revisions"}],"predecessor-version":[{"id":4709,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/posts\/4706\/revisions\/4709"}],"wp:attachment":[{"href":"https:\/\/www.unicoda.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4706"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4706"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4706"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}