Ich habe nach früheren Leuten gesucht, die ähnliche Fragen gestellt haben, aber noch keine klare Antwort erhalten, die für meine gegebene Situation geeignet ist.
Ich arbeite unter Linux (Fedora 22) und habe einen VPN-Dienst, für den ich bezahle. Ich benötige jedoch nur bestimmte Programme, um das VPN für den Internetverkehr zu verwenden, und kann meine Standard-ISP-Verbindung für alles andere verwenden (z. B. Surfen im Internet). usw)
Wir machen dies einfach und beschränken es auf das am häufigsten verwendete Programm, World of Warcraft, das über WINE ausgeführt wird.
Jetzt habe ich ein VPN-Setup über die Netzwerkschnittstelle, sodass der gesamte Datenverkehr über enp10s0 (der seltsame Name meines Computers für eth0) über den VPN-Dienst getunnelt werden kann. Ich benötige jedoch nur bestimmte Programme (oder Ports, die diese Programme verwenden) genau sein), um durch das VPN zu gehen.
Wie richte ich den Tunnel ein und lasse ihn nur die benötigten Ports über das VPN weiterleiten, während alles andere nicht geroutet wird?
Antworten:
Was Sie verlangen, existiert nicht . Aus diesem Grund sind Sie mit den Antworten, die Sie gefunden haben, unzufrieden (einige davon sind möglicherweise meine): Alle haben Problemumgehungen vorgeschlagen , keine echte Lösung, weder einfach noch komplex.
Lassen Sie mich erklären. Das Routing in allen Betriebssystemen wird durch die Zieladresse bestimmt: Möglicherweise haben Sie mehrere Routen, aber die Wahl zwischen diesen basiert nicht auf der Anwendung, die die Verbindung aufruft, sondern lediglich auf der Zieladresse. Punkt.
Lassen Sie mich ein nicht triviales Beispiel geben. Wenn ein VPN-Client eine Verbindung zu seinem Server hergestellt hat, ist es weiterhin möglich, eine Verbindung zu einer bestimmten Site, z. B. example.org, außerhalb des VPN weiterzuleiten. Alle Anwendungen, die versuchen, diese spezielle Adresse zu erreichen, werden jedoch außerhalb des VPN weitergeleitet: Einige Anwendungen können nicht über das VPN zu example.org geleitet werden, während andere Apps außerhalb des VPN übertragen werden.
Mit dem Linux-Kernel, der das Quellrouting ermöglicht, wird die Situation reicher: Dies bedeutet, dass Sie zwei oder mehr Routingtabellen haben können und die Auswahl zwischen diesen auf der Quelladresse und nicht auf der Zieladresse basiert.
Ein nicht triviales Beispiel: Mein PC hat zwei Amtsleitungen mit zwei unterschiedlichen öffentlichen IPs. Es kann über beide Schnittstellen kontaktiert werden, und es ist wichtig, dass meine Antworten auf eine bestimmte Verbindung über dieselbe Schnittstelle erfolgen, über die die Verbindung hergestellt wurde. Andernfalls werden sie als irrelevant verworfen, wenn sie die Person erreichen, die die Verbindung hergestellt hat. Dies ist Quellrouting.
Fair genug, was ist mit Verbindungen, die wir beginnen? In einigen Apps können Sie die Bindungsadresse angeben, z. B. im openssh-Client :
Für sie ist es kein Problem, wenn eine Instanz das VPN durchläuft (z. B. Routing-Tabelle 1), während eine andere Instanz das VPN verlässt (z. B. Routing-Tabelle 2). Andere Apps wie Firefox sind jedoch nicht nur notorisch schwer an eine bestimmte Quell-IP-Adresse zu binden (siehe hier für eine sehr clevere Problemumgehung), sondern auch gemein und böse, da Sie nicht zwei Kopien von sich selbst haben können läuft gleichzeitig und ist jeweils an eine andere Quelladresse gebunden. Mit anderen Worten, während Sie dank des oben genannten Tricks eine Instanz zur Bindung an eine Quelladresse Ihrer Wahl verpflichten können, können Sie keine andere Version davon an die andere Quelladresse binden lassen.
Dies erklärt, warum wir Problemumgehungen verwenden: Sie basieren alle auf der gleichen Idee, dass sie mit einem separaten Netzwerkstapel arbeiten als der Rest des PCs. Sie können also in abnehmender ungefährer Reihenfolge der Komplexität VMs, Docker, Container und Namespaces verwenden. In jeder von ihnen haben Sie eine oder mehrere Routing-Tabellen, aber Sie können mehrere Instanzen von jeder haben (VM / Docker / Container / Namespaces) und Sie können sie auch frei mischen, wobei jede von ihnen ihre eigene App wie Firefox ausführt, glücklich getrennt von den anderen.
Vielleicht interessieren Sie sich noch für eine der Problemumgehungen?
BEARBEITEN:
Die einfachste Lösung ist ein Netzwerk-Namespace. Das Skript unten Griffe alle notwendigen Aspekte eines NNS und legt es in einer Datei (Sie Ihren Namen wählen, verwende ich im Allgemeinen
newns
, aber Sie tun , was Sie bevorzugen) in/usr/local/bin
, dannchmod 755 FILE_NAME
, und Sie können es wie folgt verwendet werden :Es wird ein
xterm
für Sie geöffnet (das liegt daran, dass xterm gerne funktioniert, aber Sie können es ändern, wenn Sie etwas anderes verwenden möchten), das zum neuen Namespace gehört. Wenn Sie möchten, können Sie aus dem xterm heraus Ihren VPN starten und dann Ihr Spiel starten. Mit dem folgenden Befehl können Sie leicht überprüfen, ob Sie das VPN verwenden:Das gibt Ihnen Ihre öffentliche IP zurück. Nach dem Einrichten des VPN in xterm können Sie überprüfen, ob sich Ihre öffentliche IP in Ihren anderen Fenstern unterscheidet. Sie können bis zu 254 xterms mit 254 verschiedenen NNSs und verschiedenen Verbindungen öffnen.
Wenn Sie möchten, können Sie mit sogar einen ganzen Desktop im neuen Netzwerk-Namespace starten
dann können Sie mit Alt+ Ctrl+ danach suchen Fn, wobei Fn einer von F1, F2, ....- ist
Ich muss eine Einschränkung hinzufügen: Die DNS-Behandlung in Namespaces ist etwas fehlerhaft, seien Sie geduldig.
quelle
$ route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 0.0.0.0 0.0.0.0 U 50 0 0 ppp0 0.0.0.0 192.168.1.1 0.0.0.0 UG 100 0 0 enp10s0 1.0.0.1 0.0.0.0 255.255.255.255 UH 0 0 0 ppp0 192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 enp10s0 192.168.1.0 0.0.0.0 255.255.255.0 U 100 0 0 enp10s0 199.168.112.120 192.168.1.1 255.255.255.255 UGH 100 0 0 enp10s0