udało mi się ogarnąć temat z GPT
na koniec wypluł mi taki manual dla potomnych
IPv6 na Androidzie przez WireGuard, gdy lokalne Wi-Fi nie ma IPv6
Cel
Mam router OpenWrt z dostępem do Internetu po IPv6 oraz działający serwer WireGuard.
Chcę, aby telefon z Androidem, będąc np. w hotelu, pracy albo w publicznym Wi-Fi, które udostępnia tylko IPv4, mógł korzystać również z IPv6.
Schemat:
INTERNET
IPv4 + IPv6
^
|
+----+-----+
| OpenWrt |
| |
| WAN IPv4 |
| WAN IPv6 |
| WireGuard|
+----+-----+
|
WireGuard przez IPv4
|
+----+-----+
| Android |
| |
| Wi-Fi |
| tylko |
| IPv4 |
+----------+
1. Założenia
Przykładowa konfiguracja:
OpenWrt LAN:
192.168.50.1/24
WireGuard:
wg0
10.99.0.1/24
port 51820
Android:
10.99.0.2/32
IPv6 WireGuard:
fd42:1234:5678::1/64 OpenWrt
fd42:1234:5678::2/64 Android
Adresacja:
OpenWrt wg0:
10.99.0.1
fd42:1234:5678::1
Android:
10.99.0.2
fd42:1234:5678::2
Zakres:
jest przykładową prywatną adresacją IPv6 ULA.
Nie używamy tutaj bezpośrednio publicznego prefixu IPv6 otrzymanego od ISP.
OpenWrt będzie wykonywał NAT66:
fd42:1234:5678::2
|
v
OpenWrt
|
| NAT66
v
Publiczny IPv6 ISP
|
v
Internet IPv6
Dzięki temu zmiana publicznego prefixu IPv6 przez ISP nie wymaga zmiany konfiguracji telefonu.
2. Dodanie IPv6 do WireGuarda na OpenWrt
Najpierw sprawdzamy istniejący interfejs:
Jeżeli wg0 już istnieje i działa, nie trzeba go tworzyć od nowa.
Dodajemy do niego adres IPv6:
uci add_list network.wg0.addresses='fd42:1234:5678::1/64'
Następnie:
uci commit network
/etc/init.d/network reload
Sprawdzamy:
Powinniśmy zobaczyć między innymi:
inet6 fd42:1234:5678::1/64 scope global
3. Konfiguracja klienta WireGuard na Androidzie
W aplikacji WireGuard na Androidzie otwieramy konfigurację istniejącego tunelu.
W sekcji
dodajemy adres IPv6:
[Interface]
PrivateKey = KLUCZ_PRYWATNY_ANDROID
Address = 10.99.0.2/32, fd42:1234:5678::2/64
DNS = 10.99.0.1
Najważniejsza zmiana:
Telefon dostaje dzięki temu własny adres IPv6 wewnątrz tunelu.
4. AllowedIPs na Androidzie – bardzo ważne
W konfiguracji peera na Androidzie:
[Peer]
PublicKey = KLUCZ_PUBLICZNY_OPENWRT
Endpoint = 198.51.100.10:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25
Najważniejszy fragment:
AllowedIPs = 0.0.0.0/0, ::/0
Oznacza to:
IPv4 -> przez WireGuard
IPv6 -> przez WireGuard
Telefon używa tunelu jako domyślnej drogi do Internetu.
Jeżeli chcemy tylko IPv6 przez VPN, a IPv4 ma nadal wychodzić lokalnym Wi-Fi, możemy użyć:
Wtedy:
IPv4 -> lokalne Wi-Fi -> Internet
IPv6 -> WireGuard -> OpenWrt -> Internet IPv6
5. Dodanie IPv6 do peera Androida na OpenWrt
Peer telefonu powinien mieć zarówno IPv4, jak i IPv6.
Przykład:
[Peer]
PublicKey = KLUCZ_PUBLICZNY_ANDROID
AllowedIPs = 10.99.0.2/32, fd42:1234:5678::2/128
Jeżeli w konfiguracji UCI masz już:
nie dodajemy go drugi raz.
Dodajemy tylko:
uci add_list network.@wireguard_wg0[0].allowed_ips='fd42:1234:5678::2/128'
Następnie:
uci commit network
/etc/init.d/network reload
Uwaga: nazwa sekcji UCI może być inna. Najpierw warto sprawdzić:
uci show network | grep -A10 -B2 wireguard
6. Firewall OpenWrt
OpenWrt musi pozwolić na ruch:
Jeżeli WireGuard znajduje się w osobnej strefie vpn, konfiguracja logicznie powinna wyglądać tak:
Przykładowo:
uci add firewall forwarding
uci set firewall.@forwarding[-1].src='vpn'
uci set firewall.@forwarding[-1].dest='wan'
W strefie vpn powinien znajdować się interfejs:
Następnie w strefie WAN włączamy NAT66:
uci set firewall.wan.masq6='1'
Sprawdzamy konfigurację:
uci show firewall | grep -E "name=.*wan|masq6|vpn|wg0"
Po zmianach:
uci commit firewall
/etc/init.d/firewall restart
7. Sprawdzenie routingu IPv6 na OpenWrt
Na routerze:
Powinniśmy mieć działającą trasę domyślną IPv6, np.:
Następnie sprawdzamy dostęp do Internetu IPv6:
ping -6 2001:4860:4860::8888
Jeżeli ping działa, OpenWrt ma działający dostęp do Internetu IPv6.
8. Sprawdzenie WireGuarda
Na OpenWrt:
Powinniśmy zobaczyć peer Androida oraz:
i rosnące wartości:
transfer: ... received, ... sent
Jeżeli handshake działa, ale IPv6 nie działa, problem najczęściej znajduje się w:
AllowedIPs
routingu IPv6
firewallu
NAT66
9. Test IPv6 z telefonu
Włączamy tunel WireGuard na Androidzie.
Telefon może być podłączony do Wi-Fi, które posiada:
Po uruchomieniu WireGuarda telefon powinien mieć adres:
wewnątrz tunelu.
Następnie otwieramy:
https://test-ipv6.com/
Można również użyć:
https://ipv6-test.com/
Jeżeli konfiguracja jest poprawna, telefon powinien mieć dostęp do Internetu IPv6.
10. Jak działa całość?
Telefon chce odwiedzić serwer IPv6:
Normalnie nie miałby którędy wysłać pakietu, ponieważ lokalne Wi-Fi nie posiada IPv6.
Po uruchomieniu WireGuarda:
Android
fd42:1234:5678::2
|
| IPv6
v
WireGuard
|
| tunel UDP/IPv4
v
OpenWrt
fd42:1234:5678::1
|
| NAT66
v
WAN IPv6
|
v
Internet IPv6
Odpowiedź wraca tą samą drogą:
Internet IPv6
|
v
OpenWrt
|
v
NAT66
|
v
WireGuard
|
v
Android
11. DNS
Możemy użyć DNS routera:
Jeżeli OpenWrt/DNSMasq odpowiada na adresie WireGuard, telefon będzie wykonywał zapytania DNS przez VPN.
Można również użyć publicznego DNS:
lub:
Przy:
AllowedIPs = 0.0.0.0/0, ::/0
ruch DNS również będzie przechodził przez tunel.
12. Wariant tylko IPv6 przez VPN
Jeżeli nie chcemy, aby cały ruch telefonu przechodził przez domowy Internet, możemy zrobić wariant tylko dla IPv6.
Android:
[Interface]
Address = 10.99.0.2/32, fd42:1234:5678::2/64
DNS = 10.99.0.1
[Peer]
PublicKey = KLUCZ_OPENWRT
Endpoint = 198.51.100.10:51820
AllowedIPs = ::/0
PersistentKeepalive = 25
Wtedy:
IPv4
|
v
lokalne Wi-Fi
|
v
Internet
IPv6
|
v
WireGuard
|
v
OpenWrt
|
v
Internet IPv6
Jest to bardzo przydatne, jeżeli chcemy tylko dodać IPv6 do sieci, która go nie posiada.
13. Co z dynamicznym prefixem IPv6 od ISP?
To rozwiązanie ma tutaj dużą zaletę.
ISP może zmienić np.:
na:
Telefon nadal ma:
a OpenWrt wykonuje NAT66 na aktualny publiczny IPv6.
Dlatego konfiguracja Androida nie musi być zmieniana po każdej zmianie prefixu IPv6 przez ISP.
14. Najczęstsze problemy
Problem 1 – WireGuard nie ma handshake
Sprawdzamy:
Jeżeli nie ma:
problem dotyczy samego WireGuarda, Endpointu, portu lub firewalla.
Problem 2 – handshake jest, ale IPv6 nie działa
Sprawdzamy na Androidzie:
AllowedIPs = 0.0.0.0/0, ::/0
albo dla wariantu tylko IPv6:
Na OpenWrt peer powinien mieć:
10.99.0.2/32
fd42:1234:5678::2/128
Problem 3 – OpenWrt ma IPv6, ale Android nie ma Internetu IPv6
Sprawdzamy:
sysctl net.ipv6.conf.all.forwarding
Powinno być:
net.ipv6.conf.all.forwarding = 1
Jeżeli nie:
sysctl -w net.ipv6.conf.all.forwarding=1
Problem 4 – IPv6 działa na OpenWrt, ale nie działa przez WireGuard
Sprawdzamy NAT66:
uci show firewall | grep masq6
Powinno być:
oraz forwarding:
15. NAT66 czy routing IPv6 bez NAT?
W tym poradniku wykorzystujemy:
ULA IPv6
|
v
NAT66
|
v
publiczny IPv6 ISP
Jest to najprostsze rozwiązanie dla telefonu.
Alternatywnie można zrobić prawdziwy routing IPv6 bez NAT66, przydzielając klientowi WireGuard publiczny adres/prefix routowany przez OpenWrt.
To rozwiązanie jest bardziej eleganckie, ale wymaga odpowiedniej adresacji/prefixu od operatora.
Dla typowego domowego zastosowania WireGuard + Android + zmienny prefix IPv6 NAT66 jest znacznie prostszy.
Podsumowanie
Nie potrzebujemy IPv6 w sieci Wi-Fi, do której podłączony jest telefon.
Wystarczy:
Wi-Fi
|
| IPv4
v
WireGuard
|
v
OpenWrt
|
| IPv6 + NAT66
v
Internet IPv6
Najważniejsze elementy konfiguracji:
OpenWrt:
wg0 = 10.99.0.1/24
wg0 = fd42:1234:5678::1/64
Android:
Address = 10.99.0.2/32, fd42:1234:5678::2/64
Android – Peer:
AllowedIPs = 0.0.0.0/0, ::/0
lub tylko IPv6:
OpenWrt – Peer:
AllowedIPs = 10.99.0.2/32, fd42:1234:5678::2/128
Firewall:
Efekt:
Android
|
| Wi-Fi IPv4
v
WireGuard
|
| tunel IPv4
v
OpenWrt
|
| NAT66
v
Internet IPv6
Telefon może korzystać z IPv6 przez domowy router, mimo że lokalna sieć Wi-Fi nie udostępnia IPv6.