« Wireguard ipv6 GUA » : différence entre les versions

Aucun résumé des modifications
Aucun résumé des modifications
Ligne 1 : Ligne 1 :
= partie 1 =
Source: https://blog.miyuru.lk/setup-wireguard-with-global-ipv6/
https://port.tools/port-checker-ipv6/
Configurer WireGuard avec une IPv6 unicast globale.<br />
 
Un simple tunnel VPN à double pile avec prise en charge IPv6 globale.<br />
WireGuard devient populaire auprès des utilisateurs de Linux en tant que VPN car il est intégré au noyau Linux, ce qui offre de meilleures performances
Cependant, de nombreux tutoriels et scripts qui configurent WireGuard le font avec NATing de l'adresse IPv6 et donnent à l'utilisateur une adresse IPv6 locale de lien. Cela amène le système d'exploitation à préférer IPv4 à IPv6.<br /><br />
⚠️ Wireguard sur Raspberry Pi OS (bookworm)<br /><br />
Ajout d'un sous-réseau avec /80.<br />
Possiblité d'utiliser des sous-réseaux plus petits avec un sous-réseau approprié.<br />
<pre>
Original Block - 2000:xxx:xxx:x11:328e::/80
For the VPN Endpoint - 2000:xxx:xxx:x11:328e::123/128
For the VPN Clients - 2000:xxx:xxx:x11:328e:ffff::/96
VPN Endpoint port - 51820
pihole network interface - eth0
Gateway 2000:xxx:xxx:x11::1
</pre>
Nous donnons également une seule adresse IPv6 pour chaque client, mais vous pouvez également attribuer un sous-réseau par client.<br />
Pour une configuration IPv6 vraiment appropriée, vous pouvez attribuer à chaque client un sous-réseau /64 et configurer SLAAC.<br />
== Ajouter les IPv6 sur eth0 ==
Avec NetworkManager
<pre>sudo nmtui</pre>
CONFIGURATION IPv6<br />
Ajouter les adresses:<br />
<pre>
2000:xxx:xxx:x11:328e::123/128
2000:xxx:xxx:x11:328e:ffff::/96
</pre>
<pre>
sudo service NetworkManager restart
</pre>
== Activer l'IP forwarding ==
Assurez-vous d'ajouter les éléments suivants à /etc/sysctl.d/99-pivpn.conf
<pre>
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
net.ipv6.conf.ens5.accept_ra = 2
</pre>
puis, <pre>sudo sysctl --system</pre> pour appliquer les modifications<br />
== Configuration de l'interface wg0 ==
# Dans les règles IPv4, nous effectuons un NAT pour l'adresse IPv4.<br />
<pre>
PostUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE;
</pre>
# Dans les règles IPv6, nous ajoutons une règle pour transférer le trafic vers l'interface Internet.<br />
<pre>
PostUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;ip6tables -A FORWARD -i eth0 -o wg0 -j ACCEPT; ip6tables -A FORWARD -i wg0 -j ACCEPT;
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE;ip6tables -D FORWARD -i eth0 -o wg0 -j ACCEPT; ip6tables -D FORWARD -i wg0 -j ACCEPT;
</pre>
# Version nftables avant l'ipv6
<pre>
PostUp = nft add table ip wireguard;nft add chain ip wireguard wireguard_chain {type nat hook postrouting priority srcnat\; policy accept\;};nft add rule ip wireguard wireguard_chain counter packets 0 bytes 0 masquerade;nft add table ip6 wireguard;nft add chain ip6 wireguard wireguard_chain {type nat hook postrouting priority srcnat\; policy accept\;};nft add rule ip6 wireguard wireguard_chain counter packets 0 bytes 0 masquerade;
PostDown = nft delete table ip wireguard; nft delete table ip6 wireguard
</pre>
# Version nftables avec l'ipv6
<pre>
<pre>
ipv6 ULA unique local addresses
PostUp = nft add table ip wireguard;nft add chain ip wireguard wireguard_chain {type nat hook postrouting priority srcnat\; policy accept\;};nft add rule ip wireguard wireguard_chain counter packets 0 bytes 0 masquerade; nft add table ip6 wireguard;nft add chain ip6 wireguard wireguard_chain {type nat hook postrouting priority srcnat\; policy accept\;};nft add rule ip6 wireguard wireguard_chain counter packets 0 bytes 0 masquerade;nft add chain ip6 wireguard FORWARD { type filter hook forward priority filter\; };nft add rule ip6 wireguard FORWARD iifname "eth0" oifname "wg0" ct state related,established counter accept;nft add rule ip6 wireguard FORWARD iifname "wg0" counter accept;
Le préfixe ULA est fc00 ::/7
PostDown = nft delete table ip wireguard; nft delete table ip6 wireguard
fc00 ::/8
</pre>
</pre>


