Linux网络编程- 开启混杂模式(PROMISC)的两种方式

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

  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()

你可能感兴趣的:(Linux,工程化C,linux,网络)