Wireguard et IPv6

Tags: #<Tag:0x00007f63e4970690>

Bonjour,

Cela faisait bien longtemps que je n’étais pas passé par ce forum qui m’a rendu bien des services il y a quelques années maintenant. Je tente donc ma chance :slight_smile:

Je ne parviens pas à configurer wireguard en IPv6.

Je m’explique :
Depuis quelques mois, mon FAI (SFR pour ne pas le nommer), a upgradé ma box pour prendre en charge IPv6. Mais, du coup, je n’ai plus de de « vrai » IPv4, je suis en IPv4-CGNAT. En gros, je ne peux plus faire de nat avec de l’ip4. J’ai dû basculer tous mes services (nextcloud, etc… en ipv6 only).

La seule chose qui me manque c’est de pouvoir me connecter à mon VPN domestique en IPv6. En IPv4, j’y parvenai sans soucis, ce qui me permettait, par exemple, d’obtenir mon IP française pour regarder la TV depuis l’étranger.

Je souhaiterai pouvoir faire l’équivalent en IPv6 : se connecter à mon VPN perso pour obtenir « mon IP domestique » (celle accordée par mon FAI) de n’importe où (en 4G notamment).
Savez-vous comment faire ?
Pensez-vous à une méthode alternative ?

Voilà
En espérant avoir été clair.
Merci
Jul

Je ne connais pas wireguard mais j’ai l’habitude d’IPv6 donc si je peux aider…

Quel est le problème exactement ? Etablir le VPN en IPv6 ou configurer la connectivité à travers le VPN ?

Qu’appelles-tu « ton IP domestique » ? Tu n’as plus d’adresse IPv4 publique dédiée, donc s’agit-il d’une adresse IPv4 privée ou d’une adresse IPv6 globale de ton réseau ?

Il faut que le client ait une connectivité IPv6 globale n’importe où, et ça, ce n’est pas encore gagné.

Merci c’est gentil, l’ipv6 c’est confus pour moi. Je vais essayer de préciser…
En fait mon réseau local fonctionne encore avec de l’ipv4. Tous mes « clients » ont donc une ip4 privée (192.168.X.X), une ip4 publique commune (celle de ma box que je ne peux pas « nater ») et une ip6 publique (2a02:8428:80b7:ca01::/64) attribuée par ma box.

Je te donne la conf wireguard en ip4 qui fonctionnait quand j’étais en ip4 :
côté « serveur » :

Address = 192.168.123.1/24 
ListenPort = 60000
PrivateKey = xxxxxxxxxxxxxxxxxxxxxxxx 
   
[Peer]
# teljul
PublicKey = xxxxxxxxxxxxxxxxxxxxxxx
AllowedIPs = 192.168.123.2/32 
PersistentkeepAlive = 60 

[Peer]
# tab
PublicKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
AllowedIPs = 192.168.123.3/32
PersistentkeepAlive = 60

Coté client :

# phone_jul
Address = 192.168.123.2/24
PrivateKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ListenPort = 60000
DNS = 192.168.123.1
       
[Peer]
# server
PublicKey = uMGPJN2aHwjxgJnwGG4EW8rVYvrBbpSCbW6sxIUv3GE=
Endpoint = 109.12.24.55:60000
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25

Règles iptables :

iptables -A FORWARD -i wg0 -j ACCEPT
iptables -A FORWARD -o wg0 -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Avec cette conf, de n’importe où en 4g, je parvenais à obtenir l’ip4 publique de ma box soit 109.12.24.55.

Configurer la connectivité à travers le vpn.
J’ai essayé diverses choses, un peu au petit bonheur la chance je dois dire :

  • changer juste le « endpoint » en mettant l’ip6 du serveur
  • Utiliser des adresses ip6 du type « 2a02:8428:80b7:ca02::/64 » à la place des « 192.168.123.X »
    Bref, mes maigres compétences sont dépassées.

une ip6 du type « 2a02:8428:80b7:ca01::/64 » (ip6 publiques attribuées par ma box)

Exact, mais avec mon smartphone ça devrait passer.

Donc le VPN monte bien en IPv6 ? (pour autant que le concept de « monter » soit pertinent avec wireguard)

Tu as bien mis l’adresse IPv6 globale persistante (non temporaire) en 2a02:8428:80b7:ca01::/64 de l’interface ethernet ?
Si cette adresse est bien joignable de l’extérieur (la box pourrait avoir un pare-feu à état pour l’IPv6 dans lequel il faut définir les adresses/ports accessibles de l’extérieur), cela devrait suffire à monter le VPN.

Pourquoi ? Tu as besoin d’accéder à des services IPv6 à travers le VPN ?
Si tu veux attribuer une adresse du préfixe IPv6 de la box à un client VPN alors que ce préfixe et censé être utilisé sur le LAN de la box, le serveur doit faire du proxy-ND (équivalent du proxy ARP pour IPv4) pour cette adresse avec ip neigh.

Bon tout fonctionne comme je veux avec cette conf :
serveur :

Address = 192.168.123.1/24, fdac:ce55::1/64
ListenPort = 60000
PrivateKey = xxx 
    
[Peer]
# teljul
PublicKey = xxx
AllowedIPs = 192.168.123.2/32, fdac:ce55::2/128
PersistentkeepAlive = 60 