Les clients (pas seulement Wireguard, mais en général) préfèrent IPv4 à IPv6 si la seule adresse dont ils disposent est une ULA. Vous devez plutôt attribuer des adresses GUA dans votre VPN, sans masquage.
Pour l'IP client, nous utilisons les premières IP de la plage désignée. Dans IPv6, vous pouvez autoriser un grand sous-réseau ici et cela permettra au client de se déplacer dans différentes IP du sous-réseau.
https://www.reddit.com/r/WireGuard/comments/q8t9bj/wireguard_doesnt_seem_to_work_with_ipv6/
 
https://www.reddit.com/r/WireGuard/comments/q8t9bj/comment/hisgfdj/
AllowedIPs = 10.66.66.2, 2000:xxx:xxx:x11:328e:ffff::2/128
https://blog.miyuru.lk/setup-wireguard-with-global-ipv6/


à tester :
Donc dans <pre>/etc/wireguard/wg0.conf</pre>
# - Pour IPv6, il peut s’agir d’une adresse ULA /64 unique ou d’une adresse GUA /64 unique dérivée de votre délégation de préfixe. N’utilisez pas une adresse de tunnel de type /32 (IPv4) ou /128 (IPv6)
 
# - Se servir d'un next hop de free, le dernier non utilisé
<pre>
# - Faire le transfert de port du 51820 sur le l'ipv6 du PI
[Interface]
# - pour wireguard utiliser l'ipv6 GUA du next hop et essayer https://blog.miyuru.lk/setup-wireguard-with-global-ipv6/
Address = 10.66.66.1/24, fd42:42:42::1/64
ListenPort = 51820
PrivateKey =
PostUp = nft add table ip wireguard;nft add chain ip wireguard wireguard_chain {type nat hook postrouting priority srcnat\; policy accept\;};nft add rule ip wireguard wireguard_chain counter pac>
PostDown = nft delete table ip wireguard; nft delete table ip6 wireguard
...
### Client 1
[Peer]
PublicKey =
#PresharedKey =
AllowedIPs = 10.66.66.2, 2000:xxx:xxx:x11:328e:ffff::2/128
</pre>


== Configuration du client ==


piste: voir aussi ipv6 proxy-ND wireguard (ipv4 en ipv6)
Ici, nous autorisons une seule adresse IPv6. Si la configuration du serveur autorise un grand sous-réseau, nous pouvons la modifier en conséquence.<br />
<pre>
Adresse = 10.66.66.2, 2000:xxx:xxx:x11:328e:ffff::2/128
</pre>


L'ordre de priorité est IPv6 GUA, puis IPv4 et enfin IPv6 ULA. Mettre un serveur interne avec IPv4 et IPv6 ULA signifie qui sera utilisé en IPv4 a moins de passer sur tous les postes pour changer les priorités (sur client Linux c'est dans /etc/gai.conf).
Configuration complète. Enregistrée dans /etc/wireguard/client1.conf


