LW IT Solutions logo LW IT Solutions logo LW IT Solutions
« Przegląd bloga /Raspberry Pi/Tutorials / Dostęp do sieci domowej przez WireGuard: Raspberry...
Ten artykuł w innych językach:

Dostęp do sieci domowej przez WireGuard: Raspberry Pi jako brama VPN

Część 6 z 7 serii Homelab na Raspberry Pi

Dostęp do sieci domowej przez WireGuard: Raspberry Pi jako brama VPNDostęp do sieci domowej przez WireGuard: Raspberry Pi jako brama VPN

Management Summary

Raspberry Pi może zapewnić chroniony dostęp do wybranych usług sieci domowej podczas pobytu poza domem. WireGuard tworzy szyfrowany tunel dla tego połączenia. Przy podziale ruchu, nazywanym split tunneling, tylko wybrane połączenia korzystają z tunelu, a zwykłe przeglądanie zachowuje lokalną drogę do internetu. Umożliwia to zdalny dostęp bez przekierowania całego ruchu. Artykuł wyjaśnia taki układ i potrzebę reguł określających, do jakich zasobów każde urządzenie może faktycznie dotrzeć.

Przejdź do interaktywnego przykładu ↓

Co się stanie, jeśli …? ↓

Spis treści
  1. 1. Ustalenie sieci i granic dostępu
  2. 2. Przygotowanie narzędzi i kluczy
  3. 3. Ograniczenie przekazywania za pomocą filtrów
  4. 4. Przekazywanie IPv4 i konfiguracja serwera
  5. 5. Konfiguracja klienta z dzielonym tunelowaniem
  6. 6. Oddzielna kontrola działania i blokad
  7. Pytania i odpowiedzi
  8. Źródła

Raspberry Pi może zapewnić dostęp WireGuard do sieci domowej. Przy dzielonym tunelowaniu tylko wybrane sieci docelowe korzystają z tunelu; pozostały ruch internetowy nadal używa lokalnego łącza klienta. Instrukcja ogranicza dostęp VPN do domowej sieci IPv4 i dodaje rzeczywiste reguły filtrowania. Masquerading zastępuje adres źródłowy klienta adresem Pi podczas przekazywania pakietów. Ułatwia to powrót odpowiedzi, lecz samo nie ogranicza dostępu.

WireGuard jest zintegrowany z jądrem Linux. Nie oznacza to stałej przepustowości: wynik zależy od modelu Pi, CPU, sieci, drugiej strony i łącza. IPsec w Linuksie również zwykle przetwarza dane w jądrze, a OpenVPN może korzystać z Data Channel Offload. Twierdzenia o ponad 800 Mb/s, minimalnym obciążeniu CPU czy dostępie bez opóźnień wymagają pomiarów.

1. Ustalenie sieci i granic dostępu

  • Sieć domowa: 192.168.10.0/24; Pi pod stałym adresem 192.168.10.2 na eth0.
  • Serwer WireGuard: 10.100.0.1; jeden klient z własną tożsamością i adresem 10.100.0.2.
  • Dozwolone: połączenia klienta do celów IPv4 w sieci domowej oraz powiązane odpowiedzi.
  • Zablokowane: przekazywanie do innych sieci, nowe połączenia z LAN do klienta i dostęp z wg0 do usług samego Pi.

Przykładowe sieci nie mogą nakładać się wzajemnie ani z aktualną siecią lokalną klienta. eth0 musi odpowiadać rzeczywistemu interfejsowi LAN. Przy dostępie IPv4 router wymaga przekierowania wybranego portu UDP 51820 na Pi, a istniejący firewall hosta musi dopuszczać ten zewnętrzny ruch UDP. Poszczególne porty usług WWW lub dysków w LAN nie wymagają publicznego przekierowania. Przy Carrier-Grade NAT dostawca internetu współdzieli publiczny adres IPv4 między kilkoma łączami. Lokalne przekierowanie często wtedy nie wystarcza; potrzebna jest inna osiągalna droga dostępu.

