WireGuard — wspaniały VPN przyszłości?

WireGuard — wspaniały VPN przyszłości?

Nastał czas, kiedy VPN przestał być egzotycznym narzędziem dla brodatej administracji systemów. Użytkownicy mają różne potrzeby, ale jedno jest pewne: VPN stał się niezbędny dla wszystkich.

Problemem obecnych rozwiązań VPN jest to, że są trudne w prawidłowej konfiguracji, drogie w utrzymaniu, a także zawierają mnóstwo przestarzałego kodu wątpliwej jakości.

Kilka lat temu kanadyjski specjalista ds. bezpieczeństwa informacji Jason A. Donenfeld postanowił, że dość tego i rozpoczął prace nad WireGuard. Obecnie WireGuard przygotowuje się do włączenia do jądra Linuxa, zyskał nawet uznanie od Linusa Torvaldsa i w amerykańskiemu senatowi.

Ogłoszone zalety WireGuard w porównaniu do innych rozwiązań VPN:

  • Łatwy w użyciu.
  • Wykorzystuje nowoczesną kryptografię: Noise protocol framework, Curve25519, ChaCha20, Poly1305, BLAKE2, SipHash24, HKDF itd.
  • Kompaktowy, czytelny kod, łatwiejszy do badania pod kątem podatności.
  • Wysoka wydajność.
  • Jasna i przemyślana specyfikacja.

Czy naprawdę znaleziono srebrną kulę? Czas zakopać OpenVPN i IPSec? Postanowiłem to zbadać i przy okazji stworzyłem skrypt do automatycznej instalacji osobistego serwera VPN.

Zasady działania

Zasady działania można opisać w przybliżeniu tak:

  • Tworzony jest interfejs WireGuard, przypisywany jest mu klucz prywatny oraz adres IP. Ładowane są ustawienia innych węzłów: ich klucze publiczne, adresy IP itd.
  • Wszystkie pakiety IP przychodzące na interfejs WireGuard są enkapsulowane w UDP i bezpiecznie dostarczane do innych węzłów.
  • Klienci podają publiczny adres IP serwera w ustawieniach. Serwer automatycznie poznaje zewnętrzne adresy klientów, gdy przychodzą od nich poprawnie uwierzytelnione dane.
  • Serwer może zmieniać publiczny adres IP bez przerywania pracy. Informuje o tym podłączonych klientów, którzy aktualizują swoją konfigurację w czasie rzeczywistym.
  • Wykorzystywana jest koncepcja routingu Cryptokey Routing. WireGuard przyjmuje i wysyła pakiety w oparciu o publiczny klucz węzła. Gdy serwer poprawnie deszyfruje uwierzytelniony pakiet, sprawdza jego pole src. Jeśli odpowiada ono konfiguracji allowed-ips uwierzytelnionego węzła, pakiet jest przyjmowany przez interfejs WireGuard. Przy wysyłaniu pakietu wychodzącego odbywa się odpowiednia procedura: pobierane jest pole dst pakietu, a na jego podstawie wybierany jest odpowiedni węzeł, pakiet jest podpisywany własnym kluczem, szyfrowany kluczem węzła i przesyłany do zdalnego punktu.

Cała główna logika WireGuard zajmuje mniej niż 4 tysiące linii kodu, podczas gdy OpenVPN i IPSec mają setki tysięcy linii. Aby wspierać nowoczesne algorytmy kryptograficzne, proponuje się włączenie do jądra Linux nowego API kryptograficznego. ZincObecnie trwa dyskusja na temat tego, jak udany jest to pomysł.

Wydajność

Maksymalne korzyści z wydajności (w porównaniu do OpenVPN i IPSec) będą zauważalne na systemach Linux, ponieważ WireGuard jest zaimplementowany jako moduł jądra. Oprócz tego wspierane są macOS, Android, iOS, FreeBSD i OpenBSD, ale w tych systemach WireGuard działa w przestrzeni użytkownika, co wpływa na wydajność. Wsparcie dla Windows ma zostać dodane w najbliższej przyszłości.

Wyniki benchmarków z oficjalnej strony:

WireGuard — wspaniały VPN przyszłości?

Moje doświadczenia z używaniem

