Wie verwende ich unterschiedliche Netzwerkschnittstellen für unterschiedliche Prozesse?

Wie verwende ich unterschiedliche Netzwerkschnittstellen für unterschiedliche Prozesse?

Ich habe zwei Netzwerkschnittstellen auf einem Linux-PC und muss die Schnittstelle, die ein bestimmter Prozess verwenden soll, manuell einstellen.

Das Programm (Twinkle-Softphone) hat keine ähnliche Option, daher glaube ich, dass sie extern eingestellt werden muss.

Wie kann ich es tun?

Bearbeiten:Ich versuche nicht, einen Serverprozess an eine bestimmte Schnittstelle zu binden, sondern vielmehr, ein Clientprogramm dazu zu bringen, über eine bestimmte Schnittstelle Kontakt zu einem Server aufzunehmen.

Antwort1

Sie können Code zur Laufzeit ersetzen durch die Verwendung vonLD_PRELOAD(@windows Sie können eine ähnliche Technik verwenden, genanntUmleitungen, ziemlich schick). Dadurch wird der dynamische Linker angewiesen, zuerst alle Bibliotheken in den Prozess zu laden, den Sie ausführen möchten, und dann weitere hinzuzufügen. Normalerweise verwenden Sie dies folgendermaßen:

% LD_PRELOAD=./mylib.so ls

und dadurch ändern Sie, was lsfunktioniert.

für dein Problem würde ich versuchenhttp://www.ryde.net/code/bind.c.txt, die Sie wie folgt verwenden können:

% BIND_ADDR="ip_of_ethX" LD_PRELOAD=./bind.so twinkle

So bauen Sie es:

% wget http://www.ryde.net/code/bind.c.txt -O bind.c
% gcc -nostartfiles -fpic -shared bind.c -o bind.so -ldl -D_GNU_SOURCE

eine längere Anleitung isthttp://daniel-lange.com/archives/53-Binding-applications-to-a-specific-IP.html

ähnliche Hacks und Tools:

Antwort2

IP-Netze können dies tun.

Kurz zusammengefasst: Erstellen Sie Netzwerk-Namespaces, ordnen Sie ihnen Schnittstellen zu und führen Sie dann „ip netns exec NAME cmd…“ aus.

Überprüfen Sie einfach, ob Ihre Distribution IP-Netzwerke unterstützt … (Backtrack 5r3 tut dies nicht, Kali hingegen schon ;) )

IM DETAIL:

#create netns
ip netns add myNamespace
#link iface to netns
ip link set eth0 netns myNamespace
#set ip address in namespace
ip netns exec myNamespace ifconfig eth0 192.168.0.10/24 up
#set loopback (may be needed by process run in this namespace)
ip netns exec myNamespace ifconfig lo 127.0.0.1/8 up
#set route in namespace
ip netns exec myNamespace route add default gw 192.168.0.1
#force firefox to run inside namespace (using eth0 as outgoing interface and the route)
ip netns exec myNamespace firefox

Warum ist das besser, als die IP über LD_PRELOAD zu binden? Weil LD_PRELOAD die Route, die die Prozesse verwenden, nicht steuert. Es wird die erste Route verwendet.

Und da immer die gleiche Route verwendet wird, wird standardmäßig die für die Route registrierte Schnittstelle verwendet (was wir nicht wollen).

Antwort3

Die folgende Antwort basiert auf der von @olivervbk und ist meine!

Führen Sie alle Befehle als „root“ aus.

Verwenden Sie den Befehl...

ip a

... um den Namen der Netzwerkschnittstelle herauszufinden, die Sie verwenden möchten.

Führen Sie die folgenden Befehle als Vorlage aus …

ip netns add [INTERFACE_NAME]_ns
ip link set dev [INTERFACE_NAME] netns [INTERFACE_NAME]_ns
ip netns exec [INTERFACE_NAME]_ns ifconfig [INTERFACE_NAME] 10.1.1.10/24 up
ip netns exec [INTERFACE_NAME]_ns ifconfig lo 127.0.0.1/8 up
ip netns exec [INTERFACE_NAME]_ns route add default gw 10.1.1.1
ip netns exec [INTERFACE_NAME]_ns dhcpcd [INTERFACE_NAME]
ip netns exec [INTERFACE_NAME]_ns sudo -b -u [YOUR_USER] [APP_NAME] 2> /dev/null 1> /dev/null &
  • [INTERFACE_NAME] – Ersetzen Sie dies durch den Namen der gewählten Netzwerkschnittstelle.
  • [IHR_BENUTZER] – Ersetzen Sie es durch Ihren Benutzernamen.
  • [APP_NAME] - Name der Anwendung, die im Namespace „[INTERFACE_NAME]_ns“ ausgeführt wird. Beispiel: „Firefox“.

ANMERKUNG I:Die " -b -u" Flags im " sudo" Befehl ermöglichen es der Anwendung, mit Ihrem Benutzer (nicht "root") und im Hintergrund zu laufen und das Terminal freizugeben. Der 2> /dev/null 1> /dev/null &Codeausschnitt soll verhindern, dass Ausgaben von "[APP_NAME]" auf dem Terminal gedruckt werden.
ANMERKUNG II:Die Werte der IP „10.1.1.10“ und „10.1.1.1“ sind beliebig.
ANMERKUNG III:Damit es für mich funktioniert, musste ich den dhcpcd [INTERFACE_NAME]Befehl ausführen.

Um den Namespace zu entfernen, verwenden Sie …

ip netns del [INTERFACE_NAME]_ns

... oder...

ip -all netns delete

... um alles Vorhandene zu entfernen.

Antwort4

Ich glaube nicht, dass es möglich ist, einen Prozess zur Verwendung einer bestimmten Schnittstelle zu zwingen.

Ich denke jedoch, dass Sie möglicherweise mit ipchain/iptables experimentieren und erzwingen können, dass ein bestimmter Port, an dem Ihr Prozess lauscht, nur Pakete empfängt, die über eine bestimmte Schnittstelle kommen.

Nützliches HOWTO: http://tldp.org/HOWTO/IPCHAINS-HOWTO.html

verwandte Informationen