以下两种方式都是用于开启混杂模式,但它们的工作方式略有不同。
-
使用
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()