Domanda

Ho qualche codice che ascolto per "annunci" via UDP multicast. Posso ottenere l'indirizzo IP del mittente, ma quello che ha realmente bisogno è l'indirizzo MAC del mittente (dato che l'indirizzo IP può e cambierà).

C'è un modo semplice per fare questo in Python?

Un frammento di codice è incluso per riferimento, ma probabilmente non necessario.

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)

...

È stato utile?

Soluzione

Non è possibile, in generale, ottenere l'indirizzo MAC. Si potrebbe avere successo utilizzando ARP su una rete LAN, ma su Internet non è possibile.

Si consideri il caso in cui il pacchetto si riceve è l'indirizzo IP del natting router del mittente . Il pacchetto può aver attraversato un qualsiasi numero di macchine intermedie lungo il percorso, ciascuno dei quali ha indirizzi MAC, anche. Di chi la responsabilità dovrebbe essere quello di sostenere il tipo di lookup che stai dopo? Per tutte le macchine lungo la strada, l'indirizzo MAC del mittente è completamente inutile, così perché preoccuparsi sostenere quel tipo di ricerca?

E, a proposito, cambiare l'indirizzo MAC è banale su molte schede di rete, in modo da utilizzare come una sorta di ID univoco non è una saggia idea.

Altri suggerimenti

Il protocollo di cui hai bisogno è ARP . Controllare questo / rispondere per i dettagli

Non sono sicuro che sia possibile per ottenere l'indirizzo MAC del mittente in quanto l'indirizzo MAC è un indirizzo livello di collegamento e non un indirizzo di livello di rete come IP. L'indirizzo MAC cambia a ogni salto nella rete come il pacchetto contenente il messaggio UDP viene instradato dal mittente al destinatario.

Non so come farlo in Python, ma è possibile ottenere l'indirizzo MAC. Ad esempio utilizzando tcpdump ho messo tutti i pacchetti in un file:

sudo tcpdump -i enp0s31f6 -w file_name port 6665

poi in python leggerlo con:

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

è possibile visualizzare l'indirizzo MAC

modifica: Ho trovato un modo per farlo: fiutare tutti i pacchetti con Scapy con l'aiuto della funzione di annusare, quindi filtrare i pacchetti per ottenere solo quello che serve. Ci si può utilizzare l'indirizzo MAC per esempio dal mio progetto:

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top