Como identificar as placas de rede conectadas ao mesmo comutador em uma caixa do Linux?

15

Configuração inicial

Como administrador do Linux, você instalou uma nova caixa do Linux com 6 NICs eth0 a eth5. A interface eth0 está configurada corretamente e todas as outras interfaces estão ativas no momento, mas sem o endereço IP. Os caras da rede simplesmente conectaram quatro cabos a esta caixa. Dois cabos LAN são usados ​​para conectar a caixa à rede de produção e dois são usados ​​para conectar a caixa a uma rede privada. Você sabe apenas que eth0 está conectado à rede de produção. Mas você não sabe qual outra NIC está conectada ao mesmo comutador, pois há diferentes gerações de servidores e / ou os responsáveis ​​pela rede usam as NICs erradas para suas conexões.

Tarefa em mãos

Como essa configuração é típica para sua infraestrutura, você deseja automatizar a configuração das interfaces de ligação. Agora você tem a tarefa de detectar quais NICs não estão conectadas e quais NICs estão vinculadas ao mesmo comutador para que possam ser ligadas. Você tem acesso apenas às caixas do Linux e não pode consultar os comutadores.

Ideias

É fácil detectar o status do link:

ethtool $device | grep 'Link detected' | cut -d ':' -f 2

Mas como combinar os dispositivos conectados ao mesmo comutador?

No HP-UX, existe uma ferramenta para esse fim chamada linkloop [1]. A ferramenta oficial do Linux está ausente (existe um projeto antigo do SourceForce).

As possíveis soluções que já me vieram à mente são:

  1. Ouça em todas as interfaces com o tcpdump. Crie e envie um pacote ICMP (broadcast). As interfaces que veem esse pacote precisam estar conectadas ao mesmo switch. -> precisa de sugestões de ferramentas simples que possam ser usadas para isso. Eu gostaria de usar comandos de shell simples ou Python para os scripts.

  2. Tente conversar com uma caixa externa através de um protocolo fácil (HTTP?) E veja se há uma resposta. -> Erro propenso e dependente de uma caixa externa.

Você tem mais idéias ou sugestões sobre como resolver esta tarefa?

Agradecemos antecipadamente por todos os comentários!

[1] http://linux.die.net/man/1/linkloop

Reiner Rottmann
fonte
1
Isso realmente cheira a lição de casa - esse é um problema real que você está enfrentando em um ambiente de produção?
precisa saber é o seguinte
2
Problema real e irritante, devo acrescentar. Estou fora da escola por um longo tempo ...
Reiner Rottmann
OK - a razão que eu peço é maneira que você formulou a pergunta me lembrou do estilo de um dos meus livros de rede :-)
voretaq7

Respostas:

10

Os switches já podem estar enviando as informações desejadas. Se forem comutadores Cisco, por padrão, eles usarão um processo chamado CDP (Cisco Discovery Protocol) que fornecerá informações sobre o comutador em que está conectado.

Você pode usar o tcpdump para visualizar essas informações com o seguinte (substituindo a interface apropriada):

tcpdump -nn -v -i eth0 -s 1500 -c 1 'ether[20:2] == 0x2000'

A versão padrão do CDP é o LLDP (protocolo de descoberta da camada de link). Alguns fornecedores terão isso ativado por padrão e outros desativados, portanto sua milhagem varia. Existem algumas implementações de LLDP para Linux, mas se você quiser algo semelhante ao acima, você pode usá-lo (configure o LLDP em um switch Cisco e teste o abaixo, o que é mais consistente com o anterior):

tcpdump -nn -v -i eth0 -s 1500 -c 1 'ether proto 0x88cc'

Exceto isso, eu diria que uma modificação da opção 1 que você fornece pode funcionar, no entanto, em vez de enviar um ICMP de transmissão, você pode tentar um ICMP normal (para um host que não esteja na tabela ARP) e capturar os pacotes ARP. Se a solicitação ARP for enviada eth0 e você a receber em eth1 e eth3, você saberá que elas estão na mesma VLAN. O comando mais simples para isso é o seguinte:

tcpdump -i eth0 arp
YLearn
fonte
1
Na verdade, eu fui com esta solução e escrevi um pequeno script python que executa tcpdumps como threads em segundo plano e, em seguida, envio solicitações arp e vejo qual interface recebe pacotes arp dos quais src mac. Funciona, mas com todos os tempos limite, leva algum tempo.
Reiner Rottmann
Presumo que você esteja falando sobre os tempos limite do ping? Você pode tentar fping ou nmap como opções para reduzir o tempo limite para menos de um segundo. Por exemplo, "fping -c1 -t200 192.168.0.1" ou "nmap -sP --max-retries = 1 --host-timeout = 200ms 192.168.0.1".
YLearn
3

Se o switch se comunicar com você usando o LLDP, você poderá executar o LLDP e encontrar mais informações lá.

mcmeel
fonte
3

Se os comutadores forem dispositivos Cisco, você poderá obter informações sobre o CDP, desde que estejam anunciando / transmitindo informações sobre o CDP

por exemplo, ferramentas cdp ou cdpr

mike brentlinger
fonte
1

Por que não baixar e construir a linkloopferramenta? Não é tão velho ...

Caso contrário, eu usaria apenas uma ferramenta que será transmitida pela camada 2 e verificará se você a recebe via tcpdump.

É fácil enviar um pacote ICMP de transmissão ping -b 192.168.1.255

user606723
fonte
Eu apenas tentei fazer isso, e falhou aqui em 2016 no Ubuntu 14, então YMMV.
Corte Saw