Konfiguracja Policy-Based Routing w systemie OpenWrt
Od pewnego czasu na mojej stronie poruszam tematykę związaną z OpenWrt. Jednym z głównych obszarów zainteresowań moich czytelników była implementacja WireGuard, dodawanie tunelu Cloudflare WARP oraz zarządzanie wieloma łączami internetowymi na jednym routerze.
Do tej pory nie opisałem jednak, jak warunkowo kierować ruchem w sytuacji, gdy dysponujemy dwoma łączami lub gdy do pojedynczego połączenia fizycznego dodaliśmy połączenie wirtualne (takie jak VPN).
Choć do przekierowania ruchu można wykorzystać reguły zapory ogniowej (firewalla), ich wdrożenie nie zawsze jest proste i intuicyjne. W związku z tym zacząłem szukać alternatywnego rozwiązania.
Zależało mi szczególnie na możliwości szybkiego skonfigurowania routera tak, aby w razie potrzeby kierował ruch z konkretnego urządzenia bezpośrednio przez tunel VPN. Aby to ułatwić, przyjrzałem się pakietowi PBR (Policy-Based Routing).
Instalacja
Moim celem jest sprawne zarządzanie całością z poziomu interfejsu webowego. Z tego powodu nie będę instalował samego pakietu pbr osobno. Zamiast tego zainstaluję bezpośrednio pakiet LuCI, który automatycznie pobierze pbr jako wymaganą zależność.
opkg update
opkg install luci-app-pbr
service rpcd restart
Procedura ta wymaga zainstalowania pakietu
luci-app-pbroraz zrestartowania usługirpcdprzed przystąpieniem do dalszej konfiguracji.
Domyślnie, podczas pierwszej instalacji, zobaczysz komunikat o błędzie. To zupełnie normalne. Usługa pbr jest wyłączona na starcie, aby mieć pewność, że nic nie przestanie działać na tym etapie. Na razie możesz to zignorować.
ERROR: The pbr service is currently disabled!
Run the following commands before starting the service again:
uci set pbr.config.enabled='1'; uci commit pbr;
pbr 1.2.0-r6 FAILED TO START in fw4 nft file mode!!! Check the output of nft -c -f /var/run/pbr.nftERROR: The pbr service is currently disabled!
ERROR: Errors encountered, please check https://docs.openwrt.melmac.ca/pbr/1.2.0/#ErrorMessagesDetails!
Zanim przejdziemy dalej, możemy zalogować się do routera przez przeglądarkę. W sekcji Usługi (Services) pojawi się nowa opcja o nazwie Policy Routing.
Zanim jednak uruchomimy usługę, przejrzyjmy domyślne ustawienia i dostosujmy je do naszego środowiska.
Konfiguracja
Konfiguracja podstawowa
- Szczegółowość logów (Output verbosity)
To ustawienie określa, jak wiele informacji usługa
pbrprzesyła do logów systemowych (logread) oraz konsoli podczas uruchamiania i wprowadzania zmian w regułach.
- Rekomendacja: Pozostaw opcję Verbose output (domyślną). Gdy upewnisz się, że wszystko działa poprawnie, możesz przełączyć ją na Condensed output.
- Ścisłe egzekwowanie reguł (Strict Enforcement)
Decyduje o tym, co dzieje się z ruchem sieciowym, gdy brama przypisana do danej reguły (np. tunel VPN) przestanie działać. Funkcja ta jest powszechnie znana jako Kill switch.
- Rekomendacja: Jeśli chcesz zapobiec wyciekowi swojego prawdziwego adresu IP w przypadku awarii połączenia VPN, wybierz Strictly enforce policies (opcja domyślna). Jeśli wolisz, aby internet nadal działał przez Twojego głównego dostawcę (ISP) nawet po zerwaniu „chronionego” połączenia, wybierz Do not enforce.
- Wsparcie dla zestawów resolvera dla domen (Use resolver set support for domains)
Pozwala to usłudze
pbrna wykorzystanieipsetlubnftsetdo przekierowywania całych domen (np. netflix.com) poprzez przechwytywanie zapytań DNS — o ile jest to obsługiwane.
- Rekomendacja: Ustaw tę opcję na Enabled (szczególnie szukaj opcji związanej z
nftset, np.Dnsmasq nft set). Ponieważ obecne wersje OpenWrt korzystają zfw4, używanie zestawów (sets) jest najskuteczniejszym sposobem na obsługę routingu opartego na domenach bez konieczności ręcznego szukania zakresów IP.
Na moim routerze, GL-MT6000 (Flint 2), dostępna była jedynie opcja Disabled, której towarzyszył komunikat: The dnsmasq.nftset is not supported on this system..
Zdecydowanie warto włączyć tę funkcję, jeśli planujemy kierować ruch z konkretnych stron internetowych (takich jak BBC iPlayer) przez wybrane interfejsy.
OpenWrt 24.10 korzysta z nowoczesnego środowiska nftables. Ostrzeżenie dotyczące dnsmasq.nftset zazwyczaj oznacza, że nie można odnaleźć starszego skryptu integracyjnego dla dnsmasq, ale nie powinno to nas zniechęcać.
Dlaczego opcja jest wyłączona (Disabled)?
Aby usługa pbr mogła korzystać z zestawów domen, wymaga ona, by dnsmasq (który jest obecny w systemie) był skompilowany ze wsparciem dla nftset. W nowszych wydaniach OpenWrt standardowy pakiet dnsmasq często musi zostać zastąpiony wersją dnsmasq-full.
Jak to naprawić? Aby odblokować tę opcję, zazwyczaj musimy podmienić komponenty DNS. Możemy to zrobić, wykonując poniższe polecenia:
opkg update
opkg remove dnsmasq
opkg install dnsmasq-full
Zanim przejdziemy dalej, wykonajmy również te polecenia:
rm /tmp/luci-indexcache*
service rpcd restart
Gdy wrócimy do interfejsu webowego i odświeżymy stronę, opcja Dnsmasq nft set powinna być już dostępna na liście rozwijanej.
- Obsługa IPv6 (IPv6 Support)
To ustawienie decyduje, czy silnik zasad ma tworzyć tablice routingu i reguły zapory ogniowej dla ruchu IPv6.
- Rekomendacja: Ustaw opcję na Enabled, jeśli Twój dostawca (ISP) zapewnia łączność IPv6. Pozostawienie tej opcji wyłączonej spowoduje powstawanie „wycieków” — podczas gdy ruch IPv4 będzie kierowany zgodnie z Twoimi zasadami, ruch IPv6 je pominie i wyjdzie przez domyślną bramę operatora.
Konfiguracja zaawansowana
- Obsługiwane interfejsy (Supported Interfaces)
To pole wskazuje usłudze
pbrdokładnie te interfejsy sieciowe, przez które dozwolone jest kierowanie ruchu. Jeśli pozostawisz je puste, system zazwyczaj spróbuje automatycznie wykryć tunele (takie jaktun*czywg*).
- Rekomendacja: Na razie pozostaw to pole puste. Jeśli zauważysz, że konkretny tunel WireGuard lub OpenVPN nie pojawia się na liście rozwijanej podczas tworzenia reguł, możesz tutaj ręcznie dopisać jego nazwę.
- Ignorowane interfejsy (Ignored Interfaces)
Zapobiega to zarządzaniu ruchem dla konkretnych interfejsów przez
pbr– dotyczy to np. serwera VPN, który możesz hostować na potrzeby zdalnego dostępu.
- Rekomendacja: Zachowaj wartość domyślną (
vpnserver). Nie chcesz, abypbrpróbował przekierowywać ruch, który trafia do Twojego routera z zewnątrz.
- Opcja tworzenia reguł (Rule Create option)
Określa, czy reguły
pbrmają być dopisywane na końcu listy firewalla (Add), czy umieszczane na samej górze (Insert).
- Rekomendacja: Add (domyślna). Wstawianie reguł na samą górę może czasem kolidować z kluczowymi wyjątkami zapory systemowej (np. ruchem przeznaczonym bezpośrednio dla routera). Opcja „Add” jest bezpieczniejsza i zazwyczaj w zupełności wystarcza.
- Domyślny interfejs ICMP (Default ICMP Interface)
Wymusza, aby zapytania „ping” oraz „traceroute” przechodziły przez konkretny interfejs, niezależnie od innych reguł.
- Rekomendacja: No Change (domyślna). Jeśli wymusisz tutaj opcję „wan”, nie będziesz mógł wykonać polecenia „ping” przez VPN, aby sprawdzić stabilność połączenia. Lepiej pozwolić, aby protokół ICMP podlegał tym samym zasadom, co reszta danych.
Pola Uplink Interface Table FW Mark oraz Service FW Mask to techniczne „znaczniki” (wartości szesnastkowe) używane do oznaczania pakietów w pamięci systemu. Dzięki nim router wie, do której trasy dany pakiet przynależy. Nie zmieniaj tych wartości. Te wysokie numery (zaczynające się od 010000) są ustawione tak, aby nie kolidować z innymi usługami, takimi jak SQM (Smart Queue Management) czy QoS. O ile nie posiadasz bardzo specyficznej, ręcznej konfiguracji zapory ogniowej, ustawienia domyślne będą idealne.
Konfiguracja interfejsu webowego (Web UI Configuration)
Te dwie ostatnie opcje wpływają wyłącznie na sposób korzystania z interfejsu luci-app-pbr podczas tworzenia reguł.
- Dodaj cel ignorowania (Add Ignore Target)
Ta opcja dodaje status „Ignore” do listy interfejsów w regułach. Jeśli ją włączysz (Enabled), każdy ruch oznaczony flagą „Ignore” całkowicie pominie mechanizm
pbri będzie przesyłany zgodnie z domyślną tabelą routingu routera.
- Rekomendacja: Enabled. Jest to niezwykle przydatne podczas rozwiązywania problemów. Jeśli konkretne urządzenie lub strona internetowa nie działa prawidłowo, możesz szybko ustawić regułę na „Ignore”, aby sprawdzić, czy przyczyną jest
pbr, bez konieczności usuwania całej reguły.
- Obsługiwane protokoły (Supported Protocols)
Określa, jakie protokoły będą widoczne na liście rozwijanej podczas tworzenia nowej zasady.
- Rekomendacja: Pozostaw domyślne. Zazwyczaj będziesz używać „tcp udp” dla standardowego przeglądania stron lub opcji „all”. Chociaż widoczność „icmp” bywa pomocna, jeśli chcesz kierować pingi inaczej niż dane, to „all” lub „tcp udp” pokrywa 99% przypadków użycia.
Teraz możemy kliknąć przycisk Save & Apply (Zapisz i zastosuj).
Zasady (Policies)
Teraz omówimy sekcję zasad (Policies), która domyślnie zawiera reguły widoczne powyżej. Te standardowe wpisy to szablony przygotowane przez autora pakietu, aby zaoszczędzić nam typowych problemów konfiguracyjnych.
Ignore Local Requests (Ignoruj zapytania lokalne)
To swego rodzaju siatka bezpieczeństwa. Dzięki niej ruch między Twoimi urządzeniami (np. komunikacja telefonu z drukarką) nie zostanie omyłkowo skierowany do tunelu VPN, co mogłoby skutkować przerwaniem połączenia. Warto rzucić na to okiem i ewentualnie skorygować maskę IP, jeśli używasz innego zakresu niż standardowe w OpenWrt 192.168.1.x.
Plex/Emby Rules Zasady te dbają o to, aby ruch z serwerów multimediów pozostawał na Twoim głównym łączu (WAN). Dzięki temu zdalne strumieniowanie działa poprawnie i nie jest ograniczane przez przepustowość VPN-a.
Wszystkie te zasady są początkowo ustawione jako Disabled (pole wyboru „Enabled” jest odznaczone). Moja rekomendacja to zaznaczenie Enabled przy regule Ignore Local Requests, po uprzednim upewnieniu się, że zakres adresów IP jest poprawny.
Zasady DNS (DNS Policies)
Ta sekcja służy do wymuszania na konkretnych urządzeniach korzystania z wyznaczonego serwera DNS, z pominięciem globalnych ustawień DNS routera.
- Rekomendacja: Pozostaw tę sekcję wyłączoną (Disabled). Ponieważ mam skonfigurowaną globalną bramę Cloudflare DoH (DNS over HTTPS) na porcie 5053, zależy mi, aby wszystkie moje urządzenia korzystały z tego poziomu prywatności. Domyślny przykład (przekierowanie urządzenia
192.168.1.5na DNS Cloudflare1.1.1.1) jest przydatny tylko wtedy, gdy masz w sieci „oporne” urządzenie — takie jak Google Home czy Smart TV — które próbuje korzystać z na sztywno wpisanych ustawień DNS, a Ty chcesz je przechwycić. O ile nie masz konkretnego powodu, by omijać swój serwer proxy DoH dla danego urządzenia, pozostaw tę sekcję pustą.
Tagowanie DSCP (DSCP Tagging)
DSCP (Differentiated Services Code Point) jest wykorzystywane przez mechanizmy jakości usług (QoS). Pozwala ono na „znakowanie” pakietów, dzięki czemu Twój dostawca (ISP) lub inny router wie, który ruch ma wysoki priorytet (np. VoIP), a który niski (np. pobieranie plików w tle).
- Rekomendacja: Pozostaw puste. Większość domowych dostawców internetu całkowicie ignoruje tagi DSCP. O ile nie posiadasz bardzo złożonej konfiguracji z wieloma routerami, w której konkretne urządzenia są ustawione tak, by traktować priorytetowo „oznakowane” pakiety, uzupełnienie tej sekcji nie przyniesie zauważalnych korzyści, a może wręcz powodować problemy w niektórych sieciach zewnętrznych.
Własne pliki użytkownika (Custom User File Includes)
Są to gotowe skrypty, które wspierają
pbrw zarządzaniu usługami korzystającymi z tysięcy często zmieniających się adresów IP.
- pbr.user.dnsprefetch: Zdecydowanie zalecane, aby to włączyć (Enable). Pomaga to w rozwiązywaniu nazw domen z Twojej listy zasad, zanim jeszcze je odwiedzisz, dzięki czemu „pierwsze załadowanie” przekierowanej strony internetowej jest odczuwalnie szybsze.
- pbr.user.aws: Pozostaw wyłączone (Disabled), chyba że celowo chcesz kierować cały ruch Amazon Web Services przez konkretny interfejs (co jest zazwyczaj niewskazane, ponieważ obejmuje ogromną część zasobów internetu).
- pbr.user.netflix: Włącz (Enable), jeśli planujesz przekierowywać Netflixa. Netflix jest powszechnie znany z tego, że trudno go poprawnie kierować, ponieważ korzysta z setek różnych zakresów IP; ten skrypt zajmuje się całą tą złożoną logiką za Ciebie.
Status
Teraz jesteśmy gotowi, aby włączyć (Enable) naszą usługę w sekcji Service Control. Następnie należy nacisnąć przycisk Start.
Przypadek użycia (Use Case)
Moim celem jest wykorzystanie pbr do skierowania całego ruchu z jednego z urządzeń w mojej sieci przez tunel Cloudflare WARP.
Nawiązując do mojego poprzedniego wpisu, Cloudflare WARP i router z OpenWrt, wykorzystałem narzędzie wgcf do skonfigurowania wirtualnego interfejsu dla routingu Cloudflare WARP.
Ważne
Ponieważ ruch będzie kierowany przez pbr, podczas konfigurowania interfejsu WireGuard dla tunelu Cloudflare WARP musisz pamiętać, aby NIE zaznaczać opcji Route Allowed IPs. W przeciwnym razie cały Twój ruch będzie domyślnie kierowany przez ten nowy interfejs.
W przypadku interfejsu Cloudflare WARP we wspomnianym artykule zalecałem przypisanie go do strefy wan w Ustawieniach zapory ogniowej (Firewall Settings). Jeśli jednak Twój dostawca zapewnia natywną obsługę IPv6, nie powinieneś włączać Maskarady (Masquerading) dla IPv6, ponieważ Twoje urządzenia utracą swoje indywidualne adresy IPv6, a cały ruch będzie kierowany przez pojedynczy adres IPv6 routera.
W takiej sytuacji zalecam utworzenie dodatkowej strefy zapory ogniowej, w której można ustawić Maskaradę dla IPv4 oraz (w Ustawieniach zaawansowanych) dla IPv6. Strefa ta będzie używana wyłącznie dla interfejsu Cloudflare WARP. Wszystkie pozostałe opcje powinny pozostać dokładnie takie same, jak w domyślnej strefie wan.
Gdy nasz dodatkowy interfejs zostanie uruchomiony, przeprowadźmy szybki test, aby upewnić się, że wszystko działa poprawnie.
Przejdź do sekcji Services > Policy Routing i klikając przycisk Add w sekcji zasad (Policies), utwórz regułę, która skieruje ruch z Twojego komputera przez nowy interfejs.
W polu Local addresses/devices musisz wskazać swoje urządzenie w sieci lokalnej, uwzględniając zarówno adres IPv4, jak i IPv6. Może to być problematyczne, jeśli adresy te ulegają zmianie, dlatego najprostszą metodą jest wskazanie urządzenia po jego nazwie. Nazwę tę znajdziesz na głównej stronie statusu po zalogowaniu się do routera, w sekcji Active DHCP Leases.
Pamiętaj, że jeśli nazwa Twojego urządzenia wyświetla się jako „iPhone-Darek (iPhone-Darek.lan)”, powinieneś wpisać tylko „iPhone-Darek”.
PBR automatycznie dopasuje nazwę do aktualnych adresów IPv4 i IPv6. Nawet jeśli adresy się zmienią, reguła pozostanie aktualna.
Wpisz nazwę swojego urządzenia, wybierz interfejs, przez który ma być kierowany ruch, i dodaj regułę, naciskając przycisk Save, a następnie Save & Apply.
Aby szybko zweryfikować, czy cały ruch przechodzi przez nowy interfejs, wejdź na stronę speedtest.net i sprawdź źródło połączenia po lewej stronie. Jeśli korzystasz z Cloudflare WARP, zobaczysz tam napis Cloudflare Warp (zamiast np. toob, który jest moim obecnym dostawcą).
Decyzja o tym, co i w jaki sposób chcesz przekierowywać, należy już teraz całkowicie do Ciebie.
Powodzenia!
















Komentarze i Reakcje