Dzielony tunel WireGuard z trasami docelowymi, filtrami dostępu i ograniczonym NAT
Trasy klienta wybierają sieć domową. Filtry serwera wymuszają ograniczenia dostępu, a masquerading zapewnia jedynie drogę powrotną z LAN.

2. Przygotowanie narzędzi i kluczy

W aktualnym Raspberry Pi OS narzędzia instaluje się poleceniami sudo apt update i sudo apt install wireguard-tools nftables. Poniższe tworzenie kluczy odbywa się w powłoce Bash konta root. Ograniczająca umask obowiązuje już podczas tworzenia, a set -C zapobiega nadpisaniu istniejących plików kluczy.

Shell
# In a root Bash shell, on the server:
set -euo pipefail
umask 077
install -d -m 700 /etc/wireguard
cd /etc/wireguard
set -C
wg genkey > server_private.key
wg pubkey < server_private.key > server_public.key

Klient tworzy oddzielną parę kluczy lokalnie. Między urządzeniami wymieniane są wyłącznie klucze publiczne. Klucze prywatne nie powinny trafiać do wspólnych notatek ani zrzutów ekranu. Pliki konfiguracyjne także zawierają klucze prywatne i wymagają trybu 600: odczyt i zapis są dozwolone tylko dla właściciela pliku, a grupa i pozostałe konta nie otrzymują uprawnień.

3. Ograniczenie przekazywania za pomocą filtrów

Poniższa zawartość należy do /etc/nftables.d/wireguard.nft. Nazwy tabel wg_guard i wg_nat muszą być zarezerwowane dla tej konfiguracji. Ponowne wczytanie zastępuje tylko własne tabele, a nie cały zestaw reguł. Przed aktywacją składnię sprawdza sudo nft -c -f /etc/nftables.d/wireguard.nft.

Tekst
# Owned tables only; repeated loads replace these rules atomically.
add table inet wg_guard
flush table inet wg_guard
table inet wg_guard {
  chain input {
    type filter hook input priority -10; policy accept;
    iifname "wg0" counter drop
  }
  chain forward {
    type filter hook forward priority -10; policy accept;
    iifname "wg0" ct state invalid counter drop
    iifname "wg0" oifname "eth0" ip saddr 10.100.0.2 ip daddr 192.168.10.0/24 ct state { new, established, related } counter accept
    iifname "eth0" oifname "wg0" ip saddr 192.168.10.0/24 ip daddr 10.100.0.2 ct state { established, related } counter accept
    iifname "wg0" counter drop
    oifname "wg0" counter drop
  }
}
add table ip wg_nat
flush table ip wg_nat
table ip wg_nat {
  chain postrouting {
    type nat hook postrouting priority srcnat; policy accept;
    iifname "wg0" oifname "eth0" ip saddr 10.100.0.2 ip daddr 192.168.10.0/24 counter masquerade
  }
}

Filtr dopuszcza tylko ustalone źródło tunelowe i sieć domową jako cel. NAT maskuje dokładnie ten ruch adresem LAN Raspberry Pi. Urządzenia LAN odpowiadają wtedy bezpośrednio do Pi, bez dodatkowej trasy do sieci tunelowej. Wadą jest widoczny w logach LAN adres Pi zamiast pierwotnego adresu klienta.

Polityka accept pozostawia niezwiązany ruch bez zmian w tych dodatkowych tabelach. Inne istniejące łańcuchy bazowe nadal mogą odrzucać dozwolone pakiety, dlatego potrzebna jest integracja z obecnym firewallem. UFW, firewalld i Docker nie mogą niezauważenie zastępować ani omijać reguł; przyspieszone flowtables muszą wykluczać ruch VPN z ewentualnego obejścia filtrów. Na Pi zarządzanym wyłącznie przez nftables wpis include "/etc/nftables.d/wireguard.nft" może włączyć plik do utrzymywanego trwałego zestawu reguł. Późniejsze przeładowanie firewalla musi zachowywać te reguły.

