MAC-адрес от IP через сеть - PullRequest
1 голос
/ 02 марта 2011

Надеюсь, у вас все хорошо.

Мне интересно, могли бы вы помочь мне или указать мне правильное направление. В настоящее время я работаю над проектом, который сосредоточен вокруг управления сетью. Из-за жестких временных ограничений, где это возможно, я использую код с открытым исходным кодом. Проблема, с которой я столкнулся, заключается в том, что часть проекта требует, чтобы я мог захватывать MAC-адреса всех устройств, подключенных к сети.

Мои знания в области сетевого программирования ограничены, так как я работал в других областях разработки программного обеспечения в течение последних 4 лет. Подход, который я выбрал, заключается в использовании nmap в качестве основы для получения IP-адреса и другой необходимой мне информации. MAC-адрес не входит в состав nmap out, и из того, что я прочитал, он выглядит немного странным. (я могу ошибаться).

Поэтому я попытался сделать это в два этапа, во-первых, я получаю данные, включая IP-адрес из Nmap, который работает нормально. Мой следующий шаг и проблема, с которой я сталкиваюсь, это пинг IP-адреса (из моей программы на Python), который работает. Но как я могу получить MAC-адрес от IP-адреса? Сначала я подумал пропинговать ip и взять MAC из ARP, но думаю, что это будет работать только в том случае, если IP-адрес находится в той же подсети. Чтобы усугубить проблему при развертывании, в сети может быть до 5000 компьютеров, которые необходимо зарегистрировать. Чтобы показать вам мой подход к Python ping, вот код:

import pdb, os
import subprocess
import re
from subprocess import Popen, PIPE

# This will only work within the netmask of the machine the program is running on cross router MACs will be lost
ip ="192.168.0.4"

#PING to place target into system's ARP cache 
process = subprocess.Popen(["ping", "-c","4", ip], stdout=subprocess.PIPE)
process.wait()

result = process.stdout.read()
print(result)

#MAC address from IP
pid = Popen(["arp", "-n", ip], stdout=PIPE)
s = pid.communicate()[0]

# [a-fA-F0-9] = find any character A-F, upper and lower case, as well as any number
# [a-fA-F0-9]{2} = find that twice in a row
# [a-fA-F0-9]{2}[:|\-] = followed by either a ?:? or a ?-? character (the backslash escapes the hyphen, since the  # hyphen itself is a valid metacharacter for that type of expression; this tells the regex to look for the hyphen character, and ignore its role as an operator in this piece of the expression)
# [a-fA-F0-9]{2}[:|\-]? = make that final ?:? or ?-? character optional; since the last pair of characters won't be followed by anything, and we want them to be included, too; that's a chunk of 2 or 3 characters, so far
# ([a-fA-F0-9]{2}[:|\-]?){6} = find this type of chunk 6 times in a row

mac = re.search(r"([a-fA-F0-9]{2}[:|\-]?){6}", s).groups()[0] #LINUX VERSION ARP
mac = re.search(r"(([a-f\d]{1,2}\:){5}[a-f\d]{1,2})", s).groups()[0] #MAC VERSION ARP
print(mac)

Я искал некоторую информацию, но то, что я нашел, кажется немного расплывчатым. Если вы знаете какие-либо идеи или направления исследований, которые могут мне помочь, я был бы очень рад

Приветствия

Chris

Ответы [ 3 ]

3 голосов
/ 02 марта 2011

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

Общая стратегия для приложений управления сетью состоит в том, чтобы запрашивать компьютеры, которые do имеют эту информацию, напримермаршрутизаторы и коммутаторы, соединяющие машины, используя SNMP .Маршрутизаторы имеют таблицы arp для подсетей, к которым они непосредственно подключены (поскольку они нуждаются в этом для выполнения своей работы), и эту информацию можно получить от маршрутизатора.* может помочь с поиском кода библиотеки Python, чтобы помочь в этом деле.

2 голосов
/ 02 марта 2011

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

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

0 голосов
/ 23 января 2019

Вы можете использовать модуль python scapy для получения MAC-адреса

from scapy.all import *
def get_mac(ip_address):
    responses,unanswered = srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=ip_address),timeout=2,retry=10)
# return the MAC address from a response
    for s,r in responses:
        return r[Ether].src
    return None

get_mac("192.168.31.14")
...