Declaração do problema
Com a configuração abaixo, um par veth é criado entre o namespace de rede padrão/principal e um netns chamado ns1
.
A configuração também cria um segundo par veth: veth2 está em netns ns1
e veth3 está em netns ns2
, isso se junta ns1
à ns2
criação da cadeia: default netns-veth0 <-> veth1-ns1-veth2 <-> veth3-ns2
.
sudo ip link add veth0 type veth peer name veth1
sudo ip -6 addr add CCFF::0/127 peer CCFF::1/127 dev veth0
sudo ip link set up dev veth0
sudo ip netns add ns1
sudo ip link set veth1 netns ns1
sudo ip -n ns1 -6 addr add CCFF::1/127 peer CCFF::0/127 dev veth1
sudo ip -n ns1 link set up dev veth1
sudo ip -n ns1 -6 route add default via CCFF::0
sudo ip link add veth2 type veth peer name veth3
sudo ip link set veth2 netns ns1
sudo ip -n ns1 -6 addr add CCFF::2/127 peer CCFF::3/127 dev veth2
sudo ip -n ns1 link set up dev veth2
sudo ip -n ns1 -6 route add CCFF::/64 via CCFF::3
sudo ip netns add ns2
sudo ip link set veth3 netns ns2
sudo ip -n ns2 -6 addr add CCFF::3/127 peer CCFF::2/127 dev veth3
sudo ip -n ns2 link set up dev veth3
sudo ip -n ns2 -6 route add default via CCFF::2
sudo ip -6 r add CCFF::/64 via CCFF::1
A partir dos netns padrão eu posso pingar veth0 que está no mesmo netns. A partir dos netns padrão, posso pingar veth1 e veth2, que estão ambos em ns1
. Dos netns padrão, não consigo pint veth3 que está em ns2
.
Se eu estender a alteração da seguinte forma, adicionando veth4 in ns2
e veth5 in ns3
, tenho o mesmo problema. Eu posso fazer ping de qualquer interface ns1
para qualquer interface no ns2
, mas não consigo acessar nenhuma interface no ns3
.
sudo ip link add veth4 type veth peer name veth5
sudo ip link set veth4 netns ns2
sudo ip netns exec ns2 ip -6 addr add CCFF::4/127 peer CCFF::5/127 dev veth4
sudo ip netns exec ns2 ip link set up dev veth4
sudo ip netns exec ns2 ip -6 route add CCFF::/64 via CCFF::5
sudo ip netns add ns3
sudo ip link set veth5 netns ns3
sudo ip netns exec ns3 ip -6 addr add CCFF::5/127 peer CCFF::4/127 dev veth5
sudo ip netns exec ns3 ip link set up dev veth5
sudo ip netns exec ns3 ip -6 route add default via CCFF::4
Parece que só consigo fazer ping em uma interface em uma rede diretamente "vizinha" / "conectada" à que estou fazendo o ping. Não consigo fazer ping em uma cadeia de namespaces de rede. O roteamento é todo válido; netns padrão podem fazer ping em qualquer interface, ns1
mas nada além disso, interfaces em ns1
podem fazer ping em qualquer interface nas redes padrão ou ns2
mas nada em ns3
, e ns3
podem fazer ping em qualquer coisa, ns2
mas nada além de ns1
ou nas redes padrão.
Isso é uma limitação de namespaces de rede?
Solução de problemas
O encaminhamento de IPv6 está ativado, o ip6tables está definido como "permitir todos", não tenho certeza do que mais verificar.
$ip -6 r
ccff::1 dev veth0 proto kernel metric 256 pref medium
ccff::/127 dev veth0 proto kernel metric 256 pref medium
ccff::/64 via ccff::1 dev veth0 metric 1024 pref medium
fe80::/64 dev veth0 proto kernel metric 256 pref medium
$sudo ip -n ns1 -6 r
ccff:: dev veth1 proto kernel metric 256 pref medium
ccff::/127 dev veth1 proto kernel metric 256 pref medium
ccff::3 dev veth2 proto kernel metric 256 pref medium
ccff::2/127 dev veth2 proto kernel metric 256 pref medium
ccff::/64 via ccff::3 dev veth2 metric 1024 pref medium
fe80::/64 dev veth1 proto kernel metric 256 pref medium
fe80::/64 dev veth2 proto kernel metric 256 pref medium
default via ccff:: dev veth1 metric 1024 pref medium
$sudo ip -n ns2 -6 r
ccff::2 dev veth3 proto kernel metric 256 pref medium
ccff::2/127 dev veth3 proto kernel metric 256 pref medium
ccff::5 dev veth4 proto kernel metric 256 pref medium
ccff::4/127 dev veth4 proto kernel metric 256 pref medium
ccff::/64 via ccff::5 dev veth4 metric 1024 pref medium
fe80::/64 dev veth3 proto kernel metric 256 pref medium
fe80::/64 dev veth4 proto kernel metric 256 pref medium
default via ccff::2 dev veth3 metric 1024 pref medium
$sudo ip -n ns3 -6 r
ccff::4/127 dev veth5 proto kernel metric 256 linkdown pref medium
default via ccff::4 dev veth5 metric 1024 linkdown pref medium
$cat /proc/sys/net/ipv6/conf/all/forwarding
1
$cat /proc/sys/net/ipv6/conf/default/forwarding
1
$sudo ip6tables-save
# Generated by ip6tables-save v1.8.4 on Wed Nov 17 22:02:48 2021
*filter
:INPUT ACCEPT [76565:173401906]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [50440:6536664]
COMMIT
# Completed on Wed Nov 17 22:02:48 2021
$lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 20.04.3 LTS
Release: 20.04
Codename: focal
$uname -a
Linux l13-ubuntu 5.11.0-40-generic #44~20.04.2-Ubuntu SMP Tue Oct 26 18:07:44 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
Provavelmente não: Quando tentei isso no meu sistema com os comandos fornecidos no início da pergunta, também não consigo acessar
veth3
:No entanto, quando habilito o encaminhamento em
ns1
funciona:
Portanto, é provável que você também não tenha o encaminhamento IPv6 ativado no
ns1
. (E lembre-se de que o encaminhamento é por namespace ; você o habilitou no namespace principal, mas não nons1
?)Eu depurei isso fazendo um
tcpdump
em cada interface; que os pings não alcançassemveth2
era um sinal de que o encaminhamento não estava habilitado.E se você está se perguntando "mas por que posso fazer ping
veth2
se o encaminhamento não estiver ativado": o Linux trata todos os endereços locais da mesma forma, para que você possa acessar qualquer endereço local de qualquer interface. Isso não tem relação com o encaminhamento.BTW, ajuda muito a executar um
xterm
em cada namespace; que torna a depuração muito mais fácil.Cheguei à mesma conclusão totalmente válida que o @dirkt fez, cada namespace é um host de rede por si só, incluindo a configuração se ele se comporta como um roteador ou não (o padrão é desativado). As configurações de /proc/sys/net são separadas para cada namespace. a resolução é separada, os links de interface são separados (mas o nome do host não é, para isso você precisa criar namespaces UTS). Então, basicamente, essa é a sua resposta.
Não para diminuir de qualquer maneira, mas para referência futura, adicionarei algumas coisas e reorganizarei e simplificarei isso um pouco. Na verdade, você não precisa da configuração de roteamento em seu namespace padrão, a menos que queira rotear o tráfego externo para esses namespaces ou vice-versa.
Para resumir uma construção para namespace padrão e ns1 mais ns2.
Alguns testes que você pode então fazer:
Você também pode resolver e hospedar alterações no arquivo