Поиск MAC-адреса отправителя многоадресного UDP-сообщения в Python?
-
19-09-2019 - |
Вопрос
У меня есть код, который прослушивает «объявления» через многоадресную рассылку 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