Le blog en IPv6 : ça aurait du être simple et pourtant…

Posted by

C’est l’histoire d’un collègue de boulot

C’est l’histoire d’un collègue de boulot, qui me dit :

Dis donc zwindler, avec toute la veille que tu fais sur ton blog, comment se fait-il qu’il ne soit toujours pas accessible en IPv6 !?

Damned… Il a raison le bougre !

Mauvaise réponse : par flemme.

Encore plus mauvaise réponse : parce que ce n’est pas aussi trivial à implémenter que ça devrait l’être…

Allez, je vous embarque !

D’abord mon infra…

J’vais sauter tout de suite le topo comme quoi IPv6 c’est important et surtout là depuis quasiment 25 ans, que IPv4 est dead depuis un an ou deux, qu’IPv6 c’est pas compliqué en vrai (la partie théorique j’entends ; la pratique on va en parler). De toute façon, les tweets récents de @davlgd me laissent à penser qu’un article sur NextInpact devrait sortir à ce sujet dans peu de temps ;-).

J’ai changé une énième fois d’infra pour mes besoins persos et me retrouve maintenant avec un serveur hébergé à la maison pour le gros de mes besoins perso, ainsi que deux machines plus modestes (des Atom 2 cœurs, 4 Go) que je loue pour une bouchée de pain pour avoir un cluster Proxmox VE et des réplications ZFS.

(Oui je ferai un article pour en parler… promis… un jour… peut être).

On commence déjà pas super bien : mon opérateur Internet ne me propose pas d’IPv6. Impossible donc de proposer mon blog en IPv6 si je l’héberge depuis chez moi.

Ça tombe bien (sort of), j’ai préféré le laisser sur une des deux machines Atom que je loue, qui suffisent vu le peu de charge que représente le blog. Je pars du principe que les hébergeurs ont de meilleurs taux de dispos que ma maison bourrée de SPOF. L’histoire ne me donne pas forcément raison, mais passons.

OneProvider

Est-ce que ces machines peuvent être en IPv6 ?

Je me suis pris la tête avec le support de OneProvider à plusieurs reprises, mais punaise, ils sont tellement peu chers… J’avais dit « plus jamais ! », mais des Atom à 6€ / mois pour 4 Go de RAM et un stockage correct… C’est quasiment impossible de trouver mieux.

Si on se contente de regarder ce qu’on a pour ce prix là, « la question elle est vite répondue ». Il n’y a pas d’IPv6 dans l’interface et on ne peut pas en commander. On est cuit…

Plot twist

Bon ben voilà, pas de solution, fin de l’article.

… Mais non !

Car quand on connait un peu les machines à Paris et à Amsterdam de OneProvider, on sait que ce sont en fait des serveurs de chez Online (Scaleway), vendus en marque blanche.

Et là l’espoir renait car Online ne le met pas en avant sur son site directement, mais dans le wiki il est dit que

La totalité des réseaux Online/Dedibox est compatible IPv6, et les futurs déploiements auront également de l’IPv6 par défaut.

https://documentation.online.net/fr/dedicated-server/network/ipv6/start

Un petit mail au support

Je prends mon courage à deux mains et j’écris au support, en espérant que ça ne finisse pas comme les fois précédentes à les engueuler comme du poisson pourri, car ils m’ont dit que « oui oui c’est possible » et finalement me la mette à l’envers avec des options payantes qui ne me servent à rien et qu’on ne peut pas annuler…

Bonne surprise, cette fois-ci :

OK. On peut donc avoir un bloc en IPv6 (un /64 alors que c’est un /56 chez Online, mais on ne va pas faire les fines bouches) tout en gardant l’IPv4 (j’ai préféré leur demander confirmation, connaissant les zozos).

Les seules difficultés sont donc que l’IP doit être assignée avec un client DHCP (mkay) et qu’on ne peut pas faire de rDNS. Dans mon cas, juste pour que le blog soit en IPv6, c’est suffisant.

