Linux: Existe uma maneira prática de executar um programa vinculando-o ao endereço IP de sua escolha?

11

No FreeBSD 4.9, era muito fácil realizar com apenas um único comando como

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

se o caminho estivesse, /você executaria exatamente o mesmo programa de sempre, mas toda a sua comunicação de rede estava restrita a usar apenas o endereço IP fornecido como fonte. Às vezes é muito útil.

Agora, no Linux, existe o LXC, que se parece muito com o FreeBSD jail(ou com as zonas do Solaris) - você consegue pensar em uma maneira semelhante de executar um programa?

poige
fonte
Com qual programa você está tentando fazer isso? Muitos programas são suficientes configurável que pode ser dito que IP para ligar.
Warren Young
@WarrenYoung, Graças KO, mas "muitos" = "all"!
poige
Um bom caso de uso para "prender" um executável para usar um IP específico está executando vários servidores de jogos em uma máquina em uma parte da LAN. Por exemplo, os jogos Valve estão transmitindo apenas nas portas 27015-27020, portanto, por IP, você pode ter apenas 6 servidores. Então você adiciona IPs virtuais em uma NIC, mas precisa especificar "+ ip <endereço>" na linha de comando do servidor de jogos que para de transmitir sua presença aos clientes => nenhum servidor visível no navegador da LAN. Então "+ ip" não funcionará. Portanto, precisamos prender cada servidor em um ambiente em que ele possa encontrar apenas 1 endereço IP. Resultado: nenhum limite em #servers + clients vê todos os servidores.
Timmos 17/01/17

Respostas:

12

Iniciar o processo dentro de um namespace de rede que só pode ver o endereço IP desejado pode realizar algo semelhante. Por exemplo, suponha que eu só quisesse localhost disponível para um programa específico.

Primeiro, eu crio o namespace da rede:

ip netns add limitednet

Os namespaces têm uma interface de loopback por padrão, então, a seguir, eu só preciso trazê-la à tona:

sudo ip netns exec limitednet ip link set lo up

Agora, eu posso executar um programa usando ip netns exec limitednete ele só poderá ver a interface de loopback:

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

Se eu quisesse limitá-lo a um endereço diferente de localhost, poderia adicionar outras interfaces ao namespace usando:

ip link set DEVICE_NAME netns NAMESPACE

Eu precisaria experimentar um pouco mais para descobrir como adicionar um único endereço IP a um espaço para nome no caso em que uma interface possa ter mais de um endereço IP

O artigo LWN sobre namespaces também é útil.

Steven D
fonte
Mas vale a pena mencionar que isso exigiria muito mais preparativos, pois o espaço para nome da rede possui sua própria tabela de roteamento e assim por diante. Se alguém vier com uma maneira mais simples de imitar jail, eu vou usá-lo. ;)
poige