Padrão de convenção de nomenclatura para interfaces Ethernet e Wi-Fi em máquinas Linux

13

Qual é o padrão da convenção de nomenclatura para interfaces Ethernet e Wi-Fi em uma máquina Linux?

Estamos desenvolvendo uma ferramenta que deve mostrar apenas as interfaces Ethernet e Wi-Fi da máquina Linux e seu status atual.

Por exemplo, abaixo está a lista de interfaces de rede (físicas e virtuais) na minha máquina Linux (Ubuntu):

docker0, enp0s25, lo,wlp3s0

Quando executo a ferramenta, abaixo está o resultado que recebo:

enp0s25, wlp3s0

Escrevemos o código com a lógica de que todas as interfaces Ethernet sempre começam com a letra ee as interfaces Wi-Fi sempre com a letra w.

A lógica está certa? Caso contrário, como podemos resolver isso?

Mohan Raj
fonte
Gostaria de olhar como iwconfigfiltro interfaces WiFi de outros.
Patrick Mevzek 01/11/19
1
Existe uma razão pela qual você não olharia algo como lshw? Inspecionar especificamente o conteúdo de lshw -class networktalvez? Procure tudo o que é capabilities: ethernet physical? Possivelmente procurou alguns dos outros recursos também?
Zoredache
Para lidar com o desafio de quadro levantado pelo @dirkt, uma pergunta melhor seria simplesmente: "como obtenho o tipo de interface de rede no Linux (ou macOS, ou outro ...)?"
Roger Lipscombe

Respostas:

41

As interfaces de rede podem ter qualquer nome; portanto, não importa o que você faça, você encontrará situações em que (1) existe uma interface de rede "física" com um nome que não corresponde ao seu padrão ou (2) existe uma interface de rede "física" que corresponderá ao seu padrão.

Além disso, se eu fosse usuário da sua ferramenta, no momento em que ela não me permitisse fazer o que eu queria, porque eu tenho uma interface de rede que é "virtual", embora por motivos práticos ela deva ser considerada " físico "na minha configuração, eu começava a xingar alto e com força no seu aplicativo e nunca mais o usaria.

Interfaces de rede físicas e virtuais compartilham uma API comum, algo que torna o Linux realmente flexível. Por favor, não tente tomar conta de seu usuário e tire isso dele. Seus usuários agradecerão.

dirkt
fonte
11
Você realmente não respondeu à pergunta; você gastou três parágrafos desafiando o contexto da pergunta. Embora eu esteja ciente de que as respostas ao desafio de quadro são uma coisa, isso não parece ser um desses casos ... especialmente porque o usuário4556274 deu uma resposta sucinta à pergunta, conforme solicitado.
Mike Ounsworth #
18
@ MikeOunsworth: O problema é que a resposta do usuário4556274 não funciona no caso geral, só funciona se os nomes de interface forem de fato nomes de interface previsíveis. Que um simples ip link set ... name ...pode mudar. E sim, eu poderia ter listado os nomes de interface previsíveis. A resposta para a pergunta original é "por favor, não faça dessa maneira". Porque não importa como você faça isso, não funcionará.
dirkt 1/11/18
@ fpmurphy1 Não, acho que ele quer dizer nomes de interface previsíveis. Não importa se ele está systemd, tradicional (ethN), as convenções específicas da sua empresa ou de quaisquer outras normas que tornam os nomes previsível
slebetman
12
@ MikeOunsworth: A resposta está na primeira sub-cláusula da primeira frase do primeiro parágrafo: "As interfaces de rede podem ser nomeadas com qualquer coisa [...]" Portanto, o que o OP está perguntando é impossível e não pode ser feito . Você não pode detectar o tipo de uma interface de rede com base em um padrão de convenção de nomenclatura, porque não existe um padrão de convenção de nomenclatura e qualquer pessoa pode nomear suas interfaces como desejar. Por exemplo, no meu router Linux velho, eu vou adesivos coloridos na parte de trás, e as interfaces Ethernet físicas foram nomeados red, bluee green.
Jörg W Mittag
1
@ JörgWMittag, é claro que você pode detectá-los com base em um padrão, se souber que o padrão é usado (e você espera um que exporte essas informações em nome em primeiro lugar). Sabemos que o systemd possui um padrão para nomeação de interfaces de rede ; portanto, não adianta dizer que não existe.
Ilkkachu
28

Para nomes de interface previsíveis do systemd , os prefixos podem ser vistos em udev-builtin-net_id.c:

* Two character prefixes based on the type of interface:
*   en — Ethernet
*   ib — InfiniBand
*   sl — serial line IP (slip)
*   wl — wlan
*   ww — wwan

portanto, tanto para o ethXestilo tradicional de nomeação quanto para a nomeação mais recente do sistema, uma letra inicial e deve ser uma interface Ethernet para qualquer nome de interface gerado automaticamente. Todas as interfaces wifi devem começar com w nos dois esquemas, embora nem todas as interfaces que começam com w sejam wifi.

