Eu estava procurando maneiras de fazer o tcpdump de um pod do Kubernetes. Cada pod cria uma interface virtual e é difícil saber qual interface pertence ao pod real. Encontrei um método que ajuda a identificar o índice de interface de todo o sistema. Basicamente, é possível cat /sys/class/net/eth0/iflink
dentro de um container rodando no pod de destino, e ele mostrará o índice da interface de rede do host. Desta forma, você pode conhecer o veth que pertence ao pod.
Então, funcionou, mas me deixou pensando... por que posso obter informações de todo o sistema na rede se devo estar em um namespace de rede no contêiner. Portanto, não devo ter acesso ao índice de todo o sistema, devo ver apenas o índice virtual de "namespace" para a interface virtual.
Existe alguma explicação de como /sys/class/net/eth0/iflink
está relacionado aos namespaces de rede dentro do K8s?
O
iflink
valor não é um valor de todo o sistema. É um valor válido no nsid da rede peer, conforme exibido por exemplo com allip link show dev eth0
(já que é umaveth
interface com seu peer em outro namespace de rede). Para os pequenos detalhes, o nsid da rede peer não é um valor de todo o sistema, mas um valor válido apenas no namespace de rede atual que vincula a rede peer (em todo o sistema) a esse namespace de rede (em todo o sistema) porque em alguns vez que uma interface relacionada foi movida.Aqui está um exemplo, usando
ip netns add
andip netns exec
(que também (re)monta corretamente/sys
em seu próprio namespace de montagem para poder usar entradas de rede em/sys
).Ambas as interfaces têm um link de peer com valor de índice 42, mas isso não representa a mesma interface: um valor 42 é
ton2
o valor de índice de ' em netns n1, o outro éton4
o valor de índice de ' em netns n3. Se as versões modernas deip link
não resolverem o link-nsid para os nomes reais designadosip netns add
pelos namespaces de mesmo nível, ambos serão mostrados comolink-netnsid 0
abaixo (porque esse é o único namespace de rede de mesmo nível e o link-nsid começa por padrão em 0, a menos que definido caso contrário, em cada namespace de rede), novamente com 0 não sendo em todo o sistema.O valor real de todo o sistema para o peer é o namespace da rede + o índice. Aqui seria 4026533318:42 e 4026533590:42 . Mas pode ser bastante desafiador descobrir simplesmente esse namespace de rede quando ele não for o namespace de rede inicial (como neste exemplo) se não souber como ele foi criado (aqui com
ip netns
o qual deixa uma referência montada em/run/netns
).Informações adicionais sobre isso disponíveis nesta resposta que fiz.