Une fois que j’ai indiqué que c’était bon pour moi, le support m’a rapidement envoyé un /64 ainsi qu’un DUID pour le DHCP.

La configuration du DHCP

A partir de là, le « fun » a pu commencer.

D’abord, il a fallu trouver comment configurer dhclient pour chopper correctement mon IPv6. Heureusement on trouve assez vite de l’aide sur le net, notamment sur le wiki d’Online (et ça tombe bien vu que je suis chez eux).

https://documentation.online.net/en/dedicated-server/network/ipv6/prefix

Long story short; sur des distribs récentes (notamment Proxmox), le plus « simple » est de créer un service systemd qui se lancera au démarrage juste après le réseau

cat > /etc/systemd/system/dhclient.service << EOF
[Unit]
Description=dhclient for sending DUID IPv6
After=network-online.target
Wants=network-online.target
[Service]
Restart=always
RestartSec=10
Type=forking
ExecStart=/sbin/dhclient -cf /etc/dhcp/dhclient6.conf -6 -P -v vmbr0
ExecStop=/sbin/dhclient -x -pf /var/run/dhclient6.pid
[Install]
WantedBy=network.target
EOF
cat /etc/dhcp/dhclient6.conf
interface "vmbr0" {
send dhcp6.client-id VOTRE:DUID;
request;
}

Vous remarquerez peut-être que, contrairement à l’article du wiki d’Online, je n’utilise pas l’interface réseau physique (enp0s20 dans mon cas) mais un bridge (vmbr0). En fait, on a pas trop le choix (sauf si j’ai mal compris), car on va « brancher » nos VMs sur un bridge pour leur affecter des IPv6 et je n’ai pas réussi à faire marcher ça lorsque l’interface qui porte le /64 n’était pas aussi le bridge. Si vous avez mieux, je prend les suggestions.

La « blague » dans l’histoire, c’est que je n’utilise pas du tout cette configuration réseau dans laquelle l’IP de l’hyperviseur est portée par un bridge pour la partie IPv4 (moi j’utilise ça).

Deuxième blague, impossible de faire marcher ça avec un bridge open-vswich ce qui est pourtant vachement plus fun, notamment pour la possibilité d’ajouter des liens GRE entre nodes et ainsi avoir un LAN virtuel unifié dans tout le cluster.

J’ai donc dû REFAIRE tout mon fichier /etc/network/interfaces

Le réseau, du coup

J’ai suivi sans succès plusieurs tutos (dont celui-ci, celui-là et celui-là). Le dernier était pourtant particulièrement prometteur puisque utilisant à la fois Online et Proxmox… mais rien n’y a fait. Je me suis coupé la patte un nombre incalculable de fois…

trolololo lololo lololooooo
cat /etc/network/interfaces
auto lo
iface lo inet loopback
auto enp0s20
iface enp0s20 inet manual
auto vmbr0
iface vmbr0 inet static
address VOTRE.IP.V.4/24
gateway GATEWAY.IP.V.4
bridge-ports enp0s20
bridge-stp off
bridge-fd 0
iface vmbr0 inet6 static
address VOTRE:IP:V:6::1/64
#ONLINE.NET specific throttling
post-up  ip6tables -A OUTPUT -p udp --dport 547 -m limit --limit 10/min --limit-burst 5 -j ACCEPT
post-up  ip6tables -A OUTPUT -p udp --dport 547 -j DROP
allow-ovs vmbr1
iface vmbr1 inet static
... blablabla
#La partie masquerading sur un Open vSwitch comme indiquée dans https://pve.proxmox.com/wiki/Network_Configuration#_masquerading_nat_with_tt_span_class_monospaced_iptables_span_tt