Se esta ferramenta tem de trabalhar em um ambiente arbitrária (e não apenas em ambientes internos que você controla), nota que os usuários podem renomear interfaces em sistemas Linux com nomes arbitrários, como [ wan0, lan0, lan1, dmz0] que vai quebrar quaisquer suposições sobre letras iniciais .

user4556274
fonte
7
E alguns de nós são fiéis ao sistema e se recusam.
chrylis -on strike-
1
Observe que esta solução não funcionará em sistemas usando biosdevnamenomes de interface, nos quais uma interface Ethernet pode ser nomeada como p3p7. Esse método é um antecessor dos novos nomes previsíveis do sistema e, embora agora seja preterido em distribuições comuns, ainda haverá muitos sistemas que o escolheram quando era o padrão há alguns anos atrás.
precisa saber é o seguinte
O systemd chama uma das minhas interfaces Ethernet 'renomear3'. Qual deles é pode variar, suspiro :(
user1908704
1
@ user1908704: Normalmente, isso significa que o udev recebeu o mesmo nome para várias interfaces. (Talvez você tenha um arquivo antigo de "nomes persistentes" gerado automaticamente em /etc/udev/rules.d?) Dito isso, o processo de renomeação foi corrigido na v187 para ser totalmente atômico (com êxito ou reversão) e o rename%uformato não foi alterado. existe no código-fonte desde 2012. Gostaria de suspirar que seu software esteja seis anos desatualizado.
user1686
1
@grawity Este é o Ubuntu 18.04. Acontece que determinadas placas-mãe têm duas placas de rede com a mesma entrada ACPI, resultando em ambas sendo eno1. Como isso não pode acontecer, um deles é chamado de 'renomear3'. Ainda não elaborei completamente a lógica de quem vence a corrida, mas qualquer alteração pode perturbar o concurso e fazer com que o outro seja renomeado3.
precisa saber é o seguinte
9

A convenção de nomenclatura é que interfaces LAN são nomeados eth0, eth1... e que as interfaces WLAN são nomeados wlan0, wlan1...

O que você vê são os chamados "nomes previsíveis" que o systemd introduziu. Na prática, eles são tudo menos previsíveis e podem até mudar quando o hardware é alterado, que é exatamente o problema que eles devem evitar.

Para adivinhar, a letra inicial pode ser boa o suficiente. Algumas interfaces, em particular a WLAN, têm dicas sobre /sys/class/net/*/uevent:

DEVTYPE=wlan

Infelizmente, não existe DEVTYPEpara interfaces LAN.

RalfFriedl
fonte
2
O nome do dispositivo muda quando o hardware muda não é o problema que os nomes de interface previsíveis estão tentando evitar. Os nomes de interface previsíveis evitam alterações de nome quando o hardware permanece inalterado . Este é um problema quando os dispositivos de hardware são detectados em uma ordem aleatória.
Johan Myréen 2/11
@ JohanMyréen Isso está errado: "... que eles (nome da interface) permaneçam fixos mesmo se o hardware for adicionado ou removido" freedesktop.org/wiki/Software/systemd/…
RalfFriedl
A motivação para introduzir os nomes de interface previsíveis era que a análise não é determinística e "a atribuição dos nomes" eth0 "," eth1 "e assim por diante não é mais fixa e pode muito bem acontecer que" eth0 "em uma inicialização acabe sendo "eth1" no próximo. " É um bônus se os nomes previsíveis puderem sobreviver às alterações de hardware, mas esse não foi o principal motivo para elas.
Johan Myréen 2/11
1
Ganhar algum perder algum - em alguns cenários, é muito desejável se mudou hardware clica confiável para o mesmo "slot de nomear" :)
rackandboneman
@ JohanMyréen O antigo esquema de atribuição de nomes de interface com base no MAC ou em algumas outras propriedades funcionava mais confiável ao adicionar interfaces, sem o incômodo dos novos nomes.
RalfFriedl
5

Uma ressalva com a minha resposta (também se aplica à maioria das outras): não sei o objetivo do seu aplicativo. Se for um aplicativo descartável para solucionar um problema em particular, ou para entender melhor a rede, para nunca mais ser usado novamente, confiar na primeira letra da interface pode ser uma ótima opção, rápida e suja. Se você planeja escrever o próximo concorrente no Wireshark ou no tcpdump, precisa ter certeza de que está certo para todos os tipos de casos extremos.

E se o aplicativo que você está escrevendo estiver entre esses extremos, apenas você (e seus clientes) poderão saber com que cuidado você precisa implementar sua lógica.

Outros já apontaram que os nomes nunca são confiáveis, por várias razões. O problema final é muito comum no software: suposições codificadas em vez de confiar em fatos conhecidos / documentados.

A segunda questão que não foi mencionada também se baseia em uma suposição sobre seus requisitos: que a lista de interfaces que você deseja listar é sempre exatamente "interfaces Ethernet de hardware" e "interfaces Wi-Fi".

A terceira questão é mais uma suposição: que toda interface cairá nas categorias em que você pode pensar agora. Que tal Infiniband, como mencionado por @ user4556274? E as interfaces de túnel para uma VPN? E as interfaces em ponte? E as interfaces com ponte que combinam interfaces físicas e lógicas?

Mas pode haver opções para realizar o que você está procurando. Primeiro, defina exatamente o que caracteriza uma interface que você deseja listar, versus uma que você não deseja.

Na maioria dos casos, uma característica em que você pode confiar é a tabela de roteamento (no entanto, isso funcionará apenas enquanto a interface estiver ativa, portanto, pode não ser o que você está procurando).

Qualquer interface que tenha uma rota padrão (ou seja, uma rota para 0.0.0.0) provavelmente será a que você está procurando.

Observe que mesmo isso ainda é baseado em uma suposição, apenas uma mais confiável: é possível que um sistema esteja configurado para rotear todo o tráfego de saída por meio de uma máquina virtual ou de um contêiner de encaixe (por exemplo, se houver um contêiner executando um firewall ) E o contrário também é verdadeiro: um administrador de sistemas pode bloquear o tráfego externo excluindo a rota padrão.

Outra opção é seguir o hardware real e ver qual driver ele usa. Você pode excluir determinados drivers conhecidos

Kevin Keane
fonte
4

Você está excluindo explicitamente interfaces vinculadas ou agrupadas? Nosso padrão aqui é usar bond0ou team0para a interface principal de nossos servidores.

Eu acho que você precisa repensar sua lógica. Talvez tente repetir todas as interfaces de rede definidas em um determinado sistema, divida-as entre ethernet, wifi, infiband, serial etc. e faça sua mágica.

doneal24
fonte
3

Não codifique ou faça a correspondência de nomes de hardware de padrão. Isso se aplica a todos os dispositivos. Confie nas ferramentas fornecidas pelo udev para determinar a lista de dispositivos e tomar as medidas apropriadas. Consulte 16.7 Nomeação de dispositivo persistente e, em seguida, leia todo o documento , especificamente 16.2 e 16.3. Observe que o udev é independente da distribuição e também o init do sistema, já que o udev agora é o método preferido para o gerenciamento de dispositivos no linux.

Observe que @ user4556274, aludiu a isso em sua resposta ao se referir a udev-builtin-net-id.c, o que significa que o padrão correspondente que você está tentando realizar é parte integrante udev.

Citando PredictableNetworkInterfaceNames :

Com o systemd 197, adicionamos suporte nativo a várias políticas de nomenclatura diferentes no systemd / udevd e criamos um esquema semelhante ao do biosdevname (mas geralmente mais poderoso e mais próximo dos esquemas de identificação de dispositivos internos do kernel) como padrão. Os seguintes esquemas de nomenclatura diferentes para interfaces de rede agora são suportados nativamente pelo udev:

  1. Os nomes que incorporam Firmware / BIOS forneceram números de índice para dispositivos de bordo (exemplo: eno1)
  2. Os nomes que incorporam Firmware / BIOS forneceram números de índice do slot de hotplug do PCI Express (exemplo: ens1)
  3. Nomes que incorporam a localização física / geográfica do conector do hardware (exemplo: enp2s0)
  4. Nomes que incorporam o endereço MAC da interface (exemplo: enx78e7d1ea46da) Nomeação ethX clássica, imprevisível e nativa do kernel (exemplo: eth0)

Por padrão, o systemd v197 agora nomeará interfaces seguindo a política 1) se essas informações do firmware forem aplicáveis ​​e disponíveis, retornando para 2) se essas informações do firmware forem aplicáveis ​​e disponíveis, voltando para 3) se aplicável, retornando 5) em todos os outros casos. A política 4) não é usada por padrão, mas está disponível se o usuário escolher.

Essa política combinada é aplicada apenas como último recurso. Isso significa que, se o sistema tiver o biosdevname instalado, ele terá precedência. Se o usuário adicionou regras do udev que alteram o nome dos dispositivos do kernel, elas também terão precedência. Além disso, quaisquer esquemas de nomeação específicos de distribuição geralmente têm precedência.

eyoung100
fonte
2

Como outros já disseram, você não pode depender totalmente do nome.

No meu caso, parece que para wireless /sys/class/net/<ifacename>/haverá um diretório chamado "wireless", se for uma interface sem fio:

# kbrandt @ kbrandtlx in /sys/class/net [9:47:43] C:130
$ ls
br-b293588ecdae  enp11s0  lo    veth6061cd8  virbr0-nic
docker0          enp12s0  ppp0  virbr0       wlp13s0

# kbrandt @ kbrandtlx in /sys/class/net [9:47:44] 
$ echo  /sys/class/net/*/wireless
/sys/class/net/wlp13s0/wireless
Kyle Brandt
fonte