网卡混杂模式Promiscuous与linux上混杂模式的设置

 


1 网卡工作模式

(1) 广播模式(Broad Cast Model):它的物理地址(MAC)地址是 0Xffffff 的帧为广播帧,工作在广播模式的网卡接收广播帧。

(2) 多播传送(MultiCast Model):多播传送地址作为目的物理地址的帧可以被组内的其它主机同时接收,而组外主机却接收不到。但是,如果将网卡设置为多播传送模式,它可以接收所有的多播传送帧,而不论它是不是组内成员。

(3) 直接模式(Direct Model):工作在直接模式下的网卡只接收目地址是自己 Mac地址的帧。

(4) 混杂模式(Promiscuous Model):工作在混杂模式下的网卡接收所有的流过网卡的帧,信包捕获程序就是在这种模式下运行的。网卡的缺省工作模式包含广播模式和直接模式,即它只接收广播帧和发给自己的帧。如果采用混杂模式,一个站点的网卡将接受同一网络内所有站点所发送的数据包这样就可以到达对于网络信息监视捕获的目的。

 

2 混杂模式

混杂模式就是接收所有经过网卡的数据包,包括不是发给本机的包,即不验证MAC地址。普通模式下网卡只接收发给本机的包(包括广播包)传递给上层程序,其它的包一律丢弃。

一般来说,混杂模式不会影响网卡的正常工作,多在网络监听工具上使用。

以太网(Ethernet)具有共享介质的特征,信息是以明文的形式在网络上传输,当网络适配器设置为监听模式(混杂模式,Promiscuous)时,由于采用以太网广播信道争用的方式,使得监听系统与正常通信的网络能够并联连接,并可以捕获任何一个在同一冲突域上传输的数据包。IEEE802.3 标准的以太网采用的是持续 CSMA 的方式,正是由于以太网采用这种广播信道争用的方式,使得各个站点可以获得其他站点发送的数据。运用这一原理使信息捕获系统能够拦截的我们所要的信息,这是捕获数据包的物理基础。

以太网是一种总线型的网络,从逻辑上来看是由一条总线和多个连接在总线上的站点所组成各个站点采用上面提到的 CSMA/CD 协议进行信道的争用和共享。每个站点(这里特指计算机通过的接口卡)网卡来实现这种功能。网卡主要的工作是完成对于总线当前状态的探测,确定是否进行数据的传送,判断每个物理数据帧目的地是否为本站地址,如果不匹配,则说明不是发送到本站的而将它丢弃。如果是的话,接收该数据帧,进行物理数据帧的 CRC 校验,然后将数据帧提交给LLC 子层。

 

 

3 集线器与交换机环境下混杂模式

 

 

 

在集线器模式下,源主机“主机2”要向目标主机“主机3”发送数据,当数据到达集线器后,集线器会向除了源主机“主机2”本身之外的所有主机发送数据,即除了源主机“主机2”之外的所有主机都可以收到“主机2”所发的数据。目标主机“主机3”判断到该数据是给自己的,就进行处理;其余主机判断到所发的数据是给“主机3”的,而不是给自己的,就不进行处理。该模式下,硬件设计简单、速度快,并且对主机的开机(新主机加入)和关机(当前在线主机的离开)都具有很好的适应性,只要发送的时候,目标主机在线,就可以马上进入工作状态。但缺点是该模式对冲突的解决是非常麻烦的,例如,当“主机2”向某一台主机发送数据的期间,“主机4”也再向另一台主机发送数据,则二者的数据会出现冲突,这种冲突会导致二主机所发的数据全部出错。解决办法就是二者各“等”一会儿再重发,但再重发并不能避免产生新的冲突。这种现象在频繁数据交换的时候,冲突的现象非常明显,会大大减低网络带宽,现在这种模式已被交换机模式所代替。

在交换机模式下,源主机“主机2”要向目标主机“主机3”发送数据,当数据到达交换机后,交换机会分析目标主机“主机3”所在的端口,然后只向该端口发送数据,这样,其余主机就接不到由源主机“主机2”所发出来的。这样,使得别的主机就不需要处理不属于自己的数据,从而减少了负荷,而且如果此前“主机5”要向“主机1”发送数据时,就不会出现冲突。在该模式下,由于有效地减少了“冲突”的可能,所以整个带宽的利用率大大提高,并且各个主机也减少了处理不属于自己数据包的工作。但这样做也有一些缺点,比如新主机的加入和当前在线主机的离开,通常都需要交换机花费一定时间来判断新的变化。当前绝大多数以太网所使用的都是交换机模式。

通过上面的分析,不难看出,当前以交换机作为交换设备的网络中,即使是将某一个网卡设置成“混杂模式”,除非使用一些特殊技术,网卡本身一般是接不到不是发送给自身的数据,所接到的只是给本身IP的数据和广播数据,但这时RAW Socket可以监听所有的数据了。这点与“常规模式”不同。
 

 

 

4 linux下混杂模式设置

 

 

4.1 命令方式设置

(1) 命令

ifconfig eth1 promisc  设置混杂模式
ifconfig eth1 -promisc 取消混杂模式

 

 

执行结果如下

