العثور على عنوان MAC الخاص بمرسل رسالة UDP متعددة النسخ المتعدد في بيثون؟

StackOverflow https://stackoverflow.com/questions/1722254

سؤال

لدي بعض التعليمات البرمجية التي تستمع إلى "الإعلانات" عبر UDP Multicast. يمكنني الحصول على عنوان 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. قد تنجح باستخدام ARP على شبكة LAN، ولكن عبر الإنترنت غير ممكن.

ضع في اعتبارك الحالة حيث الحزمة التي تتلقاها لها عنوان IP الخاص بالمرسل أهل جهاز التوجيه. قد اجتازت الحزمة أي عدد من الأجهزة الوسيطة على طول الطريق، لكل منها عناوين MAC أيضا. من المسؤولية التي يجب أن تدعم نوع البحث الذي تلت إليه؟ بالنسبة لجميع الأجهزة على طول الطريق، فإن عنوان MAC الخاص بالمرسل عديم الفائدة تماما، فلماذا تهتم بدعم هذا النوع من البحث؟

و راجع للشغل، تغيير عنوان MAC هو تافهة على العديد من بطاقات الشبكة، لذلك استخدامه لأن نوعا ما من المعرف الفريد ليس فكرة حكيمة.

نصائح أخرى

البروتوكول الذي تحتاجه هو arp.. وبعد افحص هذا جواب السؤال للتفاصيل

لست متأكدا من أنه من الممكن الحصول على عنوان MAC الخاص بالمرسل لأن عنوان MAC هو عنوان مستوى الارتباط وليس عنوان مستوى الشبكة مثل IP. سيتغير عنوان MAC في كل قفزة في الشبكة حيث يتم توجيه الحزمة التي تحتوي على رسالة UDP من المرسل إلى جهاز الاستقبال.

لا أعرف كيفية القيام بذلك في بيثون ولكن من الممكن الحصول على عنوان 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

تحرير: لقد وجدت طريقة واحدة للقيام بذلك: استنشاف جميع الحزم مع SCAIL مع مساعدة 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top