2009-11-12 4 views
2

J'ai du code qui écoute les "annonces" via la multidiffusion UDP. Je peux obtenir l'adresse IP de l'expéditeur, mais ce dont j'ai vraiment besoin, c'est l'adresse MAC de l'expéditeur (puisque l'adresse IP peut et va changer).Trouver l'adresse MAC de l'expéditeur d'un message UDP multidiffusion en Python?

est-il un moyen facile de le faire en Python?

Un extrait de code est inclus pour référence, mais probablement inutile.

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) 

...

+0

Il devrait être possible avec les 'prises L2 de scapy' mais peut nécessiter des travaux: http://www.secdev.org/projects/scapy /doc/usage.html – Pierz

Répondre

7

Vous ne pouvez pas, en général, obtenir l'adresse mac. Vous pouvez réussir à utiliser ARP sur un LAN, mais sur Internet ce n'est pas possible.

Considérer le cas où le paquet que vous recevez a l'adresse IP du routeur NATting de l'expéditeur. Le paquet peut avoir traversé n'importe quel nombre de machines intermédiaires en cours de route, chacune ayant aussi des adresses mac. À qui incombe la responsabilité de soutenir le genre de recherche que vous recherchez? Pour toutes les machines en cours de route, l'adresse MAC de l'expéditeur est complètement inutile, alors pourquoi s'embêter à supporter ce genre de recherche?

Et, btw, changing the mac address est trivial sur de nombreuses cartes réseau, donc l'utiliser comme une sorte d'ID unique n'est pas une bonne idée.

+0

Dites que je ne veux pas obtenir le MAC de l'expéditeur d'origine, mais le "Source MAC" du paquet Ethernet qui transporte le paquet UDP. Est-il possible d'utiliser des installations Linux standard? Au moins, je peux obtenir cette information dans Wireshark sur Windows. –

1

Le protocole dont vous avez besoin est ARP. Cochez cette question/answer pour plus de détails

1

Je ne suis pas sûr qu'il est possible d'obtenir l'adresse MAC de l'expéditeur puisque l'adresse MAC est une adresse de niveau lien et pas une adresse de niveau réseau comme IP. L'adresse MAC change à chaque saut dans le réseau lorsque le paquet contenant le message UDP est acheminé de l'expéditeur au destinataire.

0

Je ne sais pas comment le faire en python, mais il est possible d'obtenir l'adresse MAC. Par exemple en utilisant tcpdump je mets tous les paquets dans le fichier:

sudo tcpdump -i enp0s31f6 -w file_name port 6665 

puis en python lire avec:

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

vous pouvez voir l'adresse mac

modifier: J'ai trouvé un moyen Pour ce faire: sniff tous les paquets avec scapy à l'aide de la fonction sniff, puis filtrer les paquets pour obtenir seulement ce dont vous avez besoin. Là, vous pouvez utiliser l'adresse mac par exemple de mon projet:

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 
Questions connexes