diff --git a/content/post/use-additional-ipv6-blocks-from-isp.md b/content/post/use-additional-ipv6-blocks-from-isp.md new file mode 100644 index 0000000..2ab2210 --- /dev/null +++ b/content/post/use-additional-ipv6-blocks-from-isp.md @@ -0,0 +1,70 @@ +--- +title: Utiliser les plages IPv6 supplémentaires du réseau Free et Orange +date: !!timestamp '2023-04-05 14:43:00' +tags: +- network +- ipv6 +- freebox +--- + +Chez Free et Orange, lorsque l'on n'a pas désactivé l'IPv6 les Freebox (et certaines Livebox) mettent à disposition des équipements connectés une plage d'IPv6 /64. +Mais il se trouve en fait que c'est une plage /60 qui est mise à disposition et utilisable par chaque abonné. +Cela représente en tout 8 réseaux /64 adressables. +Voyons à quoi cela peut-il bien servir et comment les utiliser. + + + +# Rappels IPv6 + +Contrairement à l'IPv4, avec des IPv6 on évite de faire du NAT, c'est-à-dire que l'on attribue à chaque machine sur le réseau une adresse IPv6 directement routable sur Internet. +Bien entendu il est toujours nécessaire de passer par le routeur (la box) qui sert alors de simple passerelle vers Internet. + +En IPv6, les équipements sont capables de choisir eux-même leur IP, sans l'aide du protocole DHCP. +Cela est possible car le routeur émet régulièrement les informations du sous-réseau dans lequel on se trouve (il s'agit du [Router Advertisement (RA)](https://en.wikipedia.org/wiki/Router_advertisement)). + +Pour notre expérience, prenons le lab suivant : + +![L´infrastructure de base qui va nous servir à faire nos expérimentations](lab.png) + +Nous avons tous nos équipements reliés à la box et une série de machines virtuelles hébergées sur l'une des machines du réseau. + +À ce stade, si l'on veut que nos machines virtuelles soient joignables depuis Internet en IPv6, on est obligé de configurer le réseau de l'hyperviseur en mode *bridge*.\ +En effet si le réseau de nos machines virtuelles est distinct du réseau de la box, celle-ci ne sera pas en mesure de communiquer avec nos machines virtuelles. En utilisant le mode *bridge*, on simule le fait que la machine virtuelle est directement reliée à la box, ou à un switch. En tous cas aucun équipement nécessitant de faire du routage. + +Si nos machines virtuelles sont uniquement des clients IPv6 et n'ont pas vocation à servir directement du contenu sur Internet, cette solution est tout-à-fait acceptable. Mais si on veut servir du contenu, on pourrait vouloir segmenter notre réseau pour tenter d'isoler les équipements. + + +# Segmenter le réseau de la box + +Du fait du très grand nombre d'adresses IPv6 publiques que nos opérateurs nous fournissent, on pourrait commencer par vouloir segmenter notre réseau entre nos serveurs virtuels et nos autres équipements : chacun serait dans un sous-réseau séparé. + +L'intérêt principal de cette segmentation serait d'éviter que tout ce petit monde partage le même sous-réseau : comme ils peuvent tous communiquer directement entre-eux, il est plus compliqué de filtrer efficacement les échanges malveillant. Par exemple si l'une des machines virtuelles exposée sur Internet est compromise, elle peut accéder à tous nos équipements locaux (téléphones, objects connectés, ...) qui ne sont pas forcément sécurisés, ou inversement, un objet du réseau peut se mettre à intercepter tout le trafic des machines virtuelles en se faisant passer pour la box. + +On pourrait donc vouloir segmenter son réseau comme cela : + +![Exemple de segmentation par le partage du bloc /64 en deux blocs /65](lab-segmente.png) + +On réserverait la moitié du bloc /64 aux équipements réels du réseau et on attribuerait l'autre moitié à nos machines virtuelles situées sur un serveur/Raspberry Pi. + +Malgré le très grand nombre d'adresses IPv6 que l'on peut attribuer, il n'est pas évident de subdiviser notre /64 pour l'attribuer à un routeur secondaire ou un serveur de machines virtuelles. Cette segmentation n'est en effet pas possible sans changer la configuration de la box car celle-ci s'attend à pouvoir joindre nos machines virtuelles directement, sans passer par une machine/hôte/routeur intermédiaire. + +Cependant nous avons accès aux paramètres de routage des 7 autres blocs /64 distribués par l'opérateur. Nous pouvons par exemple en attribuer un à l'hôte de nos machines virtuelles. + + +# Déléguer un préfixe IPv6 supplémentaire + +Comme on le disait en introduction, certains opérateurs mettent à disposition de leur abonnés une plage d'adresses IPv6 bien plus grande que le bloc /64 du réseau principal. + +Certaines box permettent en outre de tirer parti des blocs complémentaires en proposant de déléguer les autres blocs à des machines du réseau. + +Concrètement, cela signifie que lorsque la box recevra un paquet à destination d'un des blocs délégués, elle ne le traitera pas elle-même, elle le transmettra à la machine désignée comme destinataire. En d'autres termes, elle routera le trafic de ce bloc vers le routeur désigné. Et ce n'est pas forcément compliqué ! + + +# Différents cas d'usage + +Maintenant que l'on a vu la théorie, voyons justement différents cas d'usage, pour ne pas nous limiter à nos machines virtuelles : + +- Utiliser un bloc /64 pour donner de l'IPv6 à ses machines virtuelles +- [Utiliser un bloc /64 pour donner de l'IPv6 à ses conteneurs Docker]({{< relref "use-ipv6-in-docker.md" >}}) +- Utiliser un bloc /64 pour avoir de l'IPv6 dans plusieurs sous-réseaux isolés +- Utiliser un bloc /64 pour avoir de l'IPv6 publique dans son tunnel Wireguard diff --git a/content/post/use-ipv6-in-docker.md b/content/post/use-ipv6-in-docker.md new file mode 100644 index 0000000..3e10eb8 --- /dev/null +++ b/content/post/use-ipv6-in-docker.md @@ -0,0 +1,138 @@ +--- +title: Donner une connectivité IPv6 à ses conteneurs Docker en utilisant un bloc d'IPv6 de son opérateur +date: !!timestamp '2023-05-04 15:10:00' +tags: +- network +- ipv6 +- docker +--- + +Il peut paraître étonnant qu'un service moderne comme Docker n'offre pas d'IPv6 dans les conteneurs par défaut, en particulier lorsqu'on se trouve dans un réseau avec de l'IPv6. + +En fait, pour la même raison que nous avons vu dans [l'article introductif]({{< relref "use-additional-ipv6-blocks-from-isp.md" >}}), étant donné que les conteneurs se trouvent dans un réseau virtuel, ils ne peuvent pas être joignables par la box/le routeur distribuant le sous-réseau IPv6. + + + +On observe d'ailleurs le même phénomène avec l'IPv4 : chaque conteneur dispose d'une IPv4 dans un sous-réseau distinct de celui dans lequel se trouve notre machine hôte. + +![Illustration d´un réseau domestique IPv4 classique](common-network-with-docker.png) + +Pour que les conteneurs aient accès à Internet dans ces conditions, en IPv4 du NAT est mis en œuvre : + +``` +42sh$ iptables -t nat -vnL POSTROUTING +Chain POSTROUTING (policy ACCEPT 3 packets, 228 bytes) + pkts bytes target prot opt in out source destination +14713 978K MASQUERADE all -- * !docker0 172.17.0.0/16 0.0.0.0/0 +``` + +Comme on ne fait généralement pas de NAT sur les IPv6, rien de similaire n'est fait par Docker dans ce sens. + + +# Docker comme routeur IPv6 + +Sans IPv6 dans un conteneur, il est impossible pour les conteneurs de s'adresser à d'autres services écoutant exclusivement en IPv6 sur Internet. + +Afin que les programmes conteneurisés puissent se connecter à d'autres services en IPv6, il convient d'activer l'option *Enable IPv6* et de définir le préfixe à utiliser au travers de l'option *IPv6 Prefix*. + +Attention, ce n'est pas tout de définir ces options, il faut aussi que la box route correctement les paquets à destinations des conteneurs vers votre machine. + +C'est pour cela que nous avons besoin de tirer parti des autres blocs d'IPv6 fournis par notre opérateur. En indiquant à la box l'adresse de notre machine hébergeant nos conteneurs, elle y routera tous les paquets à destination des conteneurs sans poser de question. + +Tout ne peut donc pas se faire exclusivement sur la machine, le réseau doit aussi être configuré. Commençons d'ailleurs par cela. + + +# Paramétrer la délégation de préfixe IPv6 sur la Freebox + +La box va nous demander l'adresse (IPv6) vers laquelle elle devra router les paquets. On indique généralement une [IP de lien local](https://en.wikipedia.org/wiki/Link-local_address). + +On commence donc par regarder quelle est notre IPv6 locale sur le lien sortant vers la box. + +⚠️ Attention toutes les interfaces ont une adresse locale, elles commencent toutes par `fe80:`, elles ne sont valables que sur la carte réseau considérée. Si vous récupérez la mauvaise adresse, il ne se passera rien (cela ne cassera pas votre réseau pour autant). + +Dans mon cas, c'est l'interface `eth0` qui est connectée à la box : + +``` +42sh$ ip address show eth0 +2: eth0: mtu 1500 qdisc mq state UP group default qlen 1000 + link/ether fd:54:01:98:cd:ba brd ff:ff:ff:ff:ff:ff + inet 192.168.0.42/24 brd 192.168.0.255 scope global dynamic noprefixroute eth0 + valid_lft 35141sec preferred_lft 35141sec + inet6 2a01:...:2420:24ac:f101:c280:50c2/64 scope global noprefixroute + valid_lft forever preferred_lft forever + inet6 fe80::5a43:3580:173c:395e/64 scope link noprefixroute + valid_lft forever preferred_lft forever +``` + +Mon IP locale est donc `fe80::5a43:3580:173c:395e`. + +C'est cette IP que je vais indiquer dans la configuration de la box. + +Sur les Freebox, la fenêtre de paramétrage des préfixes supplémentaires se trouve dans « Paramètres de la Freebox », « Configuration IPv6 », sous l'onglet « Général ». C'est le cadre « Délégation de préfixe » qui va nous intéresser. + +Cela ressemble à ça : + +![Fenêtre de paramétrage de la délégation de préfixe IPv6 de la Freebox](freebox-ipv6-prefix-delegation.png) + +Laissez toujours le 1ᵉʳ champ vide, sans quoi la box ne vous proposera plus d'IPv6 sur le réseau principal. + +Indiquez dans le 1ᵉʳ champ vide suivant (le deuxième a priori donc !) l'adresse locale récupérée plus tôt. + +C'est tout ! Le plus dur est passé. Voyons maintenant la configuration de Docker. + + +# Paramétrer Docker pour l'IPv6 + +Nous n'allons pas utiliser la plage à laquelle notre machine est connectée. Nous allons utiliser toute une plage /64, celle pour laquelle on a donné l'IP locale de notre machine à la box. + +![Notre délégation de préfixe correctement paramétrée sur la Freebox](freebox-ipv6-delegation-filled.png) + +Selon la capture d'écran précédente, notre fichier de configuration `/etc/docker/daemon.json` devrait ressembler à : + +``` +{ + "ipv6": true, + "fixed-cidr-v6": "2a01:1234:abcd:2421::/64" +} +``` + +On relance Docker et on peut tester : + +``` +42sh$ docker run -it alpine +/ # ip address show eth0 +58: eth0@if59: mtu 1500 qdisc noqueue state UP + link/ether 02:42:ac:11:00:09 brd ff:ff:ff:ff:ff:ff + inet 172.17.0.9/16 brd 172.17.255.255 scope global eth0 + valid_lft forever preferred_lft forever + inet6 2a01:1234:abcd:2421:0:242:ac11:9/64 scope global flags 02 + valid_lft forever preferred_lft forever + inet6 fe80::42:acff:fe11:9/64 scope link + valid_lft forever preferred_lft forever +``` + +Si vous avez une IPv6 en plus de l'IPv4 habituelle, c'est que Docker est correctement configuré. Pour savoir si la configuration côté box a réussi, lançons un `ping` dans le conteneur : + +``` +/ # ping ping6.online.net +PING ping6.online.net (2001:bc8:1::40): 56 data bytes +64 bytes from 2001:bc8:1::40: seq=0 ttl=52 time=11.008 ms +64 bytes from 2001:bc8:1::40: seq=1 ttl=52 time=8.822 ms +^C +--- ping6.online.net ping statistics --- +2 packets transmitted, 2 packets received, 0% packet loss +round-trip min/avg/max = 8.822/9.915/11.008 ms +``` + +Si le ping répond, c'est tout bon : vos conteneurs auront désormais accès à et seront accessibles en IPv6. + + +# Autres cas d'usage + +Ce billet fait partie d'une série de billets sur l'usage des plages d'IPv6 supplémentaires : + +- [Introduction : Utiliser les plages IPv6 supplémentaires du réseau Free et Orange]({{< relref "use-additional-ipv6-blocks-from-isp.md" >}}) +- Utiliser un bloc /64 pour donner de l'IPv6 à ses machines virtuelles +- Utiliser un bloc /64 pour donner de l'IPv6 à ses conteneurs Docker +- Utiliser un bloc /64 pour avoir de l'IPv6 dans plusieurs sous-réseaux isolés +- Utiliser un bloc /64 pour avoir de l'IPv6 publique dans son tunnel Wireguard diff --git a/static/post/use-additional-ipv6-blocks-from-isp/lab-segmente.png b/static/post/use-additional-ipv6-blocks-from-isp/lab-segmente.png new file mode 100644 index 0000000..83255e8 Binary files /dev/null and b/static/post/use-additional-ipv6-blocks-from-isp/lab-segmente.png differ diff --git a/static/post/use-additional-ipv6-blocks-from-isp/lab.png b/static/post/use-additional-ipv6-blocks-from-isp/lab.png new file mode 100644 index 0000000..b62dd26 Binary files /dev/null and b/static/post/use-additional-ipv6-blocks-from-isp/lab.png differ diff --git a/static/post/use-ipv6-in-docker/common-network-with-docker.png b/static/post/use-ipv6-in-docker/common-network-with-docker.png new file mode 100644 index 0000000..3832178 Binary files /dev/null and b/static/post/use-ipv6-in-docker/common-network-with-docker.png differ diff --git a/static/post/use-ipv6-in-docker/freebox-ipv6-delegation-filled.png b/static/post/use-ipv6-in-docker/freebox-ipv6-delegation-filled.png new file mode 100644 index 0000000..517c01a Binary files /dev/null and b/static/post/use-ipv6-in-docker/freebox-ipv6-delegation-filled.png differ diff --git a/static/post/use-ipv6-in-docker/freebox-ipv6-prefix-delegation.png b/static/post/use-ipv6-in-docker/freebox-ipv6-prefix-delegation.png new file mode 100644 index 0000000..d24eb1b Binary files /dev/null and b/static/post/use-ipv6-in-docker/freebox-ipv6-prefix-delegation.png differ