On se retrouve avec un genre de monstre de Frankenstein avec une carte enp0s20 slave d’un bridge (vmbr0) qui sert aussi de bridge pour nos containers IPv6, et d’un bridge (vmbr1) open vswitch pour ce qui reste en v4 et les communications inter-nodes.

Gavé bien !

Notez les iptables v6 en « post-up » dans la partie v6 du vmbr0.

        #ONLINE.NET specific throttling
post-up  ip6tables -A OUTPUT -p udp --dport 547 -m limit --limit 10/min --limit-burst 5 -j ACCEPT
post-up  ip6tables -A OUTPUT -p udp --dport 547 -j DROP

D’expérience, ça ne sert à rien. Mais c’est conseillé par Online dans son wiki sur IPv6. Personnellement je n’ai vu aucun impact positif en ajoutant ces lignes.

Et ça marche maintenant ?

Ben non, bien sûr. Il va falloir modifier quelques options dans sysctl (notamment le forwarding pour IPv6)

vi /etc/sysctl.conf
net.ipv6.conf.all.forwarding=1
net.ipv6.conf.default.forwarding = 1
net.ipv6.conf.all.proxy_ndp = 1
net.ipv6.conf.default.proxy_ndp = 1

Sur les recommandations du wiki d’Online (IPv6 SLAAC), j’ai rajouté les paramètres suivants :

#Online specific (SLAAC)
net.ipv6.conf.vmbr0.autoconf = 0
net.ipv6.conf.vmbr0.accept_ra = 2

Pas sûr que ce soit très efficace, j’ai vu d’autres procédures mettre accept_ra à 1. Je vous laisse tester les deux.

Mais ça ne suffit pas, parce que quelqu’un (pas trop sûr de qui) a décidé de rajouter des paramètres par défaut qui bloquent l’IPv6 sur ces serveurs. Malin !

J’ai été sauvé par ce Gist de DonSYS91 (MERCI !) qui indique une partie des pièces manquantes à mon puzzle.

D’abord dans /etc/modprobe.d/local.conf, il y a une ligne ipv6 disable à 1, qu’il faut passer à 0… Si vous ne changez pas cette valeur, peu importe ce que vous mettrez dans votre sysctl.conf, IPv6 sera systématiquement désactivé au boot !

cat /etc/modprobe.d/local.conf
# Local module settings
# Created by the Debian installer
options ipv6 disable=0

Après reboot, tout fonctionne. Je ping bien (avec ping6) des serveurs IPv6 only et j’ai pu affecter des IPv6 à mes containers LXC.

CA M’A PAS DU TOUT DÉTENDU CETTE HISTOIRE D’IPV6 !

Et encore, j’ai même pas de DNS IPv6 car OVH ne sait pas le faire sur leurs DNS !

Ni du fait que dans certains cas, 90% des requêtes sont perdues, mais uniquement sur les DC2/DC3 d’Online à Paris, ce que confirment a priori plusieurs personnes qui font aussi de l’IPv6 sur des machines hostées chez Online…

And that’s what we call « flapping »

Mais je m’en fous, le blog est accessible en IPv6.


Vous aimez ce blog ? Partagez-le avec vos amis !   Twitter Facebook Linkedin email

Vous pouvez également soutenir le blog financièrement :
Tipeee

