Turbodoładowanie połączenia internetowego (WARP, IPv6, OpenWrt)
Cloudflare słynie z tego, że jest drugim Google i udostępnia nam wysokiej jakości usługi, z czego dużą ich część można używać za darmo bez żadnych kompromisów. Na szczęście, w przeciwieństwie do Google, nie uśmierca tak ochoczo swoich usług.
Od zarządzania domenami, poprzez certyfikat SSL dla twojej strony www, bezpieczny i szybki DNS, poprzez turbodoładowanie połączenia internetowego z WARP (lub WARP+ dla tych, którzy chcą więcej).
Cloudflare WARP
WARP jest czymś w rodzaju serwera VPN mającego na celu przyśpieszenie serfowania w internecie. Nie jest on jednak prawdziwym VPN-em takim jak TunnelBear czy inne. Nie pozwala on ukryć naszego oryginalnego adresu IP czy kraju, z którego przeglądamy internet. WARP skupia się na kierowaniu ruchu w taki sposób, aby był on szybki i bezpieczny.
WARP w połączeniu z serwerem nazw (DNS) 1.1.1.1 szyfruje ruch nie tylko DNS, ale również ten pomiędzy tobą (twoim urządzeniem) a serwerami Cloudflare. Dzięki temu tylko ty (i Cloudflare) wie, co odwiedzasz w internecie, a nie twój usługodawca internetowy oraz służby wywiadowcze danego kraju, które aktywnie podsłuchują ruch w sieci, szczególnie ten nieszyfrowany.
Już sam serwer nazw (1.1.1.1) spowodował niemałe zamieszanie i “przyspieszył” internet. W momencie, gdy dołączono do niego szyfrowanie naszych zapytań DNS, tworząc tak zwany bezpieczny DNS (DNS przez HTTPS), WARP dołożył swoje, szyfrując dodatkowo ruch wychodzący z naszego urządzenia.
WARP dostępny jest w postaci aplikacji na przeróżne urządzenia poprzez oficjalne aplikacje.
Cloudflare WARP i WireGuard
W momencie, gdy aplikacje Cloudflare na platformy stacjonarne nie były jeszcze dostępne (już są), zagłębiłem się ten temat, próbują uruchomić tunel Cloudflare przy pomocy odpowiedniej konfiguracji aplikacji WireGuard.
Tak, dobrze czytasz, Cloudflare wykorzystuje protokół bazujący na WireGuard.
W ostatnich tygodniach większość dużych dostawców usługi VPN zauważyły pozytywną stronę tego rozwiązania i dodają je do swojej sieci (tak jak NordVPN z ich NordLynx).
W moim wpisie opisywałem jak dodać serwer VPN bazujący na WireGuard do routera z OpenWrt.
W związku z tym, że Cloudflare WARP wykorzystuje WireGuard do komunikacji, można też wykorzystać nasz router jako klienta VPN.
Po co? Już tłumaczę.
Otóż WARP to nie tylko szyfrowanie i prędkość, to również obsługa IPv6. Jeżeli twój usługodawca internetowy (tak jak mój) nie oferuje połączenia z internetem za pomocą IPv6, łącząc się z WARP, zyskujemy tę możliwość.
Od czasu do czasu oficjalna aplikacja Cloudflare na macOS powoduje problemy z dostępem do sieci przez IPv6. Ustawienie połączenia Cloudflare poprzez WireGuard (z użyciem wgcf), a nie oficjalną aplikację, pomaga ten błąd naprawić.
Niedawno opisałem, jak dodać tunel IPv6 do naszego połączenia internetowego w celu uzyskania wyjścia na świat po IPv6. Tego typu rozwiązanie jednak ma kilka negatywnych stron, jeżeli twój dostawca internetowy (w moim przypadku Virgin Media w UK), postanowi wprowadzić niepisane filtrowanie i spowalnianie ruchu odbywającego się właśnie z tego typu połączeń. W moim przypadku wpis, który stworzyłem, jest idealny, ale dla mnie osobiście nieużyteczny, w związku z tym cały czas szukam innego rozwiązania.
Gdy aplikacje Cloudflare (1.1.1.1) na urządzenia stacjonarne nie były jeszcze dostępne, postanowiłem wykorzystać aplikację WireGuard i dodać WARP do mojego komputera. Oczywiście, udało się dzięki wgcf — nieoficjalnym, wieloplatformowy interfejsie wiersza poleceń dla Cloudflare WARP.
To dało mi do myślenia.
Cloudflare WARP, WireGuard i IPv6
Utworzony przeze mnie tunel IPv6 (6in4) wg mojego poprzedniego wpisu nie jest przydatny na moim aktualnym połączeniu (w związku z ograniczeniem prędkości do 10% pełnej prędkości mojego łącza), natomiast łączność z IPv6 przez WARP nie posiada tego typu problemów, pomyślałem, że skoro wykorzystuje WireGuard jako serwer VPN, dlaczego nie wykorzystać go jako klient na moim routerze?
Posiadanie klienta i serwera na jednym urządzeniu jest poniekąd dziwne, ale w pełni możliwe.
Serwer WireGuard używam, aby połączyć się z moją siecią lokalną, gdy jestem poza domem. Klienta Wireguard używałbym jednak aby dodać szyfrowanie ruchu internetowego oraz obsługa IPv6 za pomocą Cloudflare WARP.
Oczywiście, połączenie się z WARP po stronie routera to jedno, ale dodanie obsługi WARP do urządzeń w sieci lokalnej to drugie, szczególnie jeżeli chodzi o IPv6 (co nie jest takie oczywiste).
Dodanie WARP do routera odbywa się przez dodanie nowego interfejsu oraz jego konfiguracji. Nie jest to nadzwyczaj trudne i pozwoli nam korzystać z internetu po IPv4 poprzez połączenie Cloudflare. O tym za chwilę.
Inną sprawą jest z IPv6. Cloudflare nie przypisuje nam zakresu adresów IPv6 do wykorzystania a jedynie lokalny pojedynczy adres (w masce /128), który później, odpowiednimi regułami kierowany jest dalej.
W momencie, gdy mamy dostępny IPv6 na routerze, możemy go również wykorzystać, aby kierować ruch po tym protokole, przez niego z wykorzystaniem dostępnych reguł oraz maskarady.
A więc zobaczmy jak to zrobić.
Cloudflare WARP i router z OpenWrt
W pierwszej kolejności musimy wygenerować plik konfiguracyjny Cloudflare WARP, a następnie dodać go do naszego routera.
wgcf - aplikacja
Aby to zrobić, logujemy się na nasz router z OpenWrt przez terminal SSH i pobieramy program wgcf.
Przechodząc do Releases na GitHub, z sekcji Assets musimy pobrać i zapisać wersję kompatybilną z naszym sprzętem.
W niektórych przeglądarkach lista Assets wyświetlona jest w formie okrojonej. Aby zobaczyć wszystkie dostępne pliki na przeróżne platformy sprzętowe, musimy dodatkowo kliknąć przycisk pod listą Show all XX assets.
Przechodząc do naszego panelu administracyjnego routera z OpenWrt (domyślnie 192.168.1.1), po zalogowaniu się, od razu na pierwszej stronie informacyjnej otrzymamy informację, w sekcji Architecture, jakim procesorem dysponujemy.
W moim przypadku to ARMv7 a więc muszę pobrać plik wgcf_2.2.22_linux_armv7
.
W momencie aktualizacji niniejszego wpisu najnowszą wersją była wersja 2.2.22.
Wykorzystując curl:
curl -L https://github.com/ViRb3/wgcf/releases/download/v2.2.22/wgcf_2.2.22_linux_armv7 > wgcf
lub przy pomocy wget
wget https://github.com/ViRb3/wgcf/releases/download/v2.2.22/wgcf_2.2.22_linux_armv7 -O wgcf
Po jego pobraniu dodajemy prawa wykonywania i uruchamiamy, bez parametrów, aby zobaczyć czy działa.
chmod +x wgcf
./wgcf
Gdy wszystko działa, tak jak trzeba, możemy przystąpić do kolejnego kroku, czyli wygenerowania niezbędnych plików konfiguracyjnych.
wgcf - plik konfiguracyjny dla WireGuard
Posiadając wgcf
na naszym routerze musimy zarejestrować się w usłudze Cloudflare WARP:
wgcf register
Po zatwierdzeniu Terms of Service otrzymamy plik wgcf-account.toml
Z wykorzystaniem (program sam go użyje) tego pliku wygenerujemy nasz plik konfiguracyjny:
wgcf generate
Jeżeli wszystko poszło ok, to otrzymamy plik wgcf-profile.toml
. Plik ten posiada konfigurację WireGuard, którą użyjemy do ustawienia połączenia na naszym routerze.
Tak wygenerowany plik konfiguracyjny możesz użyć na dowolnym urządzeniu, na którym możesz zainstalować aplikację WireGuard. Tak jak wspomniałem wcześniej, w przypadku oficjalnej aplikacji Cloudflare WARP na macOS, tą metodą możemy uzyskać dostęp do sieci IPv6, w momencie, gdy oficjalna aplikacja zawodzi.
Ustawienie interfejsu
Jeżeli nie masz jeszcze pakietu WireGuard zainstalowanego na twoim routerze, wykonaj następujące czynności z poziomu terminala SSH:
opkg update
opkg install luci-app-wireguard luci-proto-wireguard kmod-wireguard wireguard-tools
reboot
Nie przechodź dalej, jeżeli nie uruchomiłeś ponownie routera komendą
reboot
(trzecia komenda w powyższym bloku).
Po zainstalowaniu i uruchomieniu naszego routera ponownie jesteśmy gotowi na następny krok.
Przechodzimy do Network > Interfaces w naszym panelu administracyjnym routera przez przeglądarkę internetową.
Klikając przycisk Add new interface…, wprowadzamy nazwę (Name), wybieramy protokół (Protocol) WireGuard VPN i potwierdzamy przyciskiem Create interface.
Po utworzeniu interfejsu ukarzą nam się dodatkowe opcje. Przewijamy na sam dół i klikamy przycisk Load configuration….
W terminalu odczytujemy zawartość pliku wgcf-profile.toml
.
tail wgcf-profile.toml
Zaznaczamy i kopiujemy zawartość do schowka, wklejamy ją do pola importu i kończymy, klikając przycisk Import settings. Nim to jednak zrobisz, przeczytaj poniżej.
Z tego, co zauważyłem, podczas importu, adresy IP importowane są nieprawidłowo. Po zaimportowaniu ustawień powinniśmy mieć adres IPv4, jak i IPv6 zarówno w General Settings > IP Addresses jak i w konfiguracji Peers gdzie w Allowed IPs powinniśmy widzieć zarówno 0.0.0.0/0
jak i ::/0
.
Odczytując plik wgcf-profile.toml
, w sekcji [Interface] mamy 2 linijki Address =
oraz w secji [Peer] 2 linijki AllowedIPs =
co powoduje, że tylko ostatni adres (2.) jest dodany.
Nim naciśniemy Import settings musimy z 2 linijek zrobić jedną, a adresy oddzielić przecinkiem (,).
Dla przykładu linijka adresowa w sekcji [Interface]
powinna wyglądać następująco:
Address = 172.16.0.2/32, 2606:4700:110:8998:1b86:d65a:d153:1234/128
Linijka dozwolonych adresów IP w sekcji [Peer]
powinna wyglądać następująco:
AllowedIPs = 0.0.0.0/0, ::/0
Nie wiem, czy jest to błąd w wgcf
, czy w pakiecie OpenWrt. Zaraportowałem ten błąd do twórcy i zobaczymy, co się stanie.
Aplikacja WireGuard na macOS importuje informacje prawidłowo bez konieczności modyfikowana czegokolwiek.
Nim zapiszemy ustawienia, przejdźmy jeszcze do zakładki Firewall Settings i dodajmy nasze połączenie do grupy wan.
W zakładce Zaawansowanych Ustawień (Advanced Settings) naszego nowego interfejsu, w ramach optymalizacji prędkości musimy jeszcze zmienić domyślne ustawienia dla MTU — Maximum transmission unit (Use MTU on tunnel interface) na 1280 (z domyślnego 1420).
MTU z reguły ustawia się wg. MTU naszego połączenia sieciowego pomniejszonego o 20. Jeżeli nasze połączenie internetowe używa MTU 1500, wówczas ustawiamy 1480. Nasze MTU dla poszczególnych interfejsów sprawdzimy komendą ifconfig z poziomu terminala. Twórca skryptu wgcf zaleca jednak ustawienie MTU na wartość 1280, jako wartości maksymalnej.
Dodatkowo przechodzimy do zakładki Peers i klikamy na, jedynej tam dostępnej konfiguracji, przycisk Edit.
Zaznaczamy przycisk przy Route Allowed IPs oraz wprowadzamy wartość 25 przy Persistent Keep Alive.
Drobna uwaga. W momencie, gdy zapiszemy i zastosujemy zmiany w zaznaczoną opcją Route Allowed IPs, na chwilę stracimy połączenie z internetem, po czym cały nasz ruch będzie kierowany przez połączenie z Cloudflare.
Jak zauważyłem, włączenie Route Allowed IPs spowodował, że mój serwer VPN oparty o WireGuard na routerze, jak również mój tunel Zero Trust od Cloudflare, przestały działać (być dostępny z poziomu internetu). Stało się to tak, gdyż nowy interfejs przejął obsługę IPv4 oraz IPv6. Edytując Peers i usówając kierowanie ruchu dla IPv4 (0.0.0.0/0) z sekcji Route Allowed IPs pozwala na ograniczenie wykorzystania sieci Cloudflare tylko do ruchu IPv6. Takim sposobem, w momencie, gdy nie posiadamy połączenia internetowego z IPv6, zyskamy je w całej sieci, ale o tym za chwilę.
Teraz możemy zapisać całość przyciskiem Save.
Następnym krokiem jest kliknięcie przycisku Save & Apply w celu zastosowania zmian.
Sprawdzenie interfejsu
Jeżeli wszystko wykonaliśmy prawidłowo, nasz interfejs powinien zacząć generować ruch widoczny w wartości RX oraz TX.
Jeżeli wartości te pozostają na Zero, wówczas połączenie nie działa.
W celu upewnienia się, że połączenie działa, możemy użyć wgcf na routerze:
./wgcf trace
Pośród danych wyplutych przez powyższą komendę zwróćmy uwagę na linijkę warp= która powinna zwrócić wartość warp=on.
Obsługa IPv6
Jeżeli nasz usługodawca nie oferuje nam dostępu do IPv6 a interfejs wan6, mimo że włączony, nie posiada własnego adresu IP, dodając tunel Cloudflare WARP powyższą metodą, dodaliśmy jednocześnie obsługę IPv6 do naszego routera.
Aby to sprawdzić, wystarczy wykonać komendę ping.
ping ipv6.google.com
lub
ping -6 openwrt.org
Ruch kierowany po IPv6 wysyłany jest przez interfejs Cloudflare. Jeżeli usunęliśmy z Route Allowed IPs adres 0.0.0.0/0
, wówczas ruch IPv4 będzie wysyłany przez nasze główne połączenie internetowe wan. Jeżeli posiadamy oba adresy dodane w Route Allowed IPs, wówczas wszystko wysyłane jest przez sieć Cloudfflare WARP.
Wykorzystanie połączenia w sieci LAN
Takim sposobem nasz router ma dostęp do Cloudflare WARP. Odpowiada on na ping do adresów (domen) po IPv4, jak również IPv6 (wykorzystując ping lub ping6).
Pozostaje nam dodanie jeszcze możliwości obsługi WARP przez urządzenia w sieci LAN.
Cloudflare przypisuje nam adres IPv6 w masce /128
, czyli otrzymujemy tylko jeden adres wyjściowy do internetu. W przeciwieństwie do mojego poprzedniego wpisu Dodanie tunelu IPv6 do routera z OpenWrt, w którym dodanie tunelu IPv6 umożliwia przypisanie urządzeniom w sieci LAN zewnętrznych adresów IPv6, tutaj, aby użytkownicy w sieci LAN mogli korzystać z dostępu po IPv6, musimy zastosować maskaradę i NAT66.
Działać to będzie na podobnej zasadzie jak mamy domyślnie ustawione z adresem IPv4 otrzymanym od naszego usługodawcy. Każdy użytkownik w internecie będzie widoczny pod tym samy adresem IP, zarówno IPv4, jak i IPv6.
Aby to zrobić, musimy dokonać kilka zmian w naszym systemie.
Włączenie maskarady IPv6
W sekcji Firewall, w panelu sterowania naszego routera OpenWrt, klikamy przycisk Edit w sekcji Zones przy strefie wan.
Przechodząc do Advanced Settings zaznaczmy opcję IPv6 Masquerading i klikamy przycisk Save, następnie potwierdzamy i wprowadzamy zmiany przyciskiem Save & Apply.
Samo włączenie maskarady po IPv6 nie wystarczy, aby klienci w sieci LAN mogli komunikować się przez ten protoków. Przed włączeniem maskarady, ping6 do adresu ipv6.google.com zwracał błąd, podczas gdy z włączoną maskaradą, odpowiedź pozostaje głucha. W związku z tym musimy dokonać jeszcze jednej zmiany.
Włączenie komunikacji po IPv6 w sieci LAN
Przechodzimy do Network > Interfaces i klikamy przycisk Edit przy sieci lan.
Przechodzimy do zakładki DHCP Server a następnie do IPv6 RA Settings.
Tutaj zmieniamy:
- Default router na forced (z automatic).
- RA Flags zaznaczmy zarówno (M) i (O) (domyślnie jest tylko (O))
Klikamy przycisk Save, następnie potwierdzamy i wprowadzamy zmiany przyciskiem Save & Apply.
W momencie zapisania ustawień, klienci w sieci lokalnej automatycznie otrzymali przypisanie adresów IPv6 oraz umożliwiona została komunikacja po sieci IPv6 przez nasz router z wykorzystaniem maskarady IPv6.
Możemy to sprawdzić, wykonując poniższą komendę na komputerze w sieci:
ping6 ipv6.google.com
Lub przechodząc na stronę ipv6.google.com, która powinna załadować się bez problemów.
Jeżeli mamy problem z interpretacją domen i ich adresów IPv6, upewnijmy się, że w Network > DHCP and DNS, zakładce Forwards mamy dodane zarówno servery nazw DNS dla IPv4, jak i IPv6, jak i w Interface > lan, w sekcji Advanced Settings > Use custom DNS servers.
1.1.1.1
1.0.0.1
2606:4700:4700::1111
2606:4700:4700::1001
Takim sposobem zyskaliśmy obsługę IPv6 w naszej sieci bez większych problemów.
Zastosowanie maskarady oraz NAT66 nie jest czymś zalecanym, gdyż przeczy to ideologii adresów IPv6, ale w przypadku, gdy posiadamy adres IPv6 w masce /128
(czyli jeden jedyny), jest to poniekąd jedyne rozwiązanie.
I to by było na tyle.
Jeżeli nie chcesz się bawić w konfigurowanie routera na potrzeby Cloudflare WARP, możesz posłużyć się dostępnymi aplikacjami, przechodząc na stronę 1.1.1.1 i wybierając na odpowiedni odnośnik. Możesz też skonfigurować aplikację WireGuard do obsługi Cloudflare WARP z wykorzystaniem wgcf, jak opisałem powyżej.
Pozdrawiam.