Ein Programm soll die gewöhnliche Verbindung nutzen, während alles andere im Tunnel bleibt, und der Client hat dafür keinen Schalter. Auch ein verstecktes Menü gibt es nicht. Eine Route wird aus Feldern im Paket gewählt, und das Paket trägt Adressen und Ports statt der Identität des Prozesses, der es erzeugt hat, also muss ein Ausschluss in einem dieser Felder ausgedrückt werden. Folgen Sie einmal einem Paket, und die verfügbaren Optionen sind nicht mehr rätselhaft.

Warum der Client es nicht anbieten kann

Ziel-Routing vergleicht die Zieladresse mit Präfixen und behält die längste Übereinstimmung. In diesem Moment sieht jedes Paket gleich aus, was auch immer es erzeugt hat. Quellrichtlinien-Routing erweitert den Vergleich auf die Quelladresse, und genau dieser Haken steckt in jedem praktischen Workaround: Ändern Sie die Quelle, und eine andere Tabelle kommt infrage.

Ports helfen nicht. Ein Ausschluss nach Port müsste vor dem Ziel-Lookup ausgewertet werden, und der Port spielt in dieser Entscheidung keine Rolle. Alles, was als portbasierter Ausschluss beworben wird, schließt in Wahrheit über ein anderes Feld aus und beschreibt es nur großzügig.

Echtes Routing pro Anwendung gibt es dort, wo die Plattform Maschinerie dafür ergänzt hat, etwa Filter-Callouts unter Windows oder die VPN-Dienstbindung unter Android. Eine Desktop-Instanz von OpenVPN bringt nichts davon mit, und kein Konfigurationsschalter erfindet es.

Linux: Prozess markieren, dann die Markierung routen

Der sauberste Ansatz knüpft die Entscheidung an den Prozess, dem der Socket gehört. Der owner-Abgleich wirkt für lokal erzeugten Verkehr in der OUTPUT-Kette, also kann eine dort gesetzte Markierung eine eigene Tabelle wählen:

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

Pakete von Benutzer 1001 konsultieren dann Tabelle 200 und verlassen das System über das gewöhnliche Gateway, während die Haupttabelle alles andere weiterhin in den Tunnel schickt. Der owner-Abgleich gilt nur für lokal erzeugte Pakete, also genau für den Verkehr, der hier zählt, und er kann Pakete, die für einen anderen Host weitergeleitet werden, nicht klassifizieren. Prüfen Sie mit den Werkzeugen statt mit der Absicht: ss -tnp zeigt die lokale Adresse und den besitzenden Prozess bestehender Verbindungen, und ip route get 1.1.1.1 mark 0x1 zeigt, welche Tabelle die Markierung auswählt.

Ein Netzwerk-Namespace ist die robustere Antwort für ein eigenständiges Programm, weil jeder darin erzeugte Socket durch den Aufbau an ihn gebunden ist, also erben Hilfsprozesse und untergeordnete Verbindungen das Verhalten, ohne überhaupt klassifiziert zu werden. Der Preis ist Installationstechnik: ein veth-Paar, eine Adresse an jedem Ende und eine Standardroute im Namespace, die zum Host zurückzeigt.

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: Das Ziel entscheidet weiterhin

Windows wählt das ausgehende Interface anhand des Ziels, also muss ein Programm, das einen anderen Weg will, etwas ändern, das der Stack vor dieser Wahl befragt. ForceBindIP deckt die erste Hälfte ab: Es startet ein Programm mit Sockets, die bereits an eine von Ihnen genannte lokale Adresse gebunden sind. Das allein ändert nicht, über welches Interface das Paket hinausgeht, weil das Ziel weiterhin die Route auswählt. Binden Sie auf einem Laptop, dessen Standardroute in den Tunnel zeigt, eine Quelle, und das Paket geht trotzdem in den Tunnel.

Das Symptom hat eine lesbare Form, sobald man sie kennt. Es gilt für eine LAN-Adresse, die das gewählte Interface direkt erreicht, und scheitert für alles im Internet, dessen Route auf den Tunnel zeigt. Es scheint auch zu funktionieren, bis das Programm Arbeit an einen Helfer übergibt, weil einem Helfer, der seinen eigenen Socket öffnet, die Bindung nie gesagt wurde.

Verlagern Sie die Entscheidung, wenn ein Prozess die falsche Einheit ist

Wenn die wirkliche Anforderung ein Gerät und nicht ein Programm ist, setzen Sie es auf eine eigene SSID oder ein eigenes VLAN und lassen Sie den Router entscheiden: diese Quelle nimmt den normalen Weg, während andere Quellen den Tunnel nutzen. Eine eigene Gateway-Maschine ist das andere ehrliche Design: Sie hält das VPN und empfängt nur die Ziele, die der Router ihr schickt. In einem VLAN deckt die Richtlinie jeden Fluss ab, den das Gerät öffnet, einschließlich der Hilfsprozesse, die den Windows-Ansatz zerstört haben. Der Tausch ist der Umfang: Zwei Programme auf diesem Gerät lassen sich nicht mehr unterschiedlich behandeln.

Beides sind Quell- oder Zielrichtlinien mit einem Umfang, den man in einem Satz nennen kann. Keine davon ist pro Anwendung, und ein Design, das sich als pro Anwendung verkauft, scheitert beim ersten Mal, wenn das Programm seine Arbeit an einen zweiten Prozess delegiert.

Ähnliche Artikel