Con Linux 2.6.24+ (considerado experimental hasta 2.6.29), puede usar espacios de nombres de red para eso. Debe tener habilitados los 'espacios de nombres de red' en su núcleo (CONFIG_NET_NS=y
) y util-linux con el unshare
herramienta.
Entonces, iniciar un proceso sin acceso a la red es tan simple como:
unshare -n program ...
Esto crea un espacio de nombres de red vacío para el proceso. Es decir, se ejecuta sin interfaces de red, incluido sin loopback . En el siguiente ejemplo, agregamos -r para ejecutar el programa solo después de que las ID de usuario y grupo efectivas actuales se hayan asignado a las de superusuario (evite sudo):
$ unshare -r -n ping 127.0.0.1
connect: Network is unreachable
Si su aplicación necesita una interfaz de red, puede configurar una nueva:
$ 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
Tenga en cuenta que esto creará un nuevo local bucle invertido Es decir, el proceso generado no podrá acceder a los puertos abiertos del 127.0.0.1
del host. .
Si necesita obtener acceso a la red original dentro del espacio de nombres, puede usar nsenter
para ingresar el otro espacio de nombres.
El siguiente ejemplo ejecuta ping
con espacio de nombres de red que utiliza PID 1 (se especifica a través de -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 tiene una función llamada espacios de nombres de red que le permite tener esencialmente varias pilas de red en la misma máquina y asignar una a un programa cuando lo ejecuta. Esta es una característica que normalmente se usa para contenedores, pero también puede usarla para lograr lo que desea.
El ip netns
los subcomandos lo administran. Crear un nuevo espacio de nombres de red sin acceso a nada es fácil, es el estado predeterminado de un nuevo espacio de nombres:
[email protected]:~# ip netns add jail
Ahora, si cambia a ese espacio de nombres, puede configurarlo con bastante facilidad. Probablemente querrá mencionar lo, y eso es todo:
[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
Ahora, cuando desee ejecutar su comando sin red, simplemente ejecútelo en esa cárcel:
[email protected]:~# ip netns exec jail su user -c 'ping 8.8.8.8'
connect: Network is unreachable
La red es, como se desea, inalcanzable. (Puede hacer todo tipo de cosas interesantes ya que una pila de red independiente incluye iptables
reglas, etc.)
Podría usar iptables y mover ese proceso a un 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