Ett program ska använda den vanliga anslutningen medan allt annat stannar i tunneln, och klienten har ingen växel för det. Det finns inte heller någon dold meny att hitta. En rutt väljs från fält inne i paketet, och paketet bär adresser och portar i stället för identiteten hos processen som skapade det, så ett undantag måste uttryckas i ett av dessa fält. Följ ett paket en gång och de tillgängliga alternativen slutar vara mystiska.

Varför klienten inte kan erbjuda det

Destinationsroutning jämför destinationsadressen med prefix och behåller den längsta träffen. I det ögonblicket ser varje paket likadant ut, vad som än skapade det. Källpoliceroutning vidgar jämförelsen till källadressen, och det är den krok som varje praktisk lösning använder: ändra källan och en annan tabell blir aktuell.

Portar hjälper inte. Ett undantag per port skulle behöva utvärderas före destinationsuppslaget, och porten spelar ingen roll i det beslutet. Allt som annonseras som portbaserat undantag utesluter egentligen efter ett annat fält och beskriver det slarvigt.

Riktig routning per program finns där plattformen har lagt till maskineri för det, som filteranrop i Windows eller VPN-tjänstens bindning i Android. En skrivbordsinstans av OpenVPN levererar inget av det, och ingen konfigurationsflagga hittar på det.

Linux: märk processen och routa sedan märket

Det renaste tillvägagångssättet knyter beslutet till processen som äger socketen. owner-träffen fungerar för lokalt genererad trafik i OUTPUT-kedjan, så ett märke som sätts där kan välja en separat tabell:

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

Paket från användare 1001 konsulterar då tabell 200 och lämnar via den vanliga gatewayen, medan huvudtabellen fortfarande skickar allt annat in i tunneln. owner-träffen gäller bara för lokalt genererade paket, vilket är precis den trafik som spelar roll här, och den kan inte klassificera paket som vidarebefordras för en annan värd. Verifiera med verktygen och inte med avsikten: ss -tnp visar den lokala adressen och den ägande processen för etablerade anslutningar, och ip route get 1.1.1.1 mark 0x1 visar vilken tabell märket väljer.

Ett nätverksnamnrymd är det robustare svaret för ett fristående program, eftersom varje socket som skapas där inne är bunden till den genom konstruktionen, så hjälpprocesser och barnanslutningar ärver beteendet utan att klassificeras alls. Priset är rörarbete: ett veth-par, en adress i varje ände och en standardrutt inne i namnrymden som pekar tillbaka mot värden.

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: destinationen bestämmer fortfarande

Windows väljer det utgående gränssnittet utifrån destinationen, så ett program som vill ha en annan väg måste ändra något som stacken frågar om före det valet. ForceBindIP täcker den första halvan: det startar ett program med socketarna redan bundna till en lokal adress som du anger. Det ensamt ändrar inte vilket gränssnitt paketet lämnar via, eftersom destinationen fortfarande väljer rutten. Bind en källa på en bärbar dator vars standardrutt pekar in i tunneln, och paketet går ändå in i tunneln.

Symtomet har en läsbar form när du väl känner till det. Det gäller för en LAN-adress som det valda gränssnittet når direkt och misslyckas för allt på internet vars rutt pekar mot tunneln. Det ser också ut att fungera ända tills programmet ger arbete till en hjälpare, eftersom en hjälpare som öppnar sin egen socket aldrig fick veta om bindningen.

Flytta beslutet när en process är fel enhet

Om det verkliga kravet är en enhet och inte ett program, sätt den på sitt eget SSID eller VLAN och låt routern bestämma: den källan tar den normala vägen medan andra källor använder tunneln. En dedikerad gateway-maskin är den andra ärliga designen: den håller VPN:en och tar bara emot de destinationer som routern skickar till den. På ett VLAN täcker policyn varje flöde som enheten öppnar, inklusive hjälpprocesserna som bröt Windows-metoden. Byten är omfång: två program på den enheten kan inte längre behandlas olika.

Båda är käll- eller destinationspolicyer med ett omfång som du kan säga i en mening. Ingen av dem är per program, och en design som säljer sig som per program misslyckas första gången programmet delegerar sitt arbete till en andra process.

Relaterade artiklar