Vamos imaginar o seguinte caso de uso:
- Estou conectado a várias redes (WLAN0, ETH0, USB0).
- Quero escolher qual rede eu vou usar quando iniciar aplicativos.
- Meu aplicativo não me permite escolher uma interface específica, é delegado ao sistema operacional que escolhe o padrão.
É claro que eu poderia usar o Docker, que isola as redes, no entanto, o Docker também isola muitas outras coisas, precisa de imagens e não é realmente adequado para iniciar aplicativos existentes no seu computador.
Vamos usar o mesmo mecanismo, nomes de rede, mas manualmente.
Vamos começar criando um espaço para nome de rede chamado 4G:
Agora vinculamos uma interface existente a ela (podemos usar uma interface virtual para configuração complexa, mas o exibiremos com a linha de comando aqui).
O meu é chamado ENP0S20U2:
sudo ip link set dev enp0s20u2 netns 4g
Uma vez feito, a interface não é visível do espaço para nome padrão, vamos verificar com:
Agora que eu configurei a interface, preciso ligá -la ao meu espaço para nome 4G. Prefixando cada um de seus comandos ou abra um shell:
sudo ip netns exec 4g ip link set enp0s20u2 up
sudo ip netns exec 4g ip addr add 192.168.42.30/24 broadcast 192.168.42.255 dev enp0s20u2
sudo ip netns exec 4g ip route add default via 192.168.42.129
ou
sudo ip netns exec 4g bash
> ip link set enp0s20u2 up
> ip addr add 192.168.42.30/24 broadcast 192.168.42.255 dev enp0s20u2
> ip route add default via 192.168.42.129
> exit
A partir de agora está funcionando, mas não temos um DNS.
DNS geralmente são definidos em /etc/resolv.conf
E a funcionalidade de espaço para nome oferece um sistema de mapeamento (padrão) /etc/netns/
Então, vamos editar o arquivo:
sudo mkdir -p /etc/netstat/4g
sudo echo "nameserver 8.8.8.8" > /etc/netstat/4g/resolv.conf
Agora o espaço para nome está totalmente funcional. Podemos lançar o Firefox, por exemplo:
sudo ip netns exec 4g firefox
O Firefox é lançado como raiz, o que não é ótimo. Para consertar, use sudo:
USER=`whoami` sudo ip netns exec 4g sudo -u ${USER} firefox
Pronto!