Pode-se executar ping em uma NIC pelo MAC

28

Eu tenho uma placa NIC em uma máquina Debian em algum lugar. A máquina está desligada, mas preciso saber se a placa NIC está ativada para que eu possa enviar um pacote mágico wake-on-lan mais tarde (de outra máquina Debian) para ativá-lo. Eu tenho o endereço MAC do cartão. Existe alguma maneira de executar ping na placa ethernet pelo MAC para ver se ela está ligada?

Eu tentei criar uma entrada ARP:

arp -s 192.168.2.2 00-0c-0d-ef-02-03
ping 192.168.2.2

Isso não funcionou, pois a placa NIC não possui esse endereço IP. Portanto, a placa NIC receberia a solicitação de ping, mas não responderia a ela. Existe alguma maneira de contornar isso?

Estou usando o pacote etherwake para enviar uma mensagem wake-on-lan.

Alastor Moody
fonte

Respostas:

23

Você pode ter melhor sorte usando a ferramenta arping. A ferramenta pingfunciona no nível da camada 3 do modelo OSI , enquanto que arpingna camada 2.

Você ainda precisa conhecer o IP do sistema, no entanto, com esta ferramenta. Existem duas versões, a padrão incluída na maioria dos Unixes (de Alexey Kuznetsov) é a versão que pode lidar apenas com endereços IP. A outra versão (de Thomas Habets) supostamente pode consultar usando endereços MAC.

$ sudo arping 192.168.1.1 -c 1
ARPING 192.168.1.1 from 192.168.1.218 eth0
Unicast reply from 192.168.1.1 [00:90:7F:85:BE:9A]  1.216ms
Sent 1 probes (1 broadcast(s))
Received 1 response(s)

arpingfunciona de maneira semelhante a, pingexceto em vez de enviar pacotes ICMP, ele envia pacotes ARP.

Obtendo o IP de um sistema usando apenas o MAC

Aqui estão alguns métodos para fazer a pesquisa inversa de MAC para IP.

  1. nmap

    $ nmap -sP 192.168.1.0/24
    

    Em seguida, procure no computador arp a máquina correspondente arp -an.

  2. fping

    $ fping -a -g 192.168.1.0/24 -c 1
    

    Em seguida, procure no seu cache arp, o mesmo que acima.

  3. ping

    $ ping -b -c1 192.168.1.255
    

    Em seguida, procure no seu cache arp, o mesmo que acima.

  4. nbtscan (somente hosts do Windows)

    $ nbtscan 192.168.1.0/24
    
    Doing NBT name scan for addresses from 192.168.1.0/24
    
    IP address       NetBIOS Name     Server    User             MAC address      
    ------------------------------------------------------------------------------
    192.168.1.0 Sendto failed: Permission denied
    192.168.1.4      MACH1            <server>  <unknown>        00-0b-12-60-21-dd
    192.168.1.5      MACH2            <server>  <unknown>        00-1b-a0-3d-e7-be
    192.168.1.6      MACH3            <server>  <unknown>        00-21-9b-12-b6-a7
    
slm
fonte
3
arpingpode tomar um endereço MAC como um parâmetro:arping -c 5 38:e7:d8:63:5e:a6
@MichaelMrozek - Fiz isso depois que alguém basicamente postou minha resposta como um comentário e não leu o que eu disse sobre duas versões do arping. A outra resposta parece ter sido excluída, então, obrigada por tirar minhas frustrações ousadas.
slm
Obrigado pela ajuda. Marcando isso como resolvido. Não foi possível encontrar uma opção WOL na configuração do BIOS. Este é o meu palpite: o BIOS não tinha o WOL ativado, mas a NIC estava. Portanto, a NIC estava acordando no primeiro pacote WOL e enviando uma mensagem para o BIOS. Mas como não foi ativado no BIOS, o BIOS não fez nada. A partir desse momento, a NIC respondeu ao ping, pois estava acordada, mas a máquina não estava. Pergunta tão rápida: é possível que o BIOS desligue o WOL e que a NIC o ligue ao mesmo tempo?
Alastor Moody
1
@AlastorMoody - eu diria que você provavelmente está autorizado a desativar o BIOS WOL com o WOL da NIC ativado. No entanto, se o BIOS não suportar WOL, acho que você não poderá utilizá-lo, mesmo que a NIC o faça. Veja o artigo da wikipedia no WOL: en.wikipedia.org/wiki/Wake-on-LAN . Diz o mesmo que eu na seção "solução de problemas de pacotes mágicos".
slm
@niervol: arpingpara um endereço MAC: Sim, existem duas implementações do arping 1. do Linux iputils 2. arping por Thomas Habets . --- Somente a 2. implementação pode executar ping em um endereço MAC, mas esse ping é muito complicado: a máquina pingada ainda precisa ter o TCP / IP configurado (pelo menos um endereço IP) e deve poder responder a um ping para um endereço IP de broadcast.
precisa saber é
12

Você não pode executar ping em uma NIC normal porque a NIC sozinha não envia nenhuma resposta.

Somente um computador em execução pode enviar respostas

As placas de interface de rede normais não enviam respostas por si mesmas. Eles sempre precisam de um software em execução no computador para fazer isso.

Quando a CPU do computador está desligada, não há software em execução que envie uma resposta a um ping.

