Python에서 멀티 캐스트 UDP 메시지 발신자의 MAC 주소를 찾으십니까?
-
19-09-2019 - |
문제
UDP 멀티 캐스트를 통해 "공지 사항"을 듣는 코드가 있습니다. 발신자의 IP 주소를 얻을 수 있지만 실제로 필요한 것은 발신자의 MAC 주소입니다 (IP 주소가 변경 될 수 있고 변경되므로).
파이썬 에서이 작업을 수행하는 쉬운 방법이 있습니까?
코드 스 니펫은 참조를 위해 포함되어 있지만 불필요 할 것입니다.
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 주소를 얻을 수 없습니다. LAN에서 ARP를 사용하여 성공할 수 있지만 인터넷을 통해 불가능합니다.
받는 패킷에 발신자의 IP 주소가있는 경우를 고려하십시오. 네이트 팅 라우터. 패킷은 그 과정에서 여러 가지 중간 기계를 가로 질러 MAC 주소를 가질 수 있습니다. 당신이 후에 조회를 지원하는 것은 누구의 책임이어야합니까? 길을 따라 모든 기계의 경우 발신자의 MAC 주소는 완전히 쓸모가 없으므로 왜 그런 종류의 조회를 지원 하는가?
그리고 btw, MAC 주소 변경 많은 네트워크 카드에서 사소한 것이므로, 어떤 종류의 고유 한 ID로 사용하는 것은 현명한 아이디어가 아닙니다.
다른 팁
Mac 주소가 IP와 같은 네트워크 레벨 주소가 아닌 링크 레벨 주소이기 때문에 발신자의 MAC 주소를 얻을 수 있는지 확실하지 않습니다. UDP 메시지가 포함 된 패킷이 발신자에서 수신기로 라우팅되므로 Mac 주소는 네트워크의 각 홉에서 변경됩니다.
파이썬에서 어떻게하는지 모르겠지만 Mac 주소를 얻을 수 있습니다. 예를 들어 tcpdump를 사용하면 모든 패킷을 파일에 넣습니다.
sudo tcpdump -i enp0s31f6 -w file_name port 6665
그런 다음 파이썬에서 다음과 같이 읽습니다.
packetlist = rdpcap("./file_name")
for pkt in packetlist:
print pkt.src, pkt.load
Mac 주소를 볼 수 있습니다
편집 :이 작업을 수행하는 한 가지 방법을 찾았습니다. 기능 스니핑의 도움으로 SCAPY로 모든 패키지를 스니핑 한 다음 패키지를 필터링하여 필요한 것만 얻습니다. 예를 들어 내 프로젝트에서 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