2

Есть ли простой способ (в Linux) реализовать поиск хоста по MAC-адресу? В небольших локальных сетях легко использовать, например, arp-scan чтобы узнать IP-адрес какого-либо устройства.

Я обычно использую zeroconf/avahi или маршрутизаторы, предоставляющие DNS по именам хостов, но иногда я не могу полагаться на такие функции.

Так может ли какой-нибудь bash magic или небольшой инструмент получить систему, разрешающую имена хостов, кодирующие эти MAC-адреса, как, например, a3_af_32_44_68_c9.local , чтобы получить более надежный поиск хоста в небольших сетях?

2 ответа2

1

Я думаю, что вы столкнулись с тем, что я считаю серьезной ошибкой сервера isc-dhcp. Эта программа записывает адрес Ethernet каждого устройства, которое он когда-либо видел, и IP-адрес, который он назначил ему. Но он никогда не использует эту информацию, чтобы поддерживать одинаковые устройства на стабильных IP-адресах. Вместо этого он предполагает, что недостаточно IP-адресов, и преимущественно использует их повторно.

Единственный способ обойти это - заставить свой DHCP-сервер всегда назначать определенный IP-адрес каждому имеющемуся устройству. Таким образом, вы получаете лучшее из обоих миров ... всем назначается IP с dhcp, но этот IP никогда не меняется.


OTOH, если вы действительно хотите, чтобы IP-адрес был назначен определенному MAC-адресу, лучше всего обходиться без посторонней помощи, это сканировать подсеть. Если вы попытаетесь пропинговать каждый (локальный) IP-адрес, ваша таблица arp -a будет включать все MAC-адреса и назначенные им IP-адреса. Есть даже специальная команда для этого arp-scan --localnet которая забывает выполнять PING. ПРИМЕЧАНИЕ: это работает, даже если они игнорируют пакеты PING, потому что они не могут игнорировать запросы ARP, которые отправляются первыми.

С помощью извне вы можете выполнить поиск на DHCP-сервере, например, этот DHCP-клиент позволяет запрашивать любой MAC-адрес. Конечно, это будет выделять и побочный эффект.


Вот пример использования arp-scan.

set -e
grep -v 'mac.local #DYN' /etc/hosts > /etc/hosts.new

arp-scan --localnet -qg |
    grep ':..:..:..:..:' |
    sed -e 's/:/_/g' -e 's/$/.mac.local #DYN/' >> /etc/hosts.new

[ -s /etc/hosts.new ] && {
    cmp -s /etc/hosts.new /etc/hosts ||
    mv /etc/hosts.new /etc/hosts
}

Очевидно, это работает только для машин в одной подсети. Имя изменится, если будет заменена карта Ethernet или машина будет клонирована на новое оборудование. MAC-адреса можно изменить вручную с помощью команды ifconfig для таких задач, как «Клонирование MAC-адресов», которые могут требоваться модемами DSL или связыванием интерфейса или аналогичным образом.

1

Попробуйте использовать команду arp следующим образом:

arp -n | grep [set MAC address here] | awk '{print $1}'

Или используя ваш пример MAC-адрес, как это:

arp -n | grep a3.af.32.44.68.c9 | awk '{print $1}'
  • arp -n перечислит все устройства, о которых знает arp , с числовыми адресами без имен хостов или чего-либо еще.
  • grep будет просто использовать grep для фильтрации только тех элементов, которые соответствуют MAC-адресу, который вы хотите найти.
  • awk '{print $1}' просто вернет IP-адрес значения, возвращенного предшествующей ему комбинацией grep/awk .

В результате, если MAC-адрес совпадает, вы получите IP-адрес, подключенный к этому MAC-адресу.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .