É possível identificar inequivocamente que uma determinada interface de rede, como eth1
, é na verdade uma veth
interface de rede do tipo? Observe que em contêineres, seus nomes de interface de rede geralmente começam com eth*
em vez de veth*
e não se pode ter certeza de que não há um real eth
no conjunto. Isso pode ser detectado através de /sys/class/net
?
Tenho a impressão de que o iflink
elemento in /sys/class/net/...
não identifica de forma inequívoca veth
as interfaces de rede, mas também é usado em outras situações. Se não houver como resolver minha dúvida usando o /sys/class/net/...
sistema de arquivos, existe uma chamada de soquete que possa me fornecer essa informação, preferencialmente utilizável em Python?
Depois de ainda mais pesquisas, cheguei à conclusão de que meu objetivo não é alcançável usandoFelizmente, é alcançável./sys/class/net/...
.Montando o Namespace Corretamente
/sys/class/net
Graças à resposta de Danila Kiver para "Mudar para um namespace de rede não altera /sys/class/net?" tudo o que preciso fazer é montar
sysfs
em algum lugar para obter a visualização correta do namespace (rede)sysfs
e suaclass/net/
ramificação.O exemplo de Python a seguir procura por namespaces de rede e, em seguida, lista todas as interfaces de rede em um namespace de rede específico, marcando cada interface de rede física com
[PHY]
. Por favor, note que este script precisa de root/admin cap, especialmente devido ao mount.Solução sem
/sys/class/net
No entanto, a interface NETLINK para o kernel do Linux fornece as informações necessárias, caso contrário, o
ip link
comando não seria capaz de informar o tipo de interface.A chave aqui é o
IFLA_LINKINFO
atributo que é retornado ao solicitar ao kernel uma lista de links de rede (isto é, interfaces de rede). Dentro dela existe outro atributo chamadoIFLA_INFO_KIND
, éveth
no caso de umaveth
interface de rede, oubridge
no caso de uma ponte do Kernel Linux.Observe que
IFLA_LINKINFO
é um atributo opcional; por exemplo, as interfaces de rede loopback, ethernet e wi-fi não oferecemIFLA_LINKINFO
.Esta informação pode ser facilmente obtida em Python usando a famosa biblioteca pyroute2 netlink.
pyroute2
lidar com todo o material desagradável do NETLINK, instale-o facilmente viapip3
. Este exemplo simplesmente itera sobre todas as interfaces de rede visíveis no namespace da rede atual, fornecendo seus nomes, índice de interface e oIFLA_LINKINFO
valor, se presente.