Wie werden unterschiedliche Netzwerkschnittstellen für unterschiedliche Prozesse verwendet?

59

Ich habe zwei Netzwerkschnittstellen auf einem Linux-PC und muss die Schnittstelle, die ein bestimmter Prozess verwendet, manuell festlegen.

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

Wie kann ich es tun?

Bearbeiten: Ich versuche nicht, einen Serverprozess an eine bestimmte Schnittstelle zu binden, sondern ein Client-Programm über eine bestimmte Schnittstelle mit einem Server in Verbindung zu setzen.

Andrea Spadaccini
quelle
Clients verwenden auch bind / connect. Lesen Sie in der Dokumentation bind.c.txt nach, wie Sie ircII (ein irc-client-Programm) auf eine bestimmte IP-Adresse zwingen können: BIND_ADDR = "your-virt-ip" LD_PRELOAD =. / Bind.so ircII '
akira
Ich habe hier einen anderen Ansatz gefunden, ich hoffe, er ist hilfreich (ich hoffe, das beschriebene Routing der Kernel-Richtlinien ist heutzutage standardmäßig aktiviert): kindlund.wordpress.com/2007/11/19/…
Savvas Radevic

Antworten:

48

Sie können Code zur Laufzeit mit LD_PRELOAD ersetzen (@windows Sie können eine ähnliche Technik verwenden, die Umwege genannt wird , ziemlich ausgefallen). Auf diese Weise wird der dynamische Linker angewiesen, zunächst alle Bibliotheken in den Prozess zu laden, den Sie ausführen möchten, und anschließend weitere Bibliotheken hinzuzufügen. du benutzt es normalerweise so:

% LD_PRELOAD=./mylib.so ls

und dadurch änderst du was lsmacht.

Für Ihr Problem würde ich versuchen, http://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 baust du 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 finden Sie unter http://daniel-lange.com/archives/53-Binding-applications-to-a-specific-IP.html

ähnliche Hacks und Tools:

Akira
quelle
7
Wow, was zum Teufel. +1
sinni800
1
Hallo, das scheint ein wirklich netter Trick zu sein, aber er funktioniert bei mir nicht. Ich habe zwei 3G-Modems, die, wenn sie verbunden sind, zwei Schnittstellen (ppp0 und ppp1) öffnen. Wenn ich versuche, eine der beiden IP-Adressen zu erzwingen, wird immer dieselbe Schnittstelle verwendet (ich sehe das, weil ich zwei Instanzen von Wireshark habe, eine für jede Schnittstelle). Ich habe auch die Debug-Drucke aus bind.c entfernt und in der Tat sehe ich, dass die "überladene" Bibliothek geladen ist, also weiß ich nicht, warum es nicht funktioniert.
Andrea Spadaccini
3
LD_PRELOAD wird ignoriert, wenn Ihre effektive UID nicht mit Ihrer tatsächlichen UID übereinstimmt.
Matthias Krull
Das force_bindProjekt von Catalin M. Boie unterstützt ipv6
BurnsBA
Funktioniert prima, musste aber #include <arpa / inet.h> hinzufügen, damit die Kompilierung erfolgreich war.
anno
31

ip netns kann das.

TL; DR: Erstellen Sie Netzwerknamespaces, ordnen Sie ihnen Schnittstellen zu und führen Sie dann "ip netns exec NAME cmd ..." aus.

Überprüfe einfach, ob deine Distribution IP-Netze unterstützt ... (Backtrack 5r3 nicht, während Kali dies tut;))

IN MEHR DETAILS:

#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 dies besser als das Binden der IP über LD_PRELOAD? Da LD_PRELOAD die von den Prozessen verwendete Route nicht steuert. Es wird die erste Route verwenden.

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

olivervbk
quelle
2
Bitte versuchen Sie, Ihrer Antwort weitere Details hinzuzufügen.
Renju Chandran Chingath
4
Tun Sie dies nicht auf dem Remote-Server, wenn eth0 die öffentliche Netzwerkschnittstelle ist.
ygrek
1
die letzte ip netns exec myNamespace firefox
zeile
1
Verwenden Sie "sudo ip netns del <Namespace-Name>", um den Namespace bei Bedarf zu entfernen!
Eduardo Lucio
1
@EduardoLucio sollte es möglich sein, es wie sudo ip netns exec myNamespace su -u someUser -c firefox
folgt
2

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

Ich denke jedoch, dass Sie in der Lage sein könnten, mit ipchain / iptables zu spielen und zu erzwingen, dass ein bestimmter Port, den Ihr Prozess überwacht, nur Pakete über eine bestimmte Schnittstelle empfängt.

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

thetarro
quelle
2
Die beiden höher gestimmten Beiträge beweisen das Gegenteil.
Paul Gear
2

Basierend auf @olivervbk Antwort unten 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] - Durch den Namen der ausgewählten Netzwerkschnittstelle ersetzen.
  • [YOUR_USER] - Ersetzen Sie durch Ihren Benutzernamen.
  • [APP_NAME] - Name der Anwendung, die im Namensraum "[INTERFACE_NAME] _ns" ausgeführt wird. ZB: "Firefox".

HINWEIS I: Die Flags "-b -u" im Befehl "sudo" ermöglichen es der Anwendung, mit Ihrem Benutzer (nicht "root") und im Hintergrund ausgeführt zu werden und das Terminal freizugeben. Das 2> /dev/null 1> /dev/null &Snippet soll verhindern, dass Ausgaben von "[APP_NAME]" am Terminal gedruckt werden.
ANMERKUNG II: Die Werte von ip "10.1.1.10" und "10.1.1.1" sind willkürlich.
HINWEIS III: Um für mich zu arbeiten, 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 existierende zu entfernen.

