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

Netzwerkzugriff eines Prozesses blockieren?

Mit Linux 2.6.24+ (bis 2.6.29 als experimentell betrachtet) können Sie dafür Netzwerk-Namespaces verwenden. Sie müssen die 'Network Namespaces' in Ihrem Kernel aktiviert haben (CONFIG_NET_NS=y ) und util-linux mit dem unshare Werkzeug.

Dann ist das Starten eines Prozesses ohne Netzwerkzugriff so einfach wie:

unshare -n program ...

Dadurch wird ein leerer Netzwerk-Namespace für den Prozess erstellt. Das heißt, es wird ohne Netzwerkschnittstellen ausgeführt, einschließlich kein Loopback . Im folgenden Beispiel fügen wir -r hinzu, um das Programm erst auszuführen, nachdem die aktuellen effektiven Benutzer- und Gruppen-IDs den Superuser-IDs zugeordnet wurden (vermeiden Sie sudo):

$ unshare -r -n ping 127.0.0.1
connect: Network is unreachable

Wenn Ihre App eine Netzwerkschnittstelle benötigt, können Sie eine neue einrichten:

$ unshare -n -- sh -c 'ip link set dev lo up; ping 127.0.0.1'
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=32 time=0.066 ms

Beachten Sie, dass dadurch eine neue, lokale erstellt wird Schleife. Das heißt, der erzeugte Prozess kann nicht auf offene Ports von 127.0.0.1 des Hosts zugreifen .

Wenn Sie Zugriff auf das ursprüngliche Netzwerk innerhalb des Namensraums benötigen, können Sie nsenter verwenden um den anderen Namensraum einzugeben.

Das folgende Beispiel führt ping aus mit Netzwerknamensraum, der von PID 1 verwendet wird (wird durch -t 1 angegeben ):

$ nsenter -n -t 1 -- ping -c4 example.com
PING example.com (93.184.216.119) 56(84) bytes of data.
64 bytes from 93.184.216.119: icmp_seq=1 ttl=50 time=134 ms
64 bytes from 93.184.216.119: icmp_seq=2 ttl=50 time=134 ms
64 bytes from 93.184.216.119: icmp_seq=3 ttl=50 time=134 ms
64 bytes from 93.184.216.119: icmp_seq=4 ttl=50 time=139 ms

--- example.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 134.621/136.028/139.848/2.252 ms

Linux verfügt über eine Funktion namens Netzwerk-Namespaces, mit der Sie im Wesentlichen mehrere Netzwerk-Stacks auf demselben Computer haben und einen einem Programm zuweisen können, wenn Sie es ausführen. Dies ist eine Funktion, die normalerweise für Container verwendet wird, aber Sie können sie auch verwenden, um das zu erreichen, was Sie wollen.

Die ip netns Unterbefehle verwalten es. Das Erstellen eines neuen Netzwerk-Namensraums ohne Zugriff auf irgendetwas ist einfach, es ist der Standardzustand eines neuen Namensraums:

[email protected]:~# ip netns add jail

Wenn Sie jetzt zu diesem Namespace wechseln, können Sie ihn ziemlich einfach konfigurieren. Sie werden wahrscheinlich lo darin erwähnen wollen, und das war's:

[email protected]:~# ip netns exec jail /bin/bash
[email protected]:~# ip addr add 127.0.0.1/8 dev lo
[email protected]:~# ip link set dev lo up
[email protected]:~# exit

Wenn Sie Ihren Befehl jetzt ohne Netzwerk ausführen möchten, führen Sie ihn einfach in diesem Jail aus:

[email protected]:~# ip netns exec jail su user -c 'ping  8.8.8.8'
connect: Network is unreachable

Das Netz ist wie gewünscht nicht erreichbar. (Sie können alle möglichen interessanten Dinge tun, da ein separater Netzwerkstapel iptables enthält Regeln usw.)


Sie könnten iptables verwenden und diesen Prozess in eine Kontrollgruppe verschieben:

mkdir /sys/fs/cgroup/net_cls/block
echo 42 > /sys/fs/cgroup/net_cls/block/net_cls.classid

iptables -A OUTPUT -m cgroup --cgroup 42 -j DROP

echo [pid] > /sys/fs/cgroup/net_cls/block/tasks

Linux
  1. Fehler Zugriff verweigert PROCESS-Privileg erforderlich [MySQL]

  2. Nachkommen verarbeiten?

  3. So greifen Sie vom Host auf den Netzwerk-Namespace des Docker-Containers zu

  4. Erstellen Sie einen Zombie-Prozess

  5. Nicht-Root-Prozess erlauben, sich an Port 80 und 443 zu binden?

So blockieren Sie den Zugriff auf wp-admin und wp-login in Nginx/Apache

Linux NBD-Tutorial:Jumpstart-Leitfaden für Netzwerkblockgeräte

pthread_exit vs. return

Zugriff auf ausgewählte Websites unter Linux nicht möglich (aber unter Windows möglich)

Wie kann der Zugriff auf eine Datei blockiert werden, die von Tomcat bereitgestellt wird?

Netzwerkport geöffnet, aber kein Prozess angeschlossen?