Nie jestem ekspertem w konfiguracji VPN. Raz konfigurowałem OpenVPN ręcznie i było to bardzo uciążliwe, a IPSec nawet nie próbowałem. Zbyt wiele decyzji trzeba podjąć, łatwo jest sobie zaszkodzić. Dlatego zawsze korzystałem z gotowych skryptów do konfiguracji serwera.

Tak więc, z mojego punktu widzenia, WireGuard jest idealny dla użytkownika. Wszystkie decyzje niskopoziomowe są zawarte w specyfikacji, dzięki czemu proces przygotowania typowej infrastruktury VPN zajmuje zaledwie kilka minut. Popełnienie błędu w konfiguracji jest praktycznie niemożliwe.

Proces instalacji jest szczegółowo opisany na oficjalnej stronie, warto szczególnie wyróżnić doskonałą obsługę OpenWRT.

Klucze szyfrowania generowane są za pomocą narzędzia wg:

SERVER_PRIVKEY=$( wg genkey )
SERVER_PUBKEY=$( echo $SERVER_PRIVKEY | wg pubkey )
CLIENT_PRIVKEY=$( wg genkey )
CLIENT_PUBKEY=$( echo $CLIENT_PRIVKEY | wg pubkey )

Następnie należy stworzyć konfigurację serwera /etc/wireguard/wg0.conf o następującej treści:

[Interface]
Address = 10.9.0.1/24
PrivateKey = $SERVER_PRIVKEY
[Peer]
PublicKey = $CLIENT_PUBKEY
AllowedIPs = 10.9.0.2/32

i uruchomić tunel skryptem wg-quick:

sudo wg-quick up /etc/wireguard/wg0.conf

W systemach z systemd zamiast tego można użyć sudo systemctl start wg-quick@wg0.service.

Na maszynie klienckiej stwórz konfigurację /etc/wireguard/wg0.conf:

[Interface]
PrivateKey = $CLIENT_PRIVKEY
Address = 10.9.0.2/24
[Peer]
PublicKey = $SERVER_PUBKEY
AllowedIPs = 0.0.0.0/0
Endpoint = 1.2.3.4:51820 # Zewnętrzny IP serwera
PersistentKeepalive = 25 

I w ten sam sposób uruchom tunel:

sudo wg-quick up /etc/wireguard/wg0.conf

Pozostaje skonfigurować NAT na serwerze, aby klienci mogli wychodzić do Internetu, i wszystko gotowe!

Taką prostotę użytkowania i kompaktowość bazy kodu udało się osiągnąć dzięki rezygnacji z funkcjonalności dystrybucji kluczy. Nie ma tutaj skomplikowanego systemu certyfikatów i tego całego korporacyjnego koszmaru, krótkie klucze szyfrowania są dystrybuowane w sposób podobny do kluczy SSH. Jednak w związku z tym pojawia się problem: wdrożenie WireGuard może być trudne w niektórych już istniejących sieciach.

Wśród wad warto zauważyć, że WireGuard nie działa przez proxy HTTP, ponieważ transportem jest tylko protokół UDP. Nasuwa się pytanie, czy możliwe będzie obfuskurowanie protokołu? Oczywiście, nie jest to bezpośrednie zadanie VPN, ale na przykład OpenVPN ma sposoby na maskowanie pod HTTPS, co ułatwia mieszkańcom krajów totalitarnych pełne korzystanie z Internetu.

Wnioski

Podsumowując, to bardzo interesujący i obiecujący projekt, który można obecnie wykorzystać na prywatnych serwerach. Jakie korzyści? Wysoka wydajność w systemach Linux, łatwość konfiguracji i wsparcia, kompaktowa i czytelna baza kodu. Jednak rzucanie się na przetłumaczenie kompleksowej infrastruktury na WireGuard jest jeszcze przedwczesne, warto poczekać na włączenie do jądra Linux.

Aby zaoszczędzić swój (i wasz) czas, opracowałem automatyczny instalator WireGuard. Dzięki niemu możesz uruchomić prywatny VPN dla siebie i swoich znajomych, nawet nie rozumiejąc w tym nic.

Źródło: habr.com

Kup niezawodny hosting stron z ochroną DDoS, serwery VPS VDS 🔥 Kup niezawodny hosting stron z ochroną DDoS, serwery VPS VDS - ProHoster