12 comments

  1. Quelle idée de vouloir mettre de l’IPV6 aussi ? :p Ne jamais suivre les modes, même si elles ont 25 ans passées.

    Félicitation pour avoir fait l’opération, peut-être que dans 10 ans cela la norme, peut-être pas…

  2. J’ai eu la même démarche il y a quelques mois avec OneProvider et mon Proxmox hébergé là-bas.
    Le dhclient indiqué par la config d’Online m’a causé quelques misères, j’ai donc préféré utiliser dibbler.

    Je te confirme que les règles iptables sont très utiles ! En effet le port de switch sera bloqué par Online si ton client DHCP envoie trop de requêtes (ce qui semble arriver souvent avec dhclient).

    Je me suis retrouvé avec le port bloqué un soir après avoir relancé plusieurs fois dibbler … L’IPMI étant sur le même port, vous perdez tout accès à la machine. Seule solution, contacter le support et attendre …

  3. Salut.
    Effectivement c’est vraiment la galère. J’ai essayé avec un routeur ubiquity chez orange sans la livebox. J’ai abandonné quand il m’a fallu compiler des binaires du logiciel dribble pour ipv6 :(. Maintenant je suis chez ovh avec un préfixe /56 et un routeur ubiquity UDM pro et va falloir que je me penche sérieusement dessus.

    Mais comme tu le dis, c’est juste dingue que rien ne soit prêt niveau soft pour l’ipv6.

    1. Chez Orange, le problème vient du fait d’utiliser des options DHCPv6 obscures pour la gestion de l’authentification, avec un code hexa à la con à calculer de manière barbare et injecter dans les trames. Forcément, les implémentations les plus courantes peuvent ne pas prendre en charge ce genre d’options utilisées par personne, sauf à vouloir verrouiller les utilisateurs sur le matériel maison bridé.

      La dernière fois que j’avais tenté de l’IPv6 sur OVH/Proxmox, ça s’était pas super bien terminé non plus. Je désespère pas de pouvoir y passer non plus, mais ça sera sur une nouvelle installation je pense.

  4. D’un coté je suis rassuré d’être complètement largué par la configuration d’IPV6 que j’ai essayé d’implanter dans mon hotspot (sans succès), et de l’autre je suis décontenancé que ce soit aussi compliqué !

    1. Visiblement je cumule les difficultés aussi
      J’espère que dans des cas plus classiques c’est plus simple

  5. L’IPv6 est globalement un monde de galères tellement chacun l’implémente comme il le veut…

    J’ai réussis à configurer convenablement l’IPv6 @home sur un accès Sosh (Orange) avec un modem Netgear et pfSense en routeur, c’était sacrément tricky !

    Passé ça mon routeur obtient bien son préfixe, d’ailleurs pas besoin d’attribuer d’IPv6 à votre routeur, il n’a besoin de connaître que le préfixe qu’il gère !

    Ensuite sous pfSense impossible de mettre mes LANs en « track interface », obligé de déterminer le préfixe et le réseau à la main, en dur… pas terrible.

    Et enfin j’ai voulu tester ce que ça fait d’avoir des clients en full IPv6 (j’ai une VM qui fait du NAT64 avec Tayga), hé bien c’est encore d’autres galères… j’ai des uploads qui ne fonctionnent pas sur HTTP (Leboncoin, …), le client Steam qui ne veut rien savoir (un ticket est ouvert depuis des années !), …

    Bref on est encore assez loin du monde en IPv6…

  6. Bonsoir,

    Est-ce possible d’ajouter de l’IPv6 (publique) à chaque VM/CT (en plus d’une IPv4 privée sous NAT) d’une infra qui ressemblerait (OPNsense au lieu de pfsense) à celle présentée ici https://blog.zwindler.fr/2017/07/11/deploiment-de-proxmox-ve-5-sur-un-serveur-dedie-part-1/
    ou là https://blog.zwindler.fr/2020/03/09/proxmox-ve-6-pfsense-sur-un-serveur-dedie-2-3/
    ?
    Je n’arrive pas à savoir comment moderniser /root/iptables.sh en conséquence (en Ipv4, ça fonctionne).

    J’avais pensé à quelque chose comme ce qui suit mais je ne maîtrise pas bien iptables

    #!/bin/sh

    # ---------
    # VARIABLES
    # ---------

    Proxmox bridge holding Public IP

    PrxPubVBR= »vmbr0″

    Proxmox bridge on VmWanNET (OPNsense WAN side)

    PrxVmWanVBR= »vmbr1″

    Proxmox bridge on PrivNET (OPNsense LAN side)

    PrxVmPrivVBR= »vmbr2″

    Network/Mask of PubWanNET6

    PubWanNET6= »2a00:c70:1:xxx:xxx:xxx:xxx:0/96″

    Network/Mask of VmWanNET

    VmWanNET= »10.0.0.0/30″

    Network/Mmask of PrivNET

    PrivNET= »192.168.9.0/24″

    Network/Mmask of VpnNET

    VpnNET= »10.2.2.0/24″

    Public IP => Your own public IP address

    PublicIP= »xxx.xxx.xxx.xxx »
    PublicIP6= »2a00:c70:1:xxx:xxx:xxx:xxx:1″

    Proxmox IP on the same network than OPNsense WAN (VmWanNET)

    ProxVmWanIP= »10.0.0.1″

    Proxmox IP on the same network than VMs

    ProxVmPrivIP= »192.168.9.1″

    OPNsense IP used by the firewall (inside VM)

    OpnVmWanIP= »10.0.0.2″
    OpnVmWanIP6= »2a00:c70:1:xxx:xxx:xxx:xxx:2″

    # ---------------------
    # CLEAN ALL & DROP IPV6
    # ---------------------

    Delete all existing rules.

    iptables -F
    ip6tables -F
    iptables -t nat -F
    iptables -t mangle -F
    iptables -X
    ip6tables -X

    This policy does not handle IPv6 traffic except to drop it.

    ip6tables -P INPUT DROP
    ip6tables -P OUTPUT DROP
    ip6tables -P FORWARD DROP

    # --------------
    # DEFAULT POLICY
    # --------------

    Block ALL !

    iptables -P OUTPUT DROP
    iptables -P INPUT DROP
    iptables -P FORWARD DROP

    # ------
    # CHAINS
    # ------

    Creating chains

    iptables -N TCP
    iptables -N UDP
    ip6tables -N TCP
    ip6tables -N UDP

    UDP = ACCEPT / SEND TO THIS CHAIN

    iptables -A INPUT -p udp -m conntrack –ctstate NEW -j UDP
    ip6tables -A INPUT -p udp -m conntrack –ctstate NEW -j UDP

    TCP = ACCEPT / SEND TO THIS CHAIN

    iptables -A INPUT -p tcp –syn -m conntrack –ctstate NEW -j TCP
    ip6tables -A INPUT -p tcp –syn -m conntrack –ctstate NEW -j TCP

    # ------------
    # GLOBAL RULES
    # ------------

    Allow localhost

    iptables -A INPUT -i lo -j ACCEPT
    ip6tables -A INPUT -i lo -j ACCEPT
    iptables -A OUTPUT -o lo -j ACCEPT
    ip6tables -A OUTPUT -o lo -j ACCEPT

    Don’t break the current/active connections

    iptables -A INPUT -m conntrack –ctstate RELATED,ESTABLISHED -j ACCEPT
    ip6tables -A INPUT -m conntrack –ctstate RELATED,ESTABLISHED -j ACCEPT
    iptables -A FORWARD -m conntrack –ctstate RELATED,ESTABLISHED -j ACCEPT
    ip6tables -A FORWARD -m conntrack –ctstate RELATED,ESTABLISHED -j ACCEPT

    Allow Ping – Comment this to return timeout to ping request

    #iptables -A INPUT -p icmp –icmp-type 8 -m conntrack –ctstate NEW -j ACCEPT
    ip6tables -A INPUT -p ipv6-icmp -j ACCEPT

    # --------------------
    # RULES FOR PrxPubVBR
    # --------------------

    INPUT RULES

    —————

    Allow SSH server

    iptables -A TCP -i $PrxPubVBR -d $PublicIP -p tcp –dport ${SSHPORT} -j ACCEPT
    ip6tables -A TCP -i $PrxPubVBR -d $PublicIP6 -p tcp –dport ${SSHPORT} -j ACCEPT

    Allow Proxmox WebUI fromVPN

    iptables -A TCP -i $PrxVmWanVBR -d $ProxVmWanIP -p tcp –dport 8006 -j ACCEPT

    OUTPUT RULES

    —————

    Allow ping out

    iptables -A OUTPUT -p icmp -j ACCEPT
    ip6tables -A OUTPUT -p ipv6-icmp -j ACCEPT

    Proxmox Host as CLIENT

    Allow HTTP/HTTPS

    iptables -A OUTPUT -o $PrxPubVBR -s $PublicIP -p tcp –dport 80 -j ACCEPT
    ip6tables -A OUTPUT -o $PrxPubVBR -s $PubWanNET6 -p tcp –dport 80 -j ACCEPT
    iptables -A OUTPUT -o $PrxPubVBR -s $PublicIP -p tcp –dport 443 -j ACCEPT
    ip6tables -A OUTPUT -o $PrxPubVBR -s $PubWanNET6 -p tcp –dport 443 -j ACCEPT

    Allow DNS

    iptables -A OUTPUT -o $PrxPubVBR -s $PublicIP -p udp –dport 53 -j ACCEPT
    ip6tables -A OUTPUT -o $PrxPubVBR -s $PubWanNET6 -p udp –dport 53 -j ACCEPT

    Proxmox Host as SERVER

    Allow SSH

    iptables -A OUTPUT -o $PrxPubVBR -s $PublicIP -p tcp –sport ${SSHPORT} -j ACCEPT
    ip6tables -A OUTPUT -o $PrxPubVBR -s $PublicIP6 -p tcp –sport ${SSHPORT} -j ACCEPT

    Allow PROXMOX WebUI output to VPN

    iptables -A OUTPUT -o $PrxVmWanVBR -s $ProxVmWanIP -p tcp –sport 8006 -j ACCEPT

    FORWARD RULES

    —————-

    Redirect (NAT) traffic from internet

    All tcp to OPNsense WAN except ${SSHPORT}

    iptables -A PREROUTING -t nat -i $PrxPubVBR -p tcp –match multiport ! –dports ${SSHPORT} -j DNAT –to $OpnVmWanIP
    ip6tables -A PREROUTING -t nat -i $PrxPubVBR -p tcp –match multiport ! –dports ${SSHPORT} -j DNAT –to $OpnVmWanIP6

    All udp to OPNsense WAN

    iptables -A PREROUTING -t nat -i $PrxPubVBR -p udp -j DNAT –to $OpnVmWanIP
    ip6tables -A PREROUTING -t nat -i $PrxPubVBR -p udp -j DNAT –to $OpnVmWanIP6

    Allow request forwarding to OPNsense WAN interface

    iptables -A FORWARD -i $PrxPubVBR -d $OpnVmWanIP -o $PrxVmWanVBR -p tcp -j ACCEPT
    ip6tables -A FORWARD -i $PrxPubVBR -d $OpnVmWanIP6 -o $PrxVmWanVBR -p tcp -j ACCEPT
    iptables -A FORWARD -i $PrxPubVBR -d $OpnVmWanIP -o $PrxVmWanVBR -p udp -j ACCEPT
    ip6tables -A FORWARD -i $PrxPubVBR -d $OpnVmWanIP6 -o $PrxVmWanVBR -p udp -j ACCEPT

    Allow request forwarding from LAN

    iptables -A FORWARD -i $PrxVmWanVBR -s $VmWanNET -j ACCEPT
    ip6tables -A FORWARD -i $PrxVmWanVBR -s $PubWanNET6 -j ACCEPT

    MASQUERADE MANDATORY

    Allow WAN network (OPNsense) to use vmbr0 public adress to go out

    iptables -t nat -A POSTROUTING -s $VmWanNET -o $PrxPubVBR -j MASQUERADE

    service fail2ban restart

Leave a Reply

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.