Peut-on cingler une carte réseau par MAC


28

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 puisse envoyer un paquet magique de réveil sur réseau plus tard (à partir d'une autre machine Debian) pour la réveiller. J'ai l'adresse MAC de la carte. Existe-t-il un moyen de cingler la carte Ethernet par MAC pour voir si elle est allumée?

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.

Réponses:


23

Vous pourriez avoir plus de chance d'utiliser l'outil à la arpingplace. L'outil pingfonctionne au niveau de la couche 3 du modèle OSI , tandis qu'il arpingfonctionne au niveau 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. L' autre version (celle de Thomas Habets) peut soi-disant interroger à l'aide 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)

arpingfonctionne de manière similaire à pingexcepté 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
    

3
arpingpeut prendre une adresse MAC comme paramètre:arping -c 5 38:e7:d8:63:5e:a6

@MichaelMrozek - Je l'ai fait après que quelqu'un ait essentiellement posté ma réponse en tant que commentaire et n'avait pas lu ce que j'avais dit à propos de 2 versions d'arping. L'autre réponse semble avoir été supprimée, alors merci d'avoir retiré mes frustrations audacieuses.
slm

Merci pour l'aide. Marquer ceci comme résolu. Nous n'avons pas pu trouver d'option WOL dans la configuration du BIOS. C'est ma supposition: le BIOS n'a pas activé WOL, mais le NIC l'a fait. La carte réseau se réveillait donc avec le premier paquet WOL et envoyait un message au BIOS. Mais comme il n'était pas activé dans le BIOS, le BIOS n'a rien fait. À partir de ce moment, la carte réseau a répondu au ping car elle était réveillée, mais pas la machine. Question rapide: est-il possible que le BIOS ait désactivé WOL et que la carte réseau l'ait activé en même temps?
Alastor Moody

1
@AlastorMoody - Je dirais que vous êtes probablement autorisé à désactiver le BIOS WOL avec le WOL du NIC activé. Cependant, si votre BIOS ne prend pas en charge WOL, je ne pense pas que vous pourrez l'utiliser, même si la carte réseau le fait. Voir l'article de wikipedia sur WOL: en.wikipedia.org/wiki/Wake-on-LAN . Dit la même chose que moi dans la section "Dépannage des paquets magiques".
slm

@niervol: arpingvers une adresse MAC: Oui, il existe deux implémentations de arping 1. depuis Linux iputils 2. arping par Thomas Habets . --- Seule la mise en œuvre 2. peut envoyer une requête ping à une adresse MAC, mais une telle requête ping est très délicate: la machine testée doit toujours avoir TCP / IP configuré (au moins une adresse IP) et elle doit être en mesure de répondre à une requête ping vers une adresse IP de diffusion.
pabouk

12

Vous ne pouvez pas exécuter de ping sur une carte réseau normale, car la carte réseau seule 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 ne laisser que la carte réseau partiellement sous tension pour recevoir des trames Ethernet et y rechercher la séquence de réveil magique, mais la carte réseau n'enverra toujours aucune réponse. Wake-on-LAN est strictement unidirectionnel. Aucune réponse n'a été envoyée.

Exceptions

Il existe certaines cartes réseau spéciales qui pourraient envoyer des réponses par elles-mêmes, comme par exemple celles qui implémentent un déchargement TCP complet .


1
+1 - c'est la seule réponse qui répond vraiment à la question du PO. "Wake-on-LAN est unidirectionnel".
Celada

5

La ether-wakecommande fonctionnera par adresse mac, donc vous (a) n'aurez pas besoin d'une adresse IP et (b) pourrez envoyer la commande sans danger (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 -anet en saisissant votre MAC pour 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!


Je ne veux pas réveiller la machine en ce moment. Mais je veux m'assurer que la carte réseau peut recevoir mes messages afin que lorsque je vais hors site et allume la machine via un paquet WOL, je sais qu'elle va s'allumer. C'est pourquoi je veux cingler par IP ou MAC et ne pas le réveiller.
Alastor Moody

2
Les machines à dormir ne répondent pas au ping. Si la machine est allumée et que vous exécutez une commande ping par IP (et que l'hôte réponde), elle mettra une entrée dans le cache arp. Si l'entrée y correspond à l'adresse MAC de l'hôte, il y a une chance raisonnable que cela fonctionne (à l'exception d'autres pare-feu réseau, routeurs et autres problèmes physiques qui peuvent empêcher le serveur ether-wakede l'atteindre). Je voudrais en fait avoir accès à un autre hôte sur place, mettre la machine cible en veille et tenter la ether-wake. De par la nature du fonctionnement de WOL, la demande devra de toute façon être envoyée sur le même sous-réseau que l'hôte
Drav Sloan

2
@DravSloan, le proxy Bonjour disponible par exemple sur Apples Time Capsule est un moyen assez ingénieux de gérer ce problème. La machine se met en veille mais le routeur répond pour cela, et ne le réveille que lorsque le proxy ne peut plus le gérer.
Thorbjørn Ravn Andersen

Ne comptez pas sur WOL sans l'avoir testé au préalable. Obtenez plutôt une carte IPMI dans ce cas.
sjas

0

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

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 chaîner 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

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.