GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Linux – Befehl zum Ausführen eines untergeordneten Prozesses „offline“ (kein externes Netzwerk) unter Linux?

Ich habe ein Programm, das ich im Offline-Modus testen möchte, ohne mein aktuelles Netzwerk herunterzufahren. Dieses Programm müsste sich weiterhin mit lokalen Sockets verbinden, einschließlich Unix-Domain-Sockets und Loopback. Es muss auch zuhören auf Loopback und für andere Apps sichtbar sein.

Versuche, eine Verbindung zu einem Remote-Computer herzustellen, sollten jedoch fehlschlagen.

Ich hätte gerne ein Dienstprogramm, das wie strace funktioniert /unshare /sudo und führt einfach einen Befehl aus, wobei das Internet (und LAN) verborgen ist und alles andere noch funktioniert:

$ offline my-program-to-test

Diese Frage hat Hinweise auf die Antwort:Block network access of a process?

Es gibt dort ein paar Vorschläge, wie z. B. als anderer Benutzer ausführen und dann iptables manipulieren oder unshare -n . Aber in beiden Fällen kenne ich die Beschwörung nicht, dass Unix-Domain-Sockets und Loopback mit dem Hauptsystem geteilt werden sollen – die Antworten auf diese Frage sagen mir nur, wie ich die gesamte Freigabe aufheben kann Netzwerk.

Das Programm, das ich teste, muss sich immer noch mit meinem X-Server und dbus verbinden und sogar in der Lage sein, Loopback auf Verbindungen von anderen Apps auf dem System zu überwachen.

Idealerweise möchte ich vermeiden, Chroots oder Benutzer oder VMs oder ähnliches zu erstellen, da es genauso lästig wird wie das Abziehen des Netzwerkkabels. d.h. der Sinn der Frage ist, wie kann ich das so einfach wie ein sudo machen .

Ich würde es lieben, wenn der Prozess zu 100 % normal ausgeführt würde, außer dass Netzwerkaufrufe mit Angabe einer nicht lokalen Adresse fehlschlagen würden. Idealerweise die gleiche UID, das gleiche Homedir, das gleiche PWD, das gleiche alles außer … offline.

Ich verwende Fedora 18, daher sind nicht portierbare Linux-Antworten in Ordnung (sogar erwartet).

Ich bin sogar froh, dies zu lösen, indem ich ein C-Programm schreibe, wenn es darum geht, also sind Antworten, die das Schreiben von C beinhalten, in Ordnung. Ich weiß nur nicht, welche Systemaufrufe das C-Programm ausführen müsste, um den externen Netzwerkzugriff zu widerrufen, während das lokale Netzwerk beibehalten wird.

Jeder Entwickler, der versucht, den „Offline-Modus“ zu unterstützen, wird dieses Dienstprogramm wahrscheinlich zu schätzen wissen!

Akzeptierte Antwort:

Die traditionelle Antwort ist, das Programm als ein anderer Benutzer auszuführen und iptables -m owner zu verwenden . Auf diese Weise wird die Netzwerkkonfiguration gemeinsam genutzt. Mit dem Aufkommen von Namespaces gibt es jedoch einen einfacheren Weg.

Mit Namespaces heben Sie die Freigabe des Netzwerks auf und erstellen dann eine virtuelle Netzwerkverbindung, wenn Sie eingeschränkten Netzwerkzugriff benötigen.

Um Unix-Domain-Sockets gemeinsam zu nutzen, brauchen Sie nach diesem 2010-Patch nur einen Kernel, der aktuell genug ist, also 2.6.36 oder höher (was bei allen aktuellen Distributionen zum Zeitpunkt des Schreibens der Fall ist, mit Ausnahme von RHEL/CentOS).

Führen Sie das Programm in seinem eigenen IP-Namespace aus. Richten Sie vor dem Programmstart eine virtuelle Ethernet-Schnittstelle ein. Es scheint nicht viel Dokumentation zu geben; Die richtige Beschwörung habe ich in einigen Blogs gefunden:

  • Linux-Namespaces bei Arista
  • Einige Anmerkungen zu Veth-Schnittstellen von Waldner
  • Einführung in Linux-Netzwerk-Namespaces von Scott Lowe
Verwandte:Centos – DNSMasq – Unterschiedliche Antworten für bestimmte MAC-Adressen?

Im folgenden Snippet verwende ich die ns_exec ist dieser Wrapper um setns in der Manpage aufgeführt, um die Hostseite der Netzwerkverbindung aus dem Prozess aufzurufen, der im eingeschränkten Namespace ausgeführt wird. Sie brauchen das eigentlich nicht:Sie können die Hostseite des Links von außerhalb des eingeschränkten Namensraums einrichten. Wenn Sie dies von innen tun, wird lediglich die Flusskontrolle erleichtert, andernfalls benötigen Sie eine gewisse Synchronisation, um die Verbindung einzurichten, nachdem sie hergestellt wurde, aber bevor Sie Ihr Programm starten.

unshare -n -- sh -c '
  # Create a virtual ethernet interface called "confined",
  # with the other end called "global" in the namespace of PID 1
  ip link add confined type veth peer name global netns 1

  # Bring up the confined end of the network link
  ip addr add 172.16.0.2/30 dev confined
  ip link set confined up

  # Bring up the global end of the network link
  ns_exec /proc/1/ns/net ifconfig global 172.16.0.1 netmask 255.255.255.252 up

  # Execute the test program
  exec sudo -E -u "$TARGET_USER" "$0" "[email protected]"
' /path/to/program --argument

Das ganze musst du als root machen. Die Einführung von Benutzernamensräumen in Kernel 3.8 macht dies möglicherweise ohne besondere Berechtigungen möglich, außer zum Einrichten des globalen Endes der Netzwerkverbindung.

Ich weiß nicht, wie ich localhost zwischen den beiden Namespaces teilen soll. Virtuelle Ethernet-Schnittstellen bilden eine Punkt-zu-Punkt-Brücke. Sie können iptables verwenden Weiterleitungsregeln zum Umleiten von Datenverkehr von/nach lo falls gewünscht.


Linux
  1. kill-Befehlsbeispiele in Linux

  2. renice-Befehlsbeispiele in Linux

  3. dsniff-Befehlsbeispiele in Linux

  4. pkill-Befehlsbeispiele in Linux

  5. Führen Sie den cd-Befehl als Superuser unter Linux aus

Killall-Befehl in Linux mit Beispielen

5 schnelle Möglichkeiten, einen Prozess in Linux zu beenden

Wie man einen Prozess unter Linux beendet

10 Beispiele für Linux ss-Befehle zur Überwachung von Netzwerkverbindungen

Linux ifconfig-Befehlsbeispiele

Linux-nload-Befehl