以下两种方式都是用于开启混杂模式,但它们的工作方式略有不同。

  1. 使用ioctlIFF_PROMISC的方法

    • 这种方法直接操作网络接口,设置它为混杂模式。
    • 使用ioctl系统调用和网络接口配置请求SIOCGIFFLAGS(获取接口标志)和SIOCSIFFLAGS(设置接口标志)。
    • 当这种混杂模式被设置时,我们会看到接口的标志(例如,通过ifconfigip命令)中有PROMISC
    • 使用这种方法开启的混杂模式对所有应用程序都有效,因为它是在设备级别设置的。
  2. 使用setsockoptPACKET_MR_PROMISC的方法

    • 这种方法是在套接字级别设置混杂模式,仅针对特定的套接字。
    • 使用setsockopt系统调用,并使用PACKET_MR_PROMISC标志。
    • 使用这种方法设置混杂模式时,我们不会在接口的标志中看到PROMISC,因为它是在套接字级别设置的,不会改变设备的实际标志。
    • 它仅影响特定的套接字,不会影响其他应用程序或其他套接字。

联系
两者都使网络接口能够捕获所有经过的数据包,而不仅仅是发往接口的数据包。

区别

  • ioctl方法在设备级别设置混杂模式,而setsockopt方法在套接字级别设置。
  • 通过ioctl设置混杂模式时,接口的状态标志会显示PROMISC,而使用setsockopt则不会。

在开发抓包工具或网络监控应用程序时,通常选择哪种方法取决于具体需求。如果只是想要为特定的捕获会话设置混杂模式,而不影响系统上的其他应用程序,使用setsockopt更为合适。如果需要在设备级别更改接口的状态,并希望所有应用程序都能在混杂模式下看到数据包,那么使用ioctl方法可能更合适。


使用ioctlIFF_PROMISC的方法,可参考 Linux网络编程- struct ifreq & ioctl() 系统调用

使用setsockoptPACKET_MR_PROMISC的方法,可参考 Linux网络编程- struct packet_mreq & setsockopt()

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