Rura dla chomika prowadzi tylko do klatki, a druga odnoga do pokoju jest zamknięta zatyczką. Tak samo reguły filtrowania ograniczają, dokąd mogą być przekazywane połączenia z VPN.
Rura dla chomika prowadzi tylko do klatki, a druga odnoga do pokoju jest zamknięta zatyczką. Tak samo reguły filtrowania ograniczają, dokąd mogą być przekazywane połączenia z VPN.

4. Przekazywanie IPv4 i konfiguracja serwera

Przykład obsługuje cele IPv4. Przekazywanie IPv6 nie jest wymagane i nie jest włączane zbiorczo. Dodatkowy filtr inet odrzuca także przekazywanie IPv6 przez wg0, jeśli IPv6 jest już aktywne w innej części konfiguracji.

Konfiguracja
# /etc/sysctl.d/99-wireguard-forwarding.conf
net.ipv4.ip_forward = 1

Polecenie sudo sysctl -p /etc/sysctl.d/99-wireguard-forwarding.conf stosuje konkretny plik. Przykład nie narzuca globalnej wartości filtra ścieżki zwrotnej. Zmiana ip_forward może przywrócić parametrom IPv4 domyślne wartości routera; istniejące ustawienia ochrony wymagają późniejszej kontroli. Ścisłe rp_filter=1 może odrzucać poprawne trasy asymetryczne lub złożony policy routing, dlatego ustawienie musi odpowiadać topologii.

Konfiguracja
# /etc/wireguard/wg0.conf
[Interface]
Address = 10.100.0.1/24
ListenPort = 51820
PrivateKey = <SERVER_PRIVATE_KEY>
PreUp = /usr/sbin/nft -f /etc/nftables.d/wireguard.nft

[Peer]
PublicKey = <CLIENT_PUBLIC_KEY>
AllowedIPs = 10.100.0.2/32

Placeholdery wymagają zastąpienia rzeczywistymi kluczami. PreUp wczytuje filtry przed utworzeniem interfejsu; błąd ładowania zatrzymuje uruchomienie. Reguły pozostają po wyłączeniu i są zastępowane przy kolejnym starcie. Pozwala to uniknąć częściowo wykonanej sekwencji samych poleceń NAT w PostUp. UDP 51820 jest tu świadomym wyborem; bez ustawionego portu nasłuchu WireGuard może wybrać port losowy.

Po sprawdzeniu integracji z firewallem i uprawnień plików usługę uruchamia sudo systemctl enable --now wg-quick@wg0. Utwardzenie dotyczy opisanej ścieżki VPN. Aktualizacje systemu, SSH, pozostałe usługi hosta i prawa dostępu LAN nadal wymagają oddzielnego utrzymania.

5. Konfiguracja klienta z dzielonym tunelowaniem

Konfiguracja
[Interface]
PrivateKey = <CLIENT_PRIVATE_KEY>
Address = 10.100.0.2/32

[Peer]
PublicKey = <SERVER_PUBLIC_KEY>
Endpoint = vpn.example.net:51820
AllowedIPs = 192.168.10.0/24
# Optional for a client behind NAT:
PersistentKeepalive = 25

vpn.example.net jest placeholderem rzeczywistego, osiągalnego punktu końcowego. Aplikacja kliencka lub wg-quick tworzy trasy na podstawie AllowedIPs. Sam WireGuard używa prefiksów do wyboru peera dla wychodzących celów oraz do kontroli adresów źródłowych odebranych pakietów. Dlatego serwerowe AllowedIPs = 10.100.0.2/32 nie zastępuje filtrowania celów ani portów.

Zmiana klienta na 0.0.0.0/0 nie otwiera dostępu do internetu przez Pi przy pokazanych filtrach. Kolejne peery wymagają osobnych kluczy, unikalnych adresów tunelowych i odpowiednich reguł firewalla. PersistentKeepalive = 25 może podtrzymywać mapowania NAT; bez takiej potrzeby wiersz można pominąć.

