it-swarm.com.de

Wie werden unterschiedliche Netzwerkschnittstellen für unterschiedliche Prozesse verwendet?

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 Clientprogramm über eine bestimmte Schnittstelle mit einem Server in Verbindung zu setzen .

59

sie können Code zur Laufzeit mit LD_PRELOAD ersetzen. (@windows Sie können eine ähnliche Technik verwenden, die als detours bezeichnet wird. , ziemlich schick). 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 damit ändern Sie, was ls macht.

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

ein längeres Howto ist http://daniel-lange.com/archives/53-Binding-applications-to-a-specific-IP.html

ähnliche Hacks und Tools:

47
akira

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 das besser als die IP über LD_PRELOAD zu binden? Weil LD_PRELOAD die von den Prozessen verwendete Route nicht steuert. Es wird die erste Route verwenden.

Und da immer dieselbe Route verwendet wird, wird standardmäßig die für die Route registrierte Schnittstelle verwendet. (Dies ist nicht das, was wir möchten.)

31
olivervbk

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

2
thetarro

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 zu ermitteln, 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 die Ausführung der Anwendung mit Ihrem Benutzer (nicht "root") und im Hintergrund das Terminal loslassen. 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 Befehl dhcpcd [INTERFACE_NAME] ausführen.

Um den Namespace zu entfernen, verwenden Sie ...

ip netns del [INTERFACE_NAME]_ns

... oder...

ip -all netns delete

... um existierende zu entfernen.

1
Eduardo Lucio

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

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

1
LawrenceC

Alternative I:

Mit ld_preload das Interface-Gateway erzwingen https://github.com/Intika-Linux-Network/App-Route-Jail

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

  • Erstellen 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
  • Fügen Sie eine Route für die zukünftig markierten Pakete hinzu (für die inhaftierte Anwendung). In diesem Beispiel wird 192.168.1.1 als 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 diese Lösung täglich zu verwenden
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 begrenzt.

firejail --dns=8.8.8.8 --net=eth0 --ip=192.168.1.1
0
intika