[root@localhost promisc]# ifconfig eth1
eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.233.137  netmask 255.255.255.0  broadcast 192.168.233.255
        inet6 fe80::20c:29ff:fe9b:52dd  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:9b:52:dd  txqueuelen 1000  (Ethernet)
        RX packets 8378  bytes 527632 (515.2 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 516  bytes 46184 (45.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@localhost promisc]# 
[root@localhost promisc]# 
[root@localhost promisc]# ifconfig eth1 promisc
[root@localhost promisc]# 
[root@localhost promisc]# ifconfig eth1
eth1: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST>  mtu 1500
        inet 192.168.233.137  netmask 255.255.255.0  broadcast 192.168.233.255
        inet6 fe80::20c:29ff:fe9b:52dd  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:9b:52:dd  txqueuelen 1000  (Ethernet)
        RX packets 8389  bytes 528352 (515.9 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 518  bytes 46364 (45.2 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@localhost promisc]# 
[root@localhost promisc]# 
[root@localhost promisc]# 
[root@localhost promisc]# ifconfig eth1 -promisc
[root@localhost promisc]# 
[root@localhost promisc]# 
[root@localhost promisc]# 
[root@localhost promisc]# ifconfig eth1
eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.233.137  netmask 255.255.255.0  broadcast 192.168.233.255
        inet6 fe80::20c:29ff:fe9b:52dd  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:9b:52:dd  txqueuelen 1000  (Ethernet)
        RX packets 8398  bytes 528892 (516.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 518  bytes 46364 (45.2 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@localhost promisc]# 
[root@localhost promisc]#

 

 

4.2 C语言编程方式设置

 

#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <linux/if_ether.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <string.h>

#define ETH_NAME    "eth1"

int do_promisc(void)
{

    int f, s;
    struct ifreq ifr;

    if ((f = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)))<0)
    {
        return -1;
    }
    strcpy(ifr.ifr_name, ETH_NAME);

    if ((s = ioctl(f, SIOCGIFFLAGS, &ifr))<0)
    {
        close(f);
        return-1;
    }

    if(ifr.ifr_flags & IFF_RUNNING)
    {
        printf("eth link up\n");
    }
    else
    {
        printf("eth link down\n");
    }

    ifr.ifr_flags |= IFF_PROMISC;
    if ((s = ioctl(f, SIOCSIFFLAGS, &ifr)) < 0)
    {
        return -1;
    }

    printf("Setting interface ::: %s ::: to promisc\n\n", ifr.ifr_name);
    return 0;
}

int check_nic(void)
{
    struct ifreq ifr;
    int skfd = socket(AF_INET, SOCK_DGRAM, 0);

    strcpy(ifr.ifr_name, ETH_NAME);
    if (ioctl(skfd, SIOCGIFFLAGS, &ifr) < 0)
    {
        close(skfd);
        return -1;
    }
    if(ifr.ifr_flags & IFF_RUNNING)
    {
        printf("link up\n");
        close(skfd);
        return 0; // 网卡已插上网线
    }
    else
    {
        printf("link down\n");
        close(skfd);
        return -1;
    }
}

int main(void)
{
    do_promisc();
    return 0;
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本文转自:

https://blog.youkuaiyun.com/bytxl/article/details/46862207

 

 

 

 

 

 

### 网卡混杂模式的定义及工作原理 #### 定义 网卡混杂模式是一种网络接口的工作状态,在这种状态下,网卡能够接收所有经过它的数据流,而不考虑目标地址是否指向本机设备[^1]。默认情况下,网卡仅接收发往本机的数据包(包括广播包),并丢弃其他无关数据包。然而,在混杂模式下,无论数据包的目标地址为何,只要该数据包通过了网卡所在的物理介质,都会被捕获并传递给上层协议栈。 #### 工作原理 在网络通信中,数据包通常携带源地址和目标地址信息。普通模式下的网卡只会对接收数据包的目标地址进行校验,只有当目标地址本地硬件地址匹配或者是一个广播地址时,才会将数据包交给操作系统进一步处理;其余情况会被直接丢弃[^2]。 而在混杂模式下,这一过滤行为被禁用,所有的数据包都将无差别地提交至主机的操作系统层面。具体来说: - **捕获机制**:一旦启用混杂模式网卡驱动程序会配置底层硬件以忽略目标地址检查逻辑,从而允许任何数据帧进入操作系统的缓冲区。 - **应用支持**:为了利用混杂模式的功能,应用程序需借助特定 API 或者低级套接字编程技术访问原始数据包。例如,Wireshark 这样的抓包工具正是依赖于此功能实现全面监控局域网流量的能力[^4]。 此外值得注意的是,尽管混杂模式提供了强大的数据分析能力,但它也可能带来性能开销以及隐私安全隐患。因此实际部署过程中应谨慎对待,并采取适当措施加以控制。 ```python import socket def enable_promiscuous_mode(interface_name='eth0'): sock = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(0x0003)) try: sock.bind((interface_name, 0)) # Bind to the specified interface. print(f"Promiscuous mode enabled on {interface_name}.") except Exception as e: print(f"Failed to enable promiscuous mode: {str(e)}") enable_promiscuous_mode() ``` 以上代码片段展示了如何通过 Python 使用 `socket` 模块开启指定网卡接口上的混杂模式。这里创建了一个 RAW 类型套接字绑定到选定网络适配器之上以便获取未经筛选的数据报文。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值