Поиск MAC-адреса отправителя многоадресного UDP-сообщения в Python?

StackOverflow https://stackoverflow.com/questions/1722254

Вопрос

У меня есть код, который прослушивает «объявления» через многоадресную рассылку UDP.Я могу получить IP-адрес отправителя, но что мне действительно нужно, так это MAC-адрес отправителя (поскольку IP-адрес может и будет меняться).

Есть ли простой способ сделать это в Python?

Фрагмент кода включен для справки, но, вероятно, не нужен.

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)

# Allow multiple sockets to use the same PORT number
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

# Bind to the port that we know will receive multicast data
sock.bind((self.interface, MCAST_PORT))

# Tell API we are a multicast socket
sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 255)

# Tell API we want to add ourselves to a multicast group
# The address for the multicast group is the third param

status = sock.setsockopt(socket.IPPROTO_IP, 
          socket.IP_ADD_MEMBERSHIP, 
          socket.inet_aton(MCAST_ADDR) + socket.inet_aton(self.interface));

data, addr = sock.recvfrom(1024)

...

Это было полезно?

Решение

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

Рассмотрим случай, когда полученный вами пакет имеет IP-адрес отправителя. NATтинг маршрутизатор.По пути пакет может пройти любое количество промежуточных компьютеров, каждая из которых также имеет MAC-адреса.Чья ответственность должна заключаться в поддержке того типа поиска, который вам нужен?Для всех машин на этом пути Mac-адрес отправителя совершенно бесполезен, так зачем вообще поддерживать такой поиск?

И, кстати, изменение Mac-адреса на многих сетевых картах тривиален, поэтому использовать его в качестве уникального идентификатора — неразумная идея.

Другие советы

Вам нужен протокол АРП.Проверь это вопрос ответ для подробностей

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

Я не знаю, как это сделать в Python, но получить MAC-адрес можно.Например, используя tcpdump, я помещаю все пакеты в файл:

sudo tcpdump -i enp0s31f6 -w file_name port 6665

затем в Python прочитайте его с помощью:

       packetlist = rdpcap("./file_name")
       for pkt in packetlist:  
       print pkt.src, pkt.load

ты можешь увидеть mac-адрес

редактировать:Я нашел один способ сделать это:обнюхивайте все пакеты с помощью scapy с помощью функции sniff, затем фильтруйте пакеты, чтобы получить только то, что вам нужно.Там вы можете использовать MAC -адрес, например, из моего проекта:

sniff(prn=self._pkt_callback, store=0)

def _pkt_callback(self, pkt):
    if not self.sniffer_on:
         return
    if Ether not in pkt or pkt[Ether].type != 0x800:
        return
    if pkt[IP].proto != 17: # 17 means UDP package
        return
    if pkt[UDP].dport != 6665:
        return

    print pkt.src, pkt.load    #src is mac address
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top