[Peer]
# tab
PublicKey = xxx
AllowedIPs = 192.168.123.3/32, fdac:ce55::3/128
PersistentkeepAlive = 60

client :

# phone_jul
Address = 192.168.123.2/24, fdac:ce55::2/64
PrivateKey = xxx
ListenPort = 60000
DNS = 192.168.123.1, fdac:ce55::1
       
[Peer]
# server
PublicKey = xxx
Endpoint = [ipv6_publique_du_serveur]:60000
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25

règles ip6tables ajoutées (j’avais « oublié » la dernière…)

ip6tables -A FORWARD -i wg0 -j ACCEPT
ip6tables -A FORWARD -o wg0 -j ACCEPT
ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

J’utilise visiblement des ULAs. D’après ce que j’ai compris, ce sont grossièrement les équivalents des adresse ip4 privées… Est-ce judicieux et cohérent ? bien incapable de le dire…

J’obtiens bien une adresse du type « 2a02:8428:80b7:ca01::/64 » depuis mon smartphone et en 4g.

Par contre, j’ai bêtement copié/collé ces ULA depuis un site… On peut mettre ce qu’on veut tant que ça commence par fdxx ?

Oui, les adresses ULA sont utilisables par tout le monde et ne sont pas routées sur l’internet public. Avec la différence qu’un préfixe IPv6 ULA est censé être unique avec une très faible probabilité de collision, contrairement aux préfixes IPv4 privés.

Si tu choisis de ne pas attribuer des adresses du préfixe IPv6 du LAN (avec du (proxy ND) aux clients VPN, il faut bien utiliser un autre préfixe. Mais c’est bien malheureux de devoir faire du NAT en IPv6…

Tu parles de l’adresse IPv6 attribuée par la connexion 4G ? Elle ne peut pas être dans le même /64 que le LAN de ta box. Moi je parlais de l’adresse IPv6 attribuée par wireguard, qui peut être dans le préfixe du LAN à condition de faire du proxy ND (et pas besoin de NAT IPv6 dans ce cas).

Non, le « U » est pour « unique » et on est censé générer le préfixe ULA avec un algorithme particulier qui minimise la probabilité de collision. Il existe des générateurs en ligne.

Il me semble en effet que l’un des intérêts de l’ipv6 est de ne pas être obligé de faire du nat. Mais je ne vois pas comment faire autrement…
Mais pourquoi est-ce « malheureux » ? En terme performance ?

Je pense avoir compris que c’est la solution alternative que tu proposes. Je ne connais pas le proxy ND, je vais me documenter.
Tu parles bien d’une adresse « 2a02:8428:80b7:ca01::/64 » ? Les ip publiques des clients de mon lan commencent toutes par ce préfixe.

Oui, en 4g (hors du lan) avec la conf donnée plus haut. Pourtant avec test sur ce site :
Sans wireguard activé : 2a02:8440:2416:c721:7ef0:f1e:b9e1:8bb9
Avec wireguard activé: 2a02:8428:80b7:ca01:e65f:1ff:fe8e:5716

Non, mais le NAT casse la connectivité de bout en bout et n’est pas compatible avec tous les protocoles.

Le protocole Neighbor Discovery (NDP) joue pour IPv6 un rôle similaire à celui du protocole ARP pour IPv4. Lorsqu’une machine veut envoyer un paquet IPv6 à une autre machine ayant une adresse IPv6 dans le même LAN, elle doit d’abord découvrir son adresse MAC grâce à NDP ; pour cela, elle envoie une requête NS et la machine cible renvoie une réponse NA. Mais si l’adresse IPv6 cible appartient à une machine qui n’est pas sur le LAN (comme dans le cas d’un VPN routé) alors la machine intermédiaire servant de routeur qui est connectée au LAN doit répondre à sa place afin de recevoir le paquet IPv6 qu’elle pourra retransmettre. C’est la fonction de proxy NDP. On peut configurer le routeur intermédiaire comme proxy NDP pour une adresse IPv6 donnée avec la commande ip neigh (cf man ip-neighbour).

ip neigh add proxy <adresse.ipv6> dev <interface_lan>

Une autre solution consiste à créer une route pour cette adresse sur la box, mais d’une part je doute que la box le permette et d’autre part ça ne marchera que pour les communications avec l’extérieur et pas avec les machines du LAN.

Pourquoi « pourtant » ? Sans le VPN, c’est bien l’adresse de la connexion 4G qui n’est pas dans le préfixe du LAN.

J’ai dû mal comprendre quand tu disais :

En tout cas, merci pour cet échange. Tes explications sont, comme toujours, redoutables.
Je vais me contenter de ça pour le moment et attendre quelques heures perdues pour me pencher sur ce proxy ND…

Hello, je pense que je suis dans le même cas de figure que toi mais je part de beaucoup plus loin j’ai l’impression… je n’ai qu’un seul fichier de config (celui du client) je ne trouve pas celui du serveur ? doit-il être créer s’il ne l’est pas ?

Je pense qu’il vaudrait mieux créer une nouvelle discussion décrivant ton cas de figure et ton problème ou ton besoin, éventuellement avec un lien vers cette discussion si tu penses qu’il y a des points communs.

2 J'aime