2009-11-12 6 views
2

UDP 멀티 캐스트를 통해 "공지 사항"을 청취하는 코드가 있습니다. 보낸 사람의 IP 주소를 얻을 수 있지만 실제로 필요한 것은 보낸 사람의 MAC 주소입니다 (IP 주소는 변경 될 수 있기 때문에).파이썬에서 멀티 캐스트 UDP 메시지의 보낸 사람의 MAC 주소 찾기?

파이썬에서이 작업을 수행하는 쉬운 방법이 있습니까?

코드 스 니펫이 참조 용으로 포함되어 있지만 불필요한 것으로 간주됩니다.

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

그것은 scapy'의 L2 소켓'와 수 있어야한다 : 거기 당신은 내 프로젝트에서, 예를 들어 MAC 주소 을 사용할 수 있습니다 /doc/usage.html – Pierz

답변

7

일반적으로 mac 주소를 얻을 수 없습니다. LAN에서 ARP를 사용하여 성공할 수도 있지만 인터넷에서는 불가능합니다.

받은 패킷에 발신자의 NATting 라우터의 IP 주소가있는 경우를 고려해보십시오. 패킷은 도중에 중간 머신을 몇 개라도 통과 할 수 있으며, 각각은 MAC 주소를 가지고 있습니다. 어떤 종류의 조회를 지원해야합니까? 길을 따라가는 모든 기계에 대해 보낸 사람의 MAC 주소는 완전히 쓸모가 없습니다. 그래서 왜 그런 종류의 조회를 지원해야합니까?

그리고 btw, changing the mac address은 많은 네트워크 카드에서 사소한 것이므로 일종의 고유 한 ID로 사용하는 것은 현명한 아이디어가 아닙니다.

+0

원래 보낸 사람의 MAC을 얻지 않고 UDP 패킷을 전송하는 이더넷 패킷의 "원본 MAC"을 얻고 싶다고 가정 해보십시오. 표준 Linux 기능을 사용할 수 있습니까? 적어도이 정보는 Windows의 Wireshark에서 얻을 수 있습니다. –

1

당신이 필요로하는 프로토콜은 ARP입니다. 이 부분을 확인하십시오 question/answer

1

MAC 주소가 IP와 같은 네트워크 수준 주소가 아니고 링크 수준 주소이기 때문에 송신자의 MAC 주소를 가져올 수 있는지 잘 모르겠습니다. MAC 주소는 UDP 메시지가 포함 된 패킷이 발신자에서 수신자로 라우팅되므로 네트워크의 각 홉에서 변경됩니다.

0

저는 파이썬에서 어떻게하는지 모르지만 MAC 주소를 얻을 수 있습니다.

다음 파이썬에서 그것을 읽을
sudo tcpdump -i enp0s31f6 -w file_name port 6665 

:

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

당신이 볼 수

가 편집 MAC 주소 : 나는 한 가지 방법을 발견는 tcpdump를 사용하여 예를 들어 내가 파일에 모든 패킷을 넣어 이렇게하려면 : sciffy로 모든 패키지를 스 니프 기능 sniff로 검사 한 다음 패키지를 필터링하여 필요한 것만 가져옵니다. http://www.secdev.org/projects/scapy : 일부 작업이 필요할 수 있지만

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 
관련 문제