web-dev-qa-db-fra.com

Peut-on cingler un NIC par MAC

J'ai une carte NIC sur une machine Debian quelque part. La machine est éteinte, mais j'ai besoin de savoir si la carte NIC est allumée pour que je peut envoyer un paquet magique wake-on-lan plus tard (à partir d'une autre machine Debian) pour le réveiller. J'ai l'adresse MAC de la carte.

J'ai essayé de créer une entrée ARP:

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

Cela n'a pas fonctionné, car la carte NIC n'a pas cette adresse IP. La carte NIC recevrait donc la requête ping mais n'y répondrait pas) Y a-t-il un moyen de contourner cela?

J'utilise le package etherwake pour envoyer un message de réveil sur réseau local.

28
Alastor Moody

Vous pourriez avoir plus de chance en utilisant à la place l'outil arping. L'outil ping fonctionne au niveau de la couche 3 du modèle OSI , tandis que arping fonctionne à la couche 2.

Cependant, vous devez toujours connaître l'IP du système avec cet outil. Il en existe 2 versions, la version standard incluse avec la plupart des Unix (celle d'Alexey Kuznetsov) est la version qui ne peut traiter que les adresses IP. Les autre version (Thomas Habets) peuvent supposément utiliser des adresses 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)

arping fonctionne de la même manière que ping sauf qu'au lieu d'envoyer des paquets ICMP, il envoie des paquets ARP.

Obtenir l'IP d'un système en utilisant uniquement le MAC

Voici quelques méthodes pour effectuer la recherche inversée de MAC vers IP.

  1. nmap

    $ nmap -sP 192.168.1.0/24
    

    Recherchez ensuite dans votre cache arp la machine correspondante arp -an.

  2. fping

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

    Ensuite, regardez dans votre cache arp, comme ci-dessus.

  3. ping

    $ ping -b -c1 192.168.1.255
    

    Ensuite, regardez dans votre cache arp, comme ci-dessus.

  4. nbtscan (hôtes Windows uniquement)

    $ 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
    
23
slm

Vous ne pouvez pas envoyer une requête ping à un NIC parce que NIC seul n'envoie aucune réponse.

Seul un ordinateur en cours d'exécution peut envoyer des réponses

Les cartes d'interface réseau normales n'envoient aucune réponse par elles-mêmes. Pour ce faire, ils ont toujours besoin d'un logiciel en cours d'exécution sur l'ordinateur.

Lorsque le processeur de l'ordinateur est hors tension, il n'y a aucun logiciel en cours d'exécution qui enverrait une réponse à un ping.

Wake-on-LAN est unidirectionnel

Wake-on-LAN permet à l'ordinateur de laisser uniquement le NIC être partiellement sous tension pour recevoir des trames Ethernet et y rechercher la séquence de réveil magique) mais le NIC n'enverra toujours aucune réponse. Wake-on-LAN est strictement unidirectionnel. Aucune réponse n'est envoyée.

Exceptions

Il existe certains NIC spéciaux qui pourraient envoyer des réponses par eux-mêmes comme par exemple ceux qui implémentent un TCP handshake offload complet .

12
pabouk

Le ether-wake la commande fonctionnera par adresse mac, donc sûrement vous (a) n'aurez pas besoin d'une adresse IP et (b) pourrez envoyer la commande sans dommage (si elle est déjà réveillée, la réveiller n'aura aucun impact?)

Vous pouvez voir la liste de votre cache arp existant en utilisant arp -an et en demandant à votre MAC d'obtenir l'IP de l'hôte cible. Cependant, parce que arp est un cache, il peut avoir été "expiré" du cache (et toujours être "éveillé"). Vous devrez alors peut-être utiliser une méthode de force brute pour trouver son IP, comme:

 Sudo nmap -sP 192.168.2.0/24 | less  

(puis recherchez 00: 0c: 0d: ef: 02: 03) - les pare-feu fournis et autres ne gênent pas!

5
Drav Sloan

Cela ne repose pas sur des versions différentes d'arping ni sur des scripts bash complexes:

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

J'ai utilisé arp-scan plutôt que arp car il semble fonctionner beaucoup plus rapidement.

0
Julian Knight

Voici un script simple pour ping via l'adresse mac. Enregistrez et exécutez par exemple
macping aa:bb:cc:dd:ee:ff

Vous pouvez également relier le résultat en série pour effectuer d'autres tâches de manière conditionnelle, par exemple:

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
Mtl Dev

Mon application était un serveur RSYNCing dans un poste de travail pour obtenir le répertoire de documents du poste de travail ... mais le poste de travail n'avait pas d'adresse IP garantie mais avait une adresse MAC connue (l'adresse IP a été effectuée par DHCP). ce code utilise ping uniquement.

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
Don Matheson