6. Oddzielna kontrola działania i blokad

  1. Podczas aktywnego ruchu testowego sudo wg show wg0 pokazuje handshake i liczniki transferu. Stary znacznik czasu bezczynnego peera sam w sobie nie dowodzi awarii. wg show ... dump i showconf mogą ujawniać prywatne informacje i nie powinny trafiać do publicznych logów diagnostycznych.
  2. Na kliencie Linux ip route get 192.168.10.10 sprawdza trasę do domu. Przy tej konfiguracji ip route get 1.1.1.1 powinno nadal wskazywać lokalną drogę internetową. Inne systemy wymagają odpowiedniej diagnostyki routingu.
  3. Dozwolona usługa LAN musi być osiągalna. Cele internetowe przez celowo zmienionego testowego klienta pełnego tunelu oraz usługi Pi pod adresem tunelowym muszą pozostać zablokowane. Liczniki w sudo nft list table inet wg_guard pomagają wskazać pasujące reguły.
  4. Autoryzowany test iperf3 mierzy rzeczywistą przepustowość. Wynik ograniczają obciążenie CPU, upload domowy, druga strona i MTU; wysoka wartość sama nie dowodzi pełnego wykorzystania łącza ani braku fragmentacji.

Pytania i odpowiedzi

Czy dzielony tunel szyfruje cały ruch internetowy?

Nie. WireGuard obsługuje tutaj tylko dozwoloną sieć domową. Pozostały ruch internetowy IPv4 i IPv6 korzysta z lokalnego łącza. To zamierzony podział, a nie ogólna usługa anonimowości. Szyfrowanie tunelu kończy się na Pi; dla poufności w dalszej części LAN nadal istotny jest na przykład HTTPS.

Dlaczego nie ma ustawienia DNS?

Dotychczasowe rozwiązywanie nazw klienta zostaje celowo zachowane. Nazwy wewnętrzne mogą wymagać split DNS: pytania o nazwy w sieci domowej trafiają do domowego serwera DNS, a pozostałe do dotychczasowej usługi DNS. Możliwa jest także inna odpowiednio dobrana konfiguracja DNS. Przeniesienie całego DNS do domowego serwera może uzależnić od tunelu również nazwy publiczne. Rzeczywiste działanie zależy od systemu, resolvera, pamięci podręcznej i innych ustawień DNS.

Czy inny port UDP zapewnia niewidoczność bramy?

Inny numer portu nie zastępuje kontroli dostępu. WireGuard ignoruje wiele nieprawidłowych pakietów, ale nie gwarantuje pełnej niewidoczności. Protokół przewiduje na przykład odpowiedzi cookie przy obciążeniu. Podstawą pozostają klucze, reguły firewalla i utrzymanie systemu.

Zrozum przez eksperyment

Dokąd trafi ten pakiet?

Wybierz cel, tryb routingu i AllowedIPs. Mapa pokazuje wybraną drogę albo przyczynę braku wysyłki.

PrefiksInterfejs

Model IPv4 ze stałymi trasami i jednym peerem. Najpierw wygrywa najdłuższy pasujący prefiks; potem peer musi obejmować cel. W modelu trasy pozostają przy niedostępnym tunelu. Bez DNS, firewalla, NAT i wielu tablic; bez prawdziwych pakietów.

Ten moduł działa w przeglądarce i nie wysyła ani nie zapisuje wpisanych danych.

Przejdź do odpowiedniego narzędzia →

Źródło ↗

Zrozum przez eksperyment

Jedna minuta: znajdziesz błąd?

Trasa domyślna przez wg0, ale 192.168.10.0/25 przez eth0. Która droga wygrywa dla 192.168.10.42 w tej tablicy?

Przejdź do odpowiedniego narzędzia →

Źródło ↗

Co się stanie, jeśli …?

Uproszczony model edukacyjny

Co się stanie, jeśli …?

Wyłącz element przykładowej sieci. Które usługi nadal działają?

Wybierz przykład
Internet
DNS
Przełącznik / Wi-Fi
Raspberry Pi

Obraz z kamery w sieci lokalnej

Lokalna kamera jest otwierana przez adres IP. Przełącznik i Wi-Fi łączą ją z Twoim urządzeniem. W tym modelu internet, DNS i Pi nie są potrzebne.

