Нахождение MAC-адреса отправителя многоадресного UDP-сообщения в Python? - PullRequest
2 голосов
/ 12 ноября 2009

У меня есть код, который прослушивает «объявления» через многоадресную рассылку 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)

...

Ответы [ 4 ]

7 голосов
/ 12 ноября 2009

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

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

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

1 голос
/ 12 ноября 2009

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

1 голос
/ 12 ноября 2009

Нужный протокол: ARP . Проверьте это вопрос / ответ для деталей

0 голосов
/ 03 сентября 2017

Я не знаю, как это сделать в 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
...