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 1500inet 192.168.233.137  netmask 255.255.255.0  broadcast 192.168.233.255inet6 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 0TX 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 1500inet 192.168.233.137  netmask 255.255.255.0  broadcast 192.168.233.255inet6 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 0TX 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 1500inet 192.168.233.137  netmask 255.255.255.0  broadcast 192.168.233.255inet6 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 0TX 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.csdn.net/bytxl/article/details/46862207

网卡混杂模式Promiscuous与linux上混杂模式的设置相关推荐

  1. linux上配置zabbix并设置企业微信,机器人以及自主告警

    linux上配置zabbix并设置企业微信,机器人以及自主告警 配置lamp 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 linux上配置zabbix并设置企业微信,机 ...

  2. boa linux arm修改网卡,Boa服务器在ARM+Linux上的移植

    Boa服务器在ARM+Linux上的移植 一.Boa服务器介绍 Boa是一种非常小巧的Web服务器,其可执行代码只有大约60KB左右. 作为一种单任务Web服务器,Boa只能依次完成用户的请求,而不会 ...

  3. Linux上安装ZooKeeper并设置开机启动(CentOS7+ZooKeeper3.4.10)

    1下载Zookeeper 2安装启动测试 2.1上载压缩文件并解压 2.2新建 zookeeper配置文件 2.3安装JDK 2.4启动zookeeper 2.5查看zookeeper的状态 3将Zo ...

  4. 教你如何在 Linux 上为 SSH 登录设置电子邮件提醒

    在本文中介绍如何在Linux系统上为ssh登录设置电子邮件提醒.以接收有关对root用户的未经授权或非法登录访问的警报. .bashrc文件是做什么的? .bashrc文件是一个脚本,每当以交互方式启 ...

  5. linux bash 变量_如何在Linux上的Bash中设置环境变量

    linux bash 变量 fatmawati achmad zaenuri/Shutterstock Fatmawati achmad zaenuri / Shutterstock There's ...

  6. linux单用户模式single=1,Linux 单用户模式single mode

    做为一个Linux谜?每天都渴望得到新的知识,同时每天也把Linux的各个部分翻来覆去的进行着探索,在这个过程难免会让Linux无法启动.在WIN98中有一个保护模式,可以以保护模式进入到WIN98 ...

  7. linux上的ftp怎么设置编码格式,linux ftp客户端的编码问题

    准备下载ftp上的文件,记得curl可以实现下载ftp的文件,然后尝试了, curl ftp://username:password@192.168.1.2/平台全量包/package0811.zip ...

  8. window上远程访问linux上的neo4j的设置

    1.在neo4j.conf文件中的 将dbms.connectors.default_listen_address=0.0.0.0前面的注释去掉即可 2.直接采用:linux主机的ip + :7474 ...

  9. Linux进入救援模式全盘修复,linux进入救援模式的方法

    什么情况下我们需要进入救援模式,当我们无法以超级用户登录到系统,同时GRUB也设置了密码,我们无法修改kernel参数以单用户模式修改超级用户的密码.无论什么原因导致以上无法进入系统的情况,这时候我们 ...

最新文章

  1. python怎么找资源_新手Python学习资源哪里找好呢 视频?
  2. java责任链模式做优惠_Java设计模式菜鸟系列(十八)责任链模式建模与实现
  3. Sublime Text shift+ctrl妙用、Sublime Text快捷组合键大全
  4. QTP中字符串替换函数
  5. 标准C函数库的使用方法
  6. 每日涉猎技术点存档(2019年02月)
  7. Java基础入门笔记-布尔类型变量
  8. 豆瓣 为什么不用php,豆瓣网友是不是都疯了?
  9. Android+Jquery Mobile学习系列(8)-保单/生日提醒功能
  10. 上传文件到数据库,然后下载文件
  11. JavaScript 中 2个等号(==)和 3个等号(===)之间的区别
  12. 兄弟连教育分享:用CSS实现鼠标悬停提示的方法
  13. IntelliJ IDEA使用技巧(七)——常用快捷键Mac篇
  14. 轻量级 js取色器 JSColor
  15. 3dmax如何快速查找丢失贴图,并根据贴图快速找到对应物体
  16. 数据预处理之数据清洗案例
  17. 腾讯股票接口API(4)——计算分时线平均值
  18. 【转】论文阅读理解 - Panoptic Segmentation 全景分割
  19. 万字干货 | 如何从0到1搭建一套会员体系
  20. EDA笔记(4)--语言要素

热门文章

  1. @急急急,为什么相同的代码,不同电脑运行结果不一样
  2. 浅谈web前端三大主流框架
  3. 【护眼色设置】Adobe Acrobat DC / Notepad++ 背景颜色设青苹果绿
  4. python安装 百度网盘-centos 安装百度云/百度网盘Python客户端
  5. 域名解析文件异常如何解决?
  6. 小白也能看懂的支付宝支付接口的对接详细步骤
  7. Linux的Bash——(五)数据流重导向
  8. springmvc的常用注解以及用法
  9. PHP源代码漏洞分析
  10. Android 13 截屏流程