Jeden program powinien korzystać ze zwykłego połączenia, a wszystko inne powinno zostać w tunelu, i klient nie ma na to przełącznika. Nie ma też żadnego ukrytego menu do znalezienia. Trasa jest wybierana z pól wewnątrz pakietu, a pakiet niesie adresy i porty, a nie tożsamość procesu, który go utworzył, więc wykluczenie musi być wyrażone w jednym z tych pól. Prześledź pakiet raz, a dostępne opcje przestaną być tajemnicze.

Dlaczego klient nie może tego zaproponować

Routing docelowy porównuje adres docelowy z prefiksami i zachowuje najdłuższe dopasowanie. W tym momencie każdy pakiet wygląda tak samo, cokolwiek go utworzyło. Routing polityki źródła rozszerza porównanie na adres źródłowy, i to jest hak, z którego korzysta każde praktyczne rozwiązanie: zmień źródło, a inna tablica stanie się odpowiednia.

Porty nie pomagają. Wykluczenie według portu musiałoby być oceniane przed wyszukaniem miejsca docelowego, a port nie odgrywa w tej decyzji żadnej roli. Wszystko, co reklamuje się jako wykluczenie oparte na porcie, w rzeczywistości wyklucza po innym polu i opisuje to niedbale.

Prawdziwy routing według aplikacji istnieje tam, gdzie platforma dodała do niego mechanizm, jak wywołania filtrów w Windows lub powiązanie usługi VPN w Androidzie. Desktopowa instancja OpenVPN nic z tego nie dostarcza, a żadna flaga konfiguracji tego nie wymyśla.

Linux: oznacz proces, a potem routuj oznaczenie

Najczystsze podejście wiąże decyzję z procesem, który posiada gniazdo. Dopasowanie owner działa dla ruchu generowanego lokalnie w łańcuchu OUTPUT, więc oznaczenie zastosowane tam może wybrać osobną tablicę:

iptables -t mangle -A OUTPUT -m owner --uid-owner 1001 -j MARK --set-mark 0x1
ip rule add fwmark 0x1 table 200
ip route add 192.168.1.0/24 dev eth0 src 192.168.1.0 table 200
ip route add default via 192.168.1.1 dev eth0 table 200

Pakiety od użytkownika 1001 konsultują wtedy tablicę 200 i wychodzą przez zwykłą bramę, podczas gdy główna tablica nadal wysyła wszystko inne do tunelu. Dopasowanie owner dotyczy tylko pakietów generowanych lokalnie, czyli dokładnie tego ruchu, który tu się liczy, i nie potrafi klasyfikować pakietów przekazywanych dla innego hosta. Sprawdzaj narzędziami, a nie zamiarem: ss -tnp pokazuje adres lokalny i proces właściciela nawiązanych połączeń, a ip route get 1.1.1.1 mark 0x1 pokazuje, którą tablicę wybiera oznaczenie.

Przestrzeń nazw sieci jest solidniejszą odpowiedzią dla samodzielnego programu, ponieważ każde gniazdo utworzone w niej jest z nią związane z samej konstrukcji, więc procesy pomocnicze i połączenia potomne dziedziczą zachowanie bez żadnej klasyfikacji. Koszt to hydraulika: para veth, adres na każdym końcu i trasa domyślna wewnątrz przestrzeni nazw, która wskazuje z powrotem na hosta.

ip netns add novpn
ip link add veth-host type veth peer name veth-ns
ip link set veth-ns netns novpn
ip addr add 10.200.0.1/24 dev veth-host
ip netns exec novpn ip addr add 10.200.0.2/24 dev veth-ns
ip netns exec novpn ip route add default via 10.200.0.1

Windows: cel nadal decyduje

Windows wybiera interfejs wychodzący na podstawie celu, więc program, który chce innej drogi, musi zmienić coś, o co stos pyta przed tym wyborem. ForceBindIP pokrywa pierwszą połowę: uruchamia program z gniazdami już powiązanymi z lokalnym adresem, który wskażesz. To samo nie zmienia tego, przez który interfejs pakiet wychodzi, bo trasę nadal wybiera cel. Powiąż źródło na laptopie, którego trasa domyślna wskazuje do tunelu, a pakiet i tak wejdzie do tunelu.

Objaw ma czytelny kształt, gdy już się go zna. Dotyczy adresu LAN, do którego wybrany interfejs dociera bezpośrednio, i zawodzi dla wszystkiego w internecie, którego trasa wskazuje tunel. Wygląda też, jakby działał, dopóki program nie przekaże pracy pomocnikowi, bo pomocnikowi, który otwiera własne gniazdo, nigdy nie powiedziano o powiązaniu.

Przenieś decyzję, gdy jeden proces to zła jednostka

Jeśli prawdziwym wymaganiem jest urządzenie, a nie program, umieść je we własnym SSID lub VLAN i pozwól routerowi decydować: to źródło idzie normalną drogą, a inne źródła korzystają z tunelu. Dedykowana maszyna bramy to drugi uczciwy projekt: trzyma VPN i odbiera tylko te cele, które przysyła jej router. W VLAN zasada obejmuje każdy strumień, który otwiera urządzenie, w tym procesy pomocnicze, które zepsuły podejście Windows. Zamiana dotyczy zakresu: dwóch programów na tym urządzeniu nie można już traktować różnie.

Oba są zasadami źródła lub celu o zakresie, który można wyrazić jednym zdaniem. Żadna nie jest według aplikacji, a projekt, który sprzedaje się jako według aplikacji, zawodzi za pierwszym razem, gdy program deleguje swoją pracę do drugiego procesu.

Powiązane artykuły