Usando o Windows Subsystem para Linux 2, quero executar duas instâncias separadas do Centos 7, mas quando faço isso, ambas as instâncias têm o mesmo endereço inet eth0. Aqui está o que eu fiz...
Eu criei um tarball Centos 7 base para minha base, então criei duas distros separadas e tudo parece e roda como eu esperava que fosse;
> wsl --import centos7-1 centos7-1 centos7.tar.gz --version 2
> wsl --import centos7-2 centos7-2 centos7.tar.gz --version 2
> wsl -l -v
NAME STATE VERSION
* centos7-1 Stopped 2
centos7-2 Stopped 2
> ls
Directory: C:\Users\me\centos
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 4/8/2022 11:28 AM centos7-1
d----- 4/8/2022 11:29 AM centos7-2
-a---- 4/8/2022 11:24 AM 174323670 centos7.tar.gz
EXCETO quando eu abro e executo cada distro em janelas PS separadas e executo ifconfig eth0
em cada uma, ambas mostram o mesmo endereço inet eth0.
Então, o que estou perdendo? Como faço para que eles tenham endereços IP independentes?
Eu notei, desde que postei pela primeira vez, que mesmo instâncias de diferentes distribuições linux, por exemplo, Ubuntu, são executadas ao mesmo tempo que Centos, todas obtêm o mesmo endereço IP.
A resposta de @DanielB é uma excelente explicação de por que todas as distribuições WSL2 (eu gosto de chamá-las de "instâncias") compartilham o mesmo endereço. Cada instância WSL2 tem um separado:
Cada instância WSL2 tem um separado:
No entanto, todos eles compartilham o seguinte com a VM WSL2 pai (e, portanto, entre si):
/dev/pts
)/init
binário (mas não processo)O interessante é que podemos usar a mesma tecnologia, namespaces, para "fingir" criar um endereço IP separado para cada instância.
Para o cenário de "teste de n camadas" que você menciona nos comentários, esperamos que isso seja suficiente. Podemos criar um script para a criação do namespace para cada instância e (opcionalmente) inseri-lo automaticamente por meio da
wsl
linha de comando.Embora eu tivesse um palpite de que isso funcionaria, nunca havia brincado com namespaces de rede antes de tentar isso. Não se preocupe - foi um exercício de aprendizado que valeu a pena para mim. O crédito enorme vai para este post do blog por me levar 90% até lá.
Com isso dito, aqui está uma primeira (ou segunda, ou terceira ...) passagem em um script para configurar um namespace de rede que permitirá que cada namespace em cada instância tenha um IP diferente.
Crie isso como algo como
/usr/local/sbin/wsl-netns.sh
:Não há muito tratamento de erros lá no momento, mas é bastante simples. Defina-o como executável e execute-o a partir de uma instância com:
Ou inicie o WSL diretamente com ele via:
Apenas certifique-se de usar um número de instância exclusivo para cada um. O endereço de cada instância/namespace será
10.0.0.<instance_number>
, e você poderá acessá-lo de qualquer outra instância do WSL2.Para testar, inicie um serviço simples dentro de um dos namespaces. Por exemplo, se você estiver no namespace em que o script o colocou, basta executar:
Você pode acessar esse servidor em
10.0.0.1:8000
outra instância. Você não poderá acessar o serviço através de qualquer outro IP.Como alternativa, você não precisa usar
nsenter
para cair no namespace. Você pode iniciar diretamente um serviço dentro dele via:Ou seja qual for o seu comando de criação.
Bônus adicionado:
Limitações:
/etc/hosts
geração automática do WSL e definir o seu próprio. Ou configure-o via DNS, é claro.Todas as distribuições WSL 2 residem no mesmo namespace de rede.
Você pode ou não estar familiarizado com o Docker. Internamente, o WSL 2 funciona de maneira muito semelhante. O WSL 2 é executado em uma máquina virtual, em um kernel Linux real. Todas as distribuições WSL compartilham a mesma máquina virtual. Isso funciona usando contêineres diferentes para cada um. Eles são isolados em vários aspectos: cada distribuição tem uma visão diferente dos IDs de processo e do sistema de arquivos. Eles compartilham a mesma visão nas interfaces de rede.
Você não pode fazer com que eles tenham endereços IP diferentes. Também é (principalmente) irrelevante, porque você só pode dizer a diferença em sua máquina local. Do lado de fora, eles são enviados por NAT para o endereço IP do seu PC.