Linux网络编程- 开启混杂模式(PROMISC)的两种方式
在开发抓包工具或网络监控应用程序时,通常选择哪种方法取决于具体需求。如果只是想要为特定的捕获会话设置混杂模式,而不影响系统上的其他应用程序,使用。如果需要在设备级别更改接口的状态,并希望所有应用程序都能在混杂模式下看到数据包,那么使用。两者都使网络接口能够捕获所有经过的数据包,而不仅仅是发往接口的数据包。以下两种方式都是用于开启混杂模式,但它们的工作方式略有不同。
以下两种方式都是用于开启混杂模式,但它们的工作方式略有不同。
-
使用
ioctl和IFF_PROMISC的方法:- 这种方法直接操作网络接口,设置它为混杂模式。
- 使用
ioctl系统调用和网络接口配置请求SIOCGIFFLAGS(获取接口标志)和SIOCSIFFLAGS(设置接口标志)。 - 当这种混杂模式被设置时,我们会看到接口的标志(例如,通过
ifconfig或ip命令)中有PROMISC。 - 使用这种方法开启的混杂模式对所有应用程序都有效,因为它是在设备级别设置的。
-
使用
setsockopt和PACKET_MR_PROMISC的方法:- 这种方法是在套接字级别设置混杂模式,仅针对特定的套接字。
- 使用
setsockopt系统调用,并使用PACKET_MR_PROMISC标志。 - 使用这种方法设置混杂模式时,我们不会在接口的标志中看到
PROMISC,因为它是在套接字级别设置的,不会改变设备的实际标志。 - 它仅影响特定的套接字,不会影响其他应用程序或其他套接字。
联系:
两者都使网络接口能够捕获所有经过的数据包,而不仅仅是发往接口的数据包。
区别:
ioctl方法在设备级别设置混杂模式,而setsockopt方法在套接字级别设置。- 通过
ioctl设置混杂模式时,接口的状态标志会显示PROMISC,而使用setsockopt则不会。
在开发抓包工具或网络监控应用程序时,通常选择哪种方法取决于具体需求。如果只是想要为特定的捕获会话设置混杂模式,而不影响系统上的其他应用程序,使用setsockopt更为合适。如果需要在设备级别更改接口的状态,并希望所有应用程序都能在混杂模式下看到数据包,那么使用ioctl方法可能更合适。
使用ioctl和IFF_PROMISC的方法,可参考 Linux网络编程- struct ifreq & ioctl() 系统调用
使用setsockopt和PACKET_MR_PROMISC的方法,可参考 Linux网络编程- struct packet_mreq & setsockopt()
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)