Gostaria que todas as interfaces físicas do meu sistema residissem em um namespace de rede específico chamado "físico". É fácil mover dispositivos manualmente usando comandos como ip link set enp2s0 netns physical
e iw phy phy0 set netns name physical
, mas eu gostaria que isso acontecesse automaticamente tanto na inicialização quanto para qualquer dispositivo conectado em tempo de execução.
Parece que a melhor maneira de fazer isso seria através das regras do udev, ou possivelmente alguma mágica do systemd.
Meu primeiro pensamento foi apenas escrever uma regra udev que executasse o comando apropriado, mas me deparei com algumas perguntas que não consegui responder por meio de minhas pesquisas:
- Como faço para distinguir interfaces físicas de interfaces virtuais?
- Como faço para diferenciar as interfaces WLAN para que eu possa emitir o
iw
comando em vez doip
comando? - Como obtenho o nome de um phy de WLAN para que eu possa passá-lo para o
iw
comando?
Eu esperava que o acima fosse relativamente direto, mas não vejo nenhum fator distintivo óbvio no udevadm info
.
Com base na resposta de AB, cheguei à seguinte regra:
DEVPATH!="/devices/virtual/*
é a chave para pegar apenas dispositivos físicos.[email protected]
é um serviço oneshot que move a interface para o namespace desejado (physical
):(
[email protected]
apenas cria um namespace de rede com o nome fornecido.)Por fim,
move-netif
é responsável por descobrir como mover a interface:A maioria dessas informações são recuperáveis de
/sys
:1a.
/sys/class/net/
: lista de dispositivos de rede, todos os tipos incluídos1b.
/sys/devices/virtual/net/
: lista de dispositivos de rede virtual: incluilo
, túneis, veth, pontes ... então se estiver no primeiro, mas não neste, deve ser físico.se um dispositivo for um dispositivo sem fio moderno (driver), ele terá a entrada
/sys/class/net/<device>/phy82011/name
, por exemplo:Então, executando o script adequado do
udev
ambiente e comparando com esses diretórios e arquivos do/sys
, você deve ter todas as informações necessárias para fazê-lo.Apenas como uma observação lateral, se mais tarde, para trabalhar nesses dispositivos, você alterar apenas o namespace da rede ( por exemplo , using
nsenter --net=/var/run/netns/physical
),/sys
ainda estará no namespace de montagem do host e não refletirá a chegada desses dispositivos, mas os mostrará ausência de. Usarip netns exec physical command
é bom, ele altera o namespace de montagem e remonta/sys
para você.