有关网卡混杂模式

        网络课程设计,用pcaplib编个小sniffer, 怎么弄都只能捕捉到自己的包或是网关传送传给自己的包(事实上,期间仅有一次捕到过一个非本机包,不过被视为异常现象忽略了),不是说将网卡设置成混杂模式就行了吗?莫非设置不成功?百般不得解后,发信给pcaplib的mail list了,结果老外是这样说的:
In a switched LAN you will only see broadcasts and packets destined to the
address(es) that are advertised behind your switch port. The sollution is:
a) use the "monitor" port on your switch
b) use a hub rather than a switch
c) overflow the forwarding table of your switch to turn it into a hub
The first being the preferred option, of course.
        恍然,将网卡混杂模式并不截取网段上所有的数据包,它只是能截取所有路过这块网卡的数据包。“混杂模式能接收传输在网络上的每一个信息包”这种说法仅仅对于过去的hub式的局域网才成立。而对于现在广泛使用的交换式(switched)局域网,计算机的端口直接与交换机的端口相连,当然也通过交换机和同网段的其他计算机的端口相连,所以,它和共享式不同,只有在两个站点需要通信时,交换机才同时联通多个端口,平时是不联通的。而且,主机的数据包先是经过网关,如果是非广播的,将由交换机根据其上的目标地址是否已记录来决定包的走向。所以,不象共享式的,一般每个包都会经过所有同网段的主机,而仅仅是广播的或者目标地址为同网段的主机才会被截取。
       原因明白了,但是正如老外所说,要想监听网段所有的包,最好是在交换机上配置一个监听端口,该端口目标地址设为你的主机地址,那样将所有经过该交换机的包复制一份再转发给你。这违反了本程序只在本机上执行的原则了。
       照此推论,arp欺骗只是对arp协议进行欺骗。也就是说只能阻止你和新的ip地址进行通信,不能阻止你和已通信过,网关的mac地址已经被记录在DLC协议中的地址将进行通信,因为这时你没有用到arp协议了,只是用到ip协议。
      嗯,下一次再被别人给用p2p终结者限制式,试一试:<
### 网卡混杂模式的定义及工作原理 #### 定义 网卡混杂模式是一种网络接口的工作状态,在这种状态下,网卡能够接收所有经过它的数据流,而不考虑目标地址是否指向本机设备[^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、付费专栏及课程。

余额充值