Linux: ¿Hay alguna forma práctica de ejecutar un programa que lo vincule a la dirección IP de su elección?

11

En FreeBSD 4.9 fue muy fácil de lograr con solo un comando como

jail [-u username]  path hostname ip-number command

si la ruta fue /que tenía ejecutando el mismo programa de siempre, pero toda su comunicación de red estaba restringida a usar solo la dirección IP dada como fuente. A veces es muy útil.

Ahora en Linux hay LXC, que se parece mucho a FreeBSD jail(o las zonas de Solaris). ¿Puedes pensar en una forma similar de ejecutar un programa?

poige
fuente
¿Con qué programa estás tratando de hacer esto? Muchos programas son lo suficientemente configurables como para que se les pueda decir a qué IP enlazar.
Warren Young
@WarrenYoung, gracias KO, pero "muchos"! = "Todos"
poige
Un buen caso de uso para "encarcelar" un ejecutable para usar una IP específica es ejecutar múltiples servidores de juegos en una máquina en una fiesta LAN. Por ejemplo, los juegos de Valve solo se transmiten en los puertos 27015-27020, por lo que por IP solo puede tener 6 servidores. Por lo tanto, agrega IP virtuales en una NIC, pero luego debe especificar "+ ip <dirección>" en la línea de comandos del servidor del juego que deja de transmitir su presencia a clientes => no hay servidores visibles en el navegador LAN. Entonces "+ ip" no funcionará. Por lo tanto, necesitamos encarcelar a cada servidor en un entorno donde solo pueda encontrar 1 dirección IP. Resultado: no hay límite en #servers + clients para ver todos los servidores.
Timmos

Respuestas:

12

Iniciar el proceso dentro de un espacio de nombres de red que solo puede ver la dirección IP deseada puede lograr algo similar. Por ejemplo, supuse que solo quería localhost disponible para un programa en particular.

Primero, creo el espacio de nombres de red:

ip netns add limitednet

Los espacios de nombres tienen una interfaz de bucle invertido por defecto, así que a continuación solo necesito mostrarlo:

sudo ip netns exec limitednet ip link set lo up

Ahora, puedo ejecutar un programa usando ip netns exec limitednety solo podrá ver la interfaz de bucle invertido:

sudo ip netns exec limitednet ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever

Si quisiera limitarlo a una dirección que no sea localhost, podría agregar otras interfaces al espacio de nombres usando:

ip link set DEVICE_NAME netns NAMESPACE

Tendría que experimentar un poco más para descubrir cómo agregar una sola dirección IP en un espacio de nombres en el caso de que una interfaz pueda tener más de una dirección IP

El artículo LWN sobre espacios de nombres también es útil.

Steven D
fuente
Pero vale la pena mencionar que requeriría muchos más preparativos ya que el espacio de nombres de red tiene su propia tabla de enrutamiento, etc. Si alguien viene con una forma más simple de imitar jail, lo usaré. ;)
poige