在 Python 中嗅探 L2 多播帧 (LLDP)

问题描述

我编写了一个简单的 Python 脚本,用于侦听来自我们直接连接的网络交换机的 LLDP 数据包(Ethertype 0x88cc)——以下在 Linux 下工作正常(是的,以 root 身份运行)但要求我将接口置于混杂模式以能够接收LLDP数据包:

s = socket.socket(socket.PF_PACKET,socket.soCK_RAW,socket.ntohs(0x0003))
s.setblocking(0)


while True:
  (r,w,x) = select.select([s],[],1.0)
  if s in r:
    (b,a) = s.recvfrom(4096)
    if len(b) > 14:
      if b[12:14] == b'\x88\xCC': # LLDP Ethertype
        process_lldp(b[14:])

虽然这有效,但我不认为将接口置于混杂模式是最佳方式,因为它告诉内核侦听所有帧,而不仅仅是它应该处理的帧 - LLDP 每 30 秒发送一次 L2 帧使用多播 MAC "01:80:c2:00:00:0e" - 如果没有混杂模式,我的脚本将不会显示 LLDP 数据包。

我相信 Python 我可以通过使用以下内容告诉它侦听 IP 多播:

r = struct.pack('4sl',socket.inet_aton('224.1.1.1'),socket.INADDR_ANY)
s.setsockopt(socket.IPPROTO_IP,socket.IP_ADD_MEMBERSHIP,r)

但是,LLDP 不是 IP,因此这种方法不会起作用(IP 多播使用以“01:00:5e”开头的 MAC,因此 LLDP MAC 不会映射到 IP 多播地址)- 是否有谁知道我如何告诉它在不使用混杂模式的情况下接收发往多播 MAC“01:80:c2:00:00:0e”的帧?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...