Eduardo Lucio
quelle
1

Wenn ein Programm keine Option zum Einstellen der Überwachungsschnittstelle hat, überwacht es normalerweise ALLE Schnittstellen. (Sie können dies überprüfen mit lsof -i).

Am einfachsten ist es, iptables-Firewallregeln zu erstellen, die eingehenden Datenverkehr auf Schnittstellen, auf denen er nicht sichtbar sein soll, auf seine Ports lenken.

LawrenceC
quelle
1

Alternative I:

Verwenden Sie ld_preload, um das Schnittstellen-Gateway https://github.com/Intika-Linux-Network/App-Route-Jail zu erzwingen

Erzwingen Sie, dass eine Anwendung eine bestimmte Netzwerkschnittstelle verwendet

Wir müssen herausfinden, welches Gateway die Netzwerkschnittstelle verwendet, und dann dieses Gateway zu unserer inhaftierten Anwendung zwingen und somit die Anwendung zwingen, sich an eine bestimmte Netzwerkschnittstelle zu binden

  • So finden Sie das Schnittstellen-Gateway (es gibt viele Lösungen, um das Gateway zu finden. Hier finden Sie einige Befehle, mit denen Sie das verwendete Gateway finden können.)
$ route
$ route -n
$ ip rule list
$ ip route show
$ netstat -rn
$ cat /etc/network/interfaces
$ cat /etc/sysconfig/network-scripts/ifcfg-eth0
$ traceroute www.google.com
$ ip route show 0.0.0.0/0 dev eth0

Pro Anwendungs-Gateway

  • Bauen Sie App-Route-Jail
git clone https://github.com/Intika-Linux-Network/App-Route-Jail.git
cd Approute-Utils
chown 755 make.sh
./make.sh
  • Das Hinzufügen einer Route für die zukünftig markierten Pakete (für die inhaftierte Anwendung) wird in diesem Beispiel 192.168.1.1als erzwungenes Gateway verwendet. Diese Routenregel wirkt sich nicht auf andere Anwendungen aus. Diese Manipulation muss beispielsweise nur einmal beim Systemstart durchgeführt werden, wenn Sie dies möchten Verwenden Sie diese Lösung täglich
ip rule add fwmark 10 table 100
ip route add default via 192.168.1.1 table 100
  • Starten Sie die Anwendung, die Sie ins Gefängnis bringen möchten
MARK=10 LD_PRELOAD=./mark.so firefox
  • Testen der WAN-IP-Adresse
MARK=10 LD_PRELOAD=./mark.so wget -qO- ifconfig.me

Alternative II:

Firejail https://firejail.wordpress.com/ kann eine Anwendung zur Verwendung eines bestimmten Netzwerks zwingen, die Kompatibilität ist jedoch eingeschränkt.

firejail --dns=8.8.8.8 --net=eth0 --ip=192.168.1.1
intika
quelle
Beachten Sie, dass die Markierung für normale Benutzer nicht möglich ist. Sie müssen als root ausgeführt werden.
9.
-2

Warum sollte ein Programm eine andere Schnittstelle als die mit dem Server verbundene verwenden, um mit diesem Server zu kommunizieren? Wenn das System die mit einem Server verbundene Schnittstelle nicht verwendet, um mit diesem Server zu kommunizieren, liegt ein Problem auf Systemebene (Routing-Tabelle) vor und es hat nichts damit zu tun, welcher Prozess zufällig mit diesem Server kommunizieren möchte.

Verschiedene Server in IP-Netzwerken haben unterschiedliche IP-Adressen. Der Kernel sollte anhand der Routing-Tabelle wissen, welche Schnittstelle verwendet werden muss, um eine bestimmte IP-Adresse zu erreichen. Wenn Sie versuchen, mit zwei verschiedenen Servern zu kommunizieren, die dieselbe IP-Adresse haben, wird das System verwirrt (unter anderem, weil die Verbindungen nur intern nach Zieladresse indiziert werden). Sie können dies tun, aber es handelt sich um eine Korrektur auf Systemebene, bei der ein Server in ein separates logisches Netzwerk gestellt wird, das nur über Software-NAT mit dem Computer verbunden ist.

Wenn sie also unterschiedliche IP-Adressen haben, verwenden Sie Routen, um die richtige Schnittstelle auszuwählen. Wenn sie die gleiche IP-Adresse haben, müssen Sie NAT verwenden, damit sie unterschiedliche IP-Adressen für das System zu haben scheinen.

David Schwartz
quelle
3
Erstens kann es mehrere gültige Routen zwischen Client und Server geben, die jedoch unterschiedliche Eigenschaften aufweisen und für unterschiedliche Verkehrstypen geeignet sind. Beispielsweise kann UMTS (Cellular Data) Geld kosten, hat aber eine größere Reichweite als WiFi, aber beide sind langsamer als eine Glasfaserverbindung. Wenn die Upstream-Anbieter die Quellfilterung (oder NAT) durchführen, haben Sie keine andere Wahl, als die "richtige" Schnittstelle auszusenden. Zweitens ist die Beeinflussung des Routings nicht der einzige Grund, eine Quelladresse auszuwählen. Auch wenn beide Adressen auf der gleichen Schnittstelle sind , kann es sinnvoll sein, was gebunden ist zu steuern , wenn Verbindungen initiieren, wie der Server
Ein Fall ist, wenn Sie unterschiedliche öffentliche IP-Adressen haben und in jeder einen neuen Prozess für ausgehende Verbindungen starten möchten.
Rfraile