= partie 2 =
<pre>
<pre>
voir l'ipv6 GUA de PI attribué à eth0
[Interface]
fourni par l'interface DU LAN.
PrivateKey =
2a01:e0a:5b4:b411:328e:dfd8:1d6a:776/128
Address = 10.66.66.2, 2000:xxx:xxx:x11:328e:ffff::2/128
DNS = 2606:4700:4700::1001
[Peer]
PublicKey =
#PresharedKey =
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = [2000:xxx:xxx:xxx:x11::123]:51820
</pre>


blocs de sous réseaux utilié:
== Redémarrer le tunel ==
2a01:e0a:5b4:b411:328e::/80


Ajouter à l'interface eth0 du pi les ipv6
<pre>
ajouter une Adresse ipv6 Unicast Global a une interface (GUA)
sudo wg-quick down wg0
for SSH
sudo wg-quick up wg0
2a01:e0a:5b4:b411:328e::1/128
</pre>
for vpn endpoint
2a01:e0a:5b4:b411:328e::123/128
for VPN clients
2a01:e0a:5b4:b411:328e:ffff::/96


schéma
---
2a01:e0a:5b4:(site):b411(reseaux):328e:0000:0000:1 (interface)
== Notes: ==
# Traduire les régles iptables en nftables
<pre>
ip6tables-translate -A FORWARD -i eth0 -o wg0 -j ACCEPT
ip6tables-translate -A FORWARD -i wg0 -j ACCEPT
=>
nft add rule ip6 wireguard wireguard_forward iifname eth0 oifname wg0 counter accept;
nft add rule ip6 filter chain forward iifname "eth0" oifname "wg0" counter accept;
nft add chain ip6 wireguard wireguard_chain {forward iifname "wg0" counter accept\;};
</pre>


wireguard PostUp
pas de MASQUERADE pour ipv6


pour le client
=== Adapter et tester les règles ===
2a01:e0a:5b4:b411:328e:ffff::2/128
<pre>
# donc wg0.conf
sudo nft add chain ip6 wireguard FORWARD { type filter hook forward priority filter\; }
sudo nft add rule ip6 wireguard FORWARD iifname "eth0" oifname "wg0" ct state related,established counter accept;
sudo nft add rule ip6 wireguard FORWARD iifname "wg0" counter accept
</pre>
# Pour effacer les règles:
<pre>
sudo wg-quick down wg0
sudo wg-quick up wg0
</pre>


[Interface]
# Pour contrôler les règles:
Adresse = fd42.....


### Client test
<pre>
[Peer]
sudo nft list ruleset
AllowedIPs: 2a01:e0a:5b4:b411:328e:ffff::2/128
</pre>


Le but attribué l'ipv6 à wg0 avec un sous réseaux ipv6/80
# Résultat
<pre>
table inet filter {
    chain input {
        type filter hook input priority filter; policy accept;
    }


#test.conf
    chain forward {
[Interface]
        type filter hook forward priority filter; policy accept;
Adresse: 2a01:e0a:5b4:b411:328e:ffff::2/128
    }
Endpoint: [2a01:e0a:5b4:b411:328e::123]:51820


    chain output {
        type filter hook output priority filter; policy accept;
    }
}
table ip wireguard {
    chain wireguard_chain {
        type nat hook postrouting priority srcnat; policy accept;
        counter packets 4640 bytes 317839 masquerade
    }
}
table ip6 wireguard {
    chain wireguard_chain {
        type nat hook postrouting priority srcnat; policy accept;
        counter packets 1350 bytes 145915 masquerade
    }


ipv6_routing_subnet_through_wireguard
    chain FORWARD {
        type filter hook forward priority filter; policy accept;
        iifname "eth0" oifname "wg0" ct state established,related counter packets 13820 bytes 9978553 accept
        iifname "wg0" counter packets 10031 bytes 3057534 accept
    }
}


</pre>
</pre>