混杂模式(Promiscuous Mode)是计算机网络中的术语。是指一台机器的网卡能够接收所有经过它的数据流,而不论其目的地址是否是它。一般计算机网卡都工作在非混杂模式下,此时网卡只接受来自网络端口的目的地址指向自己的数据。当网卡工作在混杂模式下时,网卡将来自接口的所有数据都捕获并交给相应的驱动程序。网卡的混杂模式一般在网络管理员分析网络数据作为网络故障诊断手段时用到,同时这个模式也被网络黑客利用来作为网络数据窃听的入口。在Liunx操作系统中设置网卡混杂模式,时需要管理员权限。在windows操作系统和Linux操作系统中都有使用混杂模式的抓包工具,比如著名的开源软件wireshark.
Linux下手动切换网卡(eth0)为(非)混杂模式。
默认为非混杂模式:
ifconfig eth0 -promisc
将eth0置为混杂(promiscuous):
ifconfig eth0 promisc
查看网卡是否混杂:
ifconfig eth0
输出若包含PROMISC则说明处于混杂模式。
例:eth0 Link encap:以太网 硬件地址 xx:xx:xx:xx:xx:xx
inet 地址:x.x.x.x 广播:x.x.x.x 掩码:x.x.x.x
UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 跃点数:1
…
注:
1. struct ifreq结构定义在/usr/include/net/if.h,用来配置ip地址,激活接口,配置MTU等接口信息的。ifreq包含在ifconf结构中。而ifconf结构通常是用来保存所有接口的信息的。
2. 使用tcmdump监视某个主机设备(端口), 并产生C代码, 并可使用setsockopt绑定filter :
$ sudo tcpdump -i wlan0 -dd port xxxx and host xxx.xxx.xxx.xxx
3. 以太网帧结构(42):Ethernet header(14)—>Dest Mac(6 bytes)[0-5], Source Mac[6-11]; IP header(20)—>[12-15]Dest IP(4 bytes), Source IP[16-19]; Tcp/Udp(8); Dest(2 bytes)/source port[20-21,22-23]
4. IP报文起始为0×45, 即版本(4 bit)与首部长度,占一个字节;
参考资料:
C语言编程来使网卡工作在混杂模式
ioctl和struct ifreq
Linux下Sniffer程序的实现
博主的博客很喜欢,支持一个了!同时祝各位网友龙年吉祥、平安!