Home Assistant przez lokalny adres IP

Interfejs działa na Pi. Twoje urządzenie łączy się z nim przez sieć lokalną; nazwa DNS nie jest tutaj potrzebna.

Automatyzacja Zigbee na Pi

Koordynator Zigbee podłączony bezpośrednio do Pi steruje lokalnym urządzeniem. Ta stała reguła nie wymaga tutaj Wi-Fi ani internetu.

Dostęp do Home Assistant przez chmurę

Dostęp wykorzystuje nazwę w chmurze i tunel z Pi. W tym przykładzie potrzebuje wszystkich czterech elementów.

Otwarcie nowej zewnętrznej strony

Nowa nazwa, której nie ma w pamięci podręcznej, potrzebuje DNS i drogi do internetu. Lokalne Pi nie hostuje tej obcej strony.

Istniejące połączenie internetowe przez IP

Nawiązane połączenie nie wymaga nowego wyszukania nazwy. Przetrwa awarię DNS, jeśli sieć i internet pozostaną dostępne.

Uproszczony model edukacyjny

Przykładowa sieć, a nie podgląd mojego sprzętu na żywo. Urządzenia mają zasilanie. Pi = Home Assistant z Zigbee przez USB; DNS to zewnętrzny resolver bez pamięci podręcznej i zastępstwa. „Przełącznik / Wi-Fi” oznacza cały dostęp lokalny. Wynik opisuje samą awarię, nie automatyczne przywrócenie działania.

DNS · RFC 1034 ↗

Przejdź do powiązanego artykułu →

Te przykłady działają tylko w Twojej przeglądarce. Nie zakłócają prawdziwych systemów.

PNG z ustawieniami, wynikiem i adresem artykułu. Powstaje lokalnie dopiero po kliknięciu.

Twoja ścieżka nauki →

Homelab na Raspberry Pi

  1. Uruchamianie Raspberry Pi 4 i 5 z SSD: konfiguracja i odzyskiwanie systemu
  2. Zasilanie Raspberry Pi podczas awarii prądu: porównanie pięciu rozwiązań UPS
  3. Automatyczne testowanie i aktualizowanie aplikacji Docker na Raspberry Pi
  4. Serwer domowy Docker Compose: Traefik, TLS i monitorowanie aktualizacji
  5. Jellyfin na Raspberry Pi 5: odtwarzanie filmów bez kosztownej konwersji
  6. Dostęp do sieci domowej przez WireGuard: Raspberry Pi jako brama VPN
  7. Monitorowanie Raspberry Pi: Prometheus i Grafana
Lukas Wójcik

Lukas Wójcik

Systems architect and technology enthusiast specializing in scalable tracking solutions, GMP Stack (GA4 & GTM), and robust backend architectures. Advocate for clean code and privacy-first design.

Kontakt

Masz pytanie lub pomysł na projekt internetowy? Napisz krótko, o co chodzi. Formularz korzysta z reCAPTCHA i formconfirmed do ochrony przed spamem.

Napisanie komentarza

Doświadczenia z innymi modelami i pytania o konfigurację są tu mile widziane.

Adres e-mail nie jest publikowany. Pola obowiązkowe oznaczono gwiazdką.

LUKASWOJCIK.COM · NEWSLETTER

Nowe pomysły w skrzynce

Nowe artykuły, praktyczne narzędzia i informacje o projektach.

Wybierz tematy (opcjonalnie)
Bez wyboru: wszystkie tematy.

Zapis wymaga potwierdzenia e-mailem. · Prywatność

Prywatność · Newsletter

Adres e-mail, język, wybrane tematy oraz daty zapisu i potwierdzenia są przechowywane w celu wysyłki newslettera. Wymagane jest potwierdzenie zapisu. Każda wiadomość zawiera link do natychmiastowej rezygnacji. Formconfirmed chroni formularz przed spamem. Brak śledzenia otwarć i kliknięć.

Pełna polityka prywatności ↗