È possibile eseguire il ping di una scheda NIC tramite MAC


28

Ho una scheda NIC su una macchina Debian da qualche parte. La macchina è spenta, ma devo sapere se la scheda NIC è accesa in modo da poter inviare un pacchetto magico wake-on-lan in seguito (da un'altra macchina Debian) per svegliarla. Ho l'indirizzo MAC della scheda. Esiste un modo per eseguire il ping della scheda Ethernet tramite MAC per vedere se è accesa?

Ho provato a creare una voce ARP:

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

Non ha funzionato, poiché la scheda NIC non ha questo indirizzo IP. Quindi la scheda NIC riceve la richiesta di ping ma non risponde. C'è un modo per aggirare questo?

Sto usando il pacchetto etherwake per inviare un messaggio wake-on-lan.

Risposte:


23

arpingInvece potresti avere una fortuna migliore usando lo strumento . Lo strumento pingfunziona a livello di livello 3 del modello OSI , mentre arpingfunziona a livello 2.

Tuttavia, è ancora necessario conoscere l'IP del sistema con questo strumento. Ne esistono 2 versioni, quella standard inclusa nella maggior parte degli Unix (quella di Alexey Kuznetsov) è la versione che può gestire solo indirizzi IP. L' altra versione (Thomas Habets ') può presumibilmente eseguire query utilizzando gli indirizzi 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)

arpingfunziona in modo simile pingtranne che invece di inviare pacchetti ICMP, invia pacchetti ARP.

Ottenere l'IP di un sistema usando solo il MAC

Ecco un paio di metodi per eseguire la ricerca inversa di MAC su IP.

  1. Nmap

    $ nmap -sP 192.168.1.0/24
    

    Quindi cerca nella tua cache arp il computer corrispondente arp -an.

  2. fping

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

    Quindi cerca nella tua cache arp, come sopra.

  3. ping

    $ ping -b -c1 192.168.1.255
    

    Quindi cerca nella tua cache arp, come sopra.

  4. nbtscan (solo host 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
    

3
arpingpuò prendere un indirizzo MAC come parametro:arping -c 5 38:e7:d8:63:5e:a6

@MichaelMrozek - L'ho fatto dopo che qualcuno aveva praticamente pubblicato la mia risposta come commento e non avevo letto quello che ho detto su 2 versioni di arping. L'altra risposta sembra essere stata eliminata, quindi grazie per aver eliminato le mie audaci frustrazioni.
slm

Grazie per l'aiuto. Contrassegnando questo come risolto. Impossibile trovare un'opzione WOL nell'impostazione del BIOS. Questa è la mia ipotesi: il BIOS non aveva WOL attivato, ma la scheda di rete lo faceva. Quindi la scheda NIC si stava svegliando sul primo pacchetto WOL e stava inviando un messaggio al BIOS. Ma poiché non è stato attivato nel BIOS, il BIOS non ha fatto nulla. Da questo momento in poi, la scheda di rete ha risposto al ping poiché era sveglia, ma la macchina non lo era. Domanda così veloce: è possibile che WOL sia spento e che la scheda di rete sia accesa contemporaneamente?
Alastor Moody,

1
@AlastorMoody - Direi che probabilmente ti è permesso disattivare BIOS WOL con WOL di NIC acceso. Tuttavia, se il BIOS non supporta WOL, non credo che sarai in grado di utilizzarlo anche se la scheda di rete lo fa. Vedi l'articolo di Wikipedia su WOL: en.wikipedia.org/wiki/Wake-on-LAN . Dice la stessa cosa di me nella sezione "Risoluzione dei problemi dei pacchetti magici".
slm

@niervol: arpinga un indirizzo MAC: Sì, ci sono due implementazioni di arping 1. da Linux iputils 2. arping di Thomas Habets . --- Solo l' implementazione 2. può eseguire il ping di un indirizzo MAC ma tale ping è molto complicato: la macchina con ping deve ancora avere il protocollo TCP / IP configurato (almeno un indirizzo IP) e deve essere in grado di rispondere a un ping a un indirizzo IP di trasmissione.
pabouk,

12

Non è possibile eseguire il ping di una NIC normale poiché la NIC da sola non invia alcuna risposta.

Solo un computer in esecuzione è in grado di inviare risposte

Le normali schede di interfaccia di rete non inviano risposte da sole. Hanno sempre bisogno di un software in esecuzione sul computer per farlo.

Quando la CPU del computer viene spenta, non è in esecuzione alcun software che invierebbe una risposta a un ping.

Wake-on-LAN è unidirezionale

Wake-on-LAN consente al computer di accendere parzialmente solo la scheda NIC per ricevere frame Ethernet e cercare la sequenza di riattivazione magica in essi, ma la scheda NIC non invierà ancora alcuna risposta. Wake-on-LAN è strettamente unidirezionale. Non ci sono risposte inviate.

eccezioni

Esistono alcune NIC speciali che possono inviare risposte da sole, come ad esempio quelle che implementano un offload di handshake TCP completo .


1
+1: questa è l'unica risposta che risponde veramente alla domanda del PO. "Wake-on-LAN è unidirezionale".
Celada,

5

Il ether-wakecomando funzionerà per indirizzo mac, quindi sicuramente (a) non avrai bisogno di un indirizzo IP e (b) puoi inviare il comando senza danni (se è già attivo, il risveglio non avrà alcun impatto?)

È possibile visualizzare l'elenco della cache arp esistente utilizzando arp -ane grepping per il MAC per ottenere l'IP dell'host di destinazione. Tuttavia, poiché arp è una cache, potrebbe essere "scaduto" dalla cache (ed essere ancora "attivo"). Potrebbe quindi essere necessario utilizzare un metodo di forza bruta per trovare il suo IP, come ad esempio:

 sudo nmap -sP 192.168.2.0/24 | less  

(e quindi cerca 00: 0c: 0d: ef: 02: 03) - a condizione che i firewall e altre cose simili non si frappongano!


Non voglio svegliare la macchina in questo momento. Ma voglio assicurarmi che la NIC possa ricevere i miei messaggi in modo che quando vado fuori sede e accendo la macchina tramite un pacchetto WOL, sappia che si accenderà. Ecco perché voglio fare il ping tramite IP o MAC e non svegliarlo.
Alastor Moody,

2
Le macchine dormienti non risponderanno al ping. Se la macchina è accesa e si esegue il ping tramite IP (e l'host reponds), inserirà una voce nella cache arp. Se la voce in ingresso corrisponde all'indirizzo MAC dell'host, esiste una ragionevole possibilità che funzioni (escludendo altri firewall di rete, router e altri problemi fisici che potrebbero causare il ether-wakemancato raggiungimento). Avrei effettivamente accesso a un altro host in loco, mettere la macchina di destinazione in sospensione e tentare di ether-wake. Per la natura di come funziona WOL, la richiesta dovrà comunque essere inviata sulla stessa sottorete dell'host
Drav Sloan

2
@DravSloan il proxy Bonjour disponibile su Apples Time Capsule è un modo abbastanza ingegnoso per gestire questo problema. La macchina dorme ma il router risponde e la riattiva solo quando il proxy non può più gestirla.
Thorbjørn Ravn Andersen,

Non fare affidamento su WOL senza prima averlo testato. Piuttosto ottieni una scheda IPMI in quel caso.
sjas,

0

La mia applicazione era un server RSYNCing in una workstation per ottenere la directory Document della workstation ... ma la workstation non aveva un indirizzo IP garantito ma aveva un indirizzo MAC noto (l'indirizzo IP è stato eseguito da DHCP). questo codice utilizza SOLO 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

0

Ecco un semplice script per eseguire il ping tramite l'indirizzo MAC. Basta salvare ed eseguire ad es
macping aa:bb:cc:dd:ee:ff

Puoi anche eseguire il collegamento a catena del risultato per fare condizionalmente altre cose, ad esempio:

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;

0

Questo non si basa su versioni diverse di arping né su script bash complessi:

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

Ho usato arp-scan piuttosto che arp in quanto sembra funzionare molto più velocemente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.