Wake-on-LAN é unidirecional

A ativação na LAN permite que o computador permita que apenas a NIC seja parcialmente ligada para receber quadros Ethernet e procure a sequência mágica de ativação neles, mas a NIC ainda não enviará nenhuma resposta. Wake-on-LAN é estritamente unidirecional. Não há respostas enviadas.

Exceções

Existem certas NICs especiais que podem enviar respostas por si próprias, como por exemplo as que implementam uma descarga completa do handshake TCP .

pabouk
fonte
1
+1 - esta é a única resposta que realmente responde à pergunta do OP. "Wake-on-LAN é unidirecional".
Celada
5

O ether-wakecomando funcionará por endereço MAC, então você (a) não precisará de um endereço IP e (b) poderá enviar o comando sem causar danos (se já estiver acordado, acordar não terá impacto?)

Você pode ver a lista do seu cache arp existente usando arp -ane grepping no seu MAC para obter o IP do host de destino. No entanto, como o arp é um cache, ele pode ter sido "atingido o tempo limite" do cache (e ainda estar 'ativo'). Talvez você precise usar um método de força bruta para descobrir seu IP, como:

 sudo nmap -sP 192.168.2.0/24 | less  

(e procure 00: 0c: 0d: ef: 02: 03) - desde que os firewalls e outras coisas do tipo não atrapalhem!

Drav Sloan
fonte
Não quero acordar a máquina agora. Mas quero garantir que a NIC possa receber minhas mensagens para que, quando eu for para o local e ligar a máquina por meio de um pacote WOL, saiba que ela será ligada. É por isso que quero fazer ping por IP ou MAC e não acordá-lo.
Alastor Moody
2
Máquinas adormecidas não responderão ao ping. Se a máquina estiver ligada e você efetuar ping por IP (e o host responder), ela colocará uma entrada no cache do arp. Se a entrada lá coincidir com o endereço MAC do host, existe uma chance razoável de que ele funcione (excluindo outros firewalls da rede, roteadores e outros problemas físicos que podem fazer com que ether-wakenão o cheguem). Na verdade, eu teria acesso a outro host no local, colocaria a máquina de destino em suspensão e tentaria ether-wake. Pela natureza de como funciona WOL, o pedido terá de ser enviado na mesma sub-rede como o anfitrião de qualquer maneira
Drav Sloan
2
@DravSloan, o Bonjour Proxy disponível em, por exemplo, o Apples Time Capsule, é uma maneira bastante engenhosa de lidar com esse problema. A máquina dorme, mas o roteador responde por ela e só a ativa quando o proxy não aguenta mais.
Thorbjørn Ravn Andersen
Não confie no WOL sem testá-lo primeiro. Em vez disso, obtenha um cartão IPMI nesse caso.
sjas
0

Meu aplicativo era um servidor RSYNCing em uma estação de trabalho para obter o diretório Document da estação de trabalho ... mas a estação de trabalho não tinha um endereço IP garantido, mas possuía um endereço MAC conhecido (o endereço IP era feito pelo DHCP). esse código usa apenas ping.

export COUNTER=1
while [ $COUNTER -lt 255 ]
do
    #ping $1$COUNTER -c 1 -w 400 | grep -B 1 "Lost = 0" &
    # activate all 254 addresses  in the subnet..  dont really need to grep the ping output
    ping 192.168.0.$COUNTER -c 1 -w 4 2> /dev/null | grep -B 1 ' 0\% packet loss' > /dev/null &
    COUNTER=$(( $COUNTER + 1 ))
done
# wait till 254 background processes finished
wait
# the arp cache will automatically flush it's incomplete entries in about 10 minutes...
#echo "finished"

#
#SRC_SERVER_IP="192.168.0.160:873"
SRC_SERVER_IP=$(arp -a | grep "00:22:4d:81:8f:76" | awk '{print $2}' | sed 's/[()]//g')":873"

if [ $SRC_SERVER_IP == ":873"   ] ; then
    echo  "ws1.example.com is not on the network...  exiting..."
    exit 0
fi
Don Matheson
fonte
0

Aqui está um script simples para executar ping através do endereço mac. Basta salvar e executar, por exemplo
macping aa:bb:cc:dd:ee:ff

Você também pode encadear o resultado em série para fazer outras coisas condicionalmente, por exemplo:

macping aa:bb:cc:dd:ee:ff && echo do something if online || echo do something if offline

-

#!/bin/bash
network=192.168.1.1/24

if [ "$#" -ne 1 ]; then echo Usage example: $0 aa:bb:cc:dd:ee:ff; exit 2; fi;

nmap -sP $network >& /dev/null
ip=$(arp -n | grep $1 | awk ' { print $1 }')
ping $ip -n -q -c 2 -i 0.2 -w 1 >& /dev/null
if [ $? -eq 0 ]; then
    echo Device is online \($ip\)
else
    echo Device is offline
    exit 1
fi;
Mtl Dev
fonte
0

Isso não depende de versões diferentes do arping nem de scripts complexos do bash:

ping $(arp-scan --localnet | grep 80:1f:02:fa:90:b7  | awk ' { printf $1 } ')

Eu usei o arp-scan em vez do arp, pois parece correr muito mais rápido.

Julian Knight
fonte