GNU/Linux >> Znalost Linux >  >> Linux

Blokovat síťový přístup procesu?

S Linuxem 2.6.24+ (považovaným za experimentální do 2.6.29) k tomu můžete použít síťové jmenné prostory. Ve vašem jádře musíte mít povoleny 'síťové jmenné prostory' (CONFIG_NET_NS=y ) a util-linux s unshare nástroj.

Potom je spuštění procesu bez přístupu k síti stejně jednoduché jako:

unshare -n program ...

Tím se vytvoří prázdný síťový jmenný prostor pro proces. To znamená, že běží bez síťových rozhraní, včetně žádné zpětné smyčky . V níže uvedeném příkladu přidáme -r, aby se program spustil až poté, co aktuální efektivní uživatel a ID skupiny byly namapovány na superuživatele (vyhněte se sudo):

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

Pokud vaše aplikace potřebuje síťové rozhraní, můžete nastavit nové:

$ 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

Upozorňujeme, že tím vytvoříte nový, místní zpětná smyčka. To znamená, že vytvořený proces nebude mít přístup k otevřeným portům hostitele 127.0.0.1 .

Pokud potřebujete získat přístup k původní síti uvnitř jmenného prostoru, můžete použít nsenter pro vstup do druhého jmenného prostoru.

Následující příklad spustí ping se síťovým jmenným prostorem, který používá PID 1 (je určen pomocí -t 1 ):

$ 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 má funkci zvanou síťové jmenné prostory, které vám v podstatě umožňují mít více síťových zásobníků na stejném počítači a jeden přiřadit programu, když jej spouštíte. Tato funkce se obvykle používá pro kontejnery, ale můžete ji také použít k dosažení toho, co chcete.

ip netns spravují to dílčí příkazy. Vytvoření nového síťového jmenného prostoru bez přístupu k ničemu je snadné, je to výchozí stav nového jmenného prostoru:

[email protected]:~# ip netns add jail

Nyní, když se přepnete do tohoto jmenného prostoru, můžete jej nakonfigurovat poměrně snadno. Pravděpodobně v tom budete chtít vychovat lo, a to je vše:

[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

Nyní, když chcete spustit příkaz bez sítě, stačí jej spustit v tomto vězení:

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

Síť je podle přání nedosažitelná. (Můžete dělat různé zajímavé věci, protože samostatný síťový zásobník obsahuje iptables pravidla atd.)


Můžete použít iptables a přesunout tento proces do cgroup:

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. Chyba Přístup odepřen, potřebujete oprávnění PROCESS [MySQL]

  2. Linux – Blokovat síťový přístup procesu?

  3. Linux – příkaz ke spuštění podřízeného procesu „offline“ (bez externí sítě) v systému Linux?

  1. Jak získat přístup k síťovému jmennému prostoru Docker Container z hostitele

  2. Linux OS Service ‚síť‘

  3. Jak zablokovat přístup k internetu pro určité programy v systému Linux

  1. Linux – Jak zrušit sdílení sítě pro aktuální proces?

  2. Procesní potomci?

  3. Proč odstranění Iptables „narušilo“ síťový přístup?