Linux 网络:网卡 promiscuous 模式疑云

文章目录

  • 1. 前言
  • 2. 问题场景
  • 3. 问题定位和分析
  • 4. 参考资料

1. 前言

限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。

2. 问题场景

调试 Marvell 88E6320 时,发现 eth0 出人意料的进入了 promiscuous(混杂) 模式:

[ 5384.145131] device eth0 entered promiscuous mode

Marvell 88E6320eth0 对应 SoCcpsw MAC 芯片的连接拓扑结构如下:
在这里插入图片描述

系统网络设备配置如下:

# ifconfig
eth0      Link encap:Ethernet  HWaddr 60:B6:E1:6E:14:F8  
          inet6 addr: fe80::62b6:e1ff:fe6e:14f8/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:247 errors:0 dropped:0 overruns:0 frame:0
          TX packets:32 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:19440 (18.9 KiB)  TX bytes:2560 (2.5 KiB)
          Interrupt:47

lan3      Link encap:Ethernet  HWaddr 60:B6:E1:6E:14:F8  
          inet addr:192.168.3.5  Bcast:0.0.0.0  Mask:255.255.255.0
          inet6 addr: fe80::62b6:e1ff:fe6e:14f8/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:247 errors:0 dropped:0 overruns:0 frame:0
          TX packets:16 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:13018 (12.7 KiB)  TX bytes:1216 (1.1 KiB)

lan4      Link encap:Ethernet  HWaddr 62:B6:E1:6E:14:F8  
          inet addr:192.168.3.8  Bcast:0.0.0.0  Mask:255.255.255.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

3. 问题定位和分析

经过一番分析,最后发现,是由下列命令导致 eth0 进入 promiscuous(混杂) 模式:

ip link set dev lan4 address 62:b6:e1:6e:14:f8

这里有两个问题:

1. 操作的 lan4,为什么影响到了 eth0?
2. 不过是一条设置 MAC 的指令,怎么会导致进入 promiscuous(混杂)模式?

跟踪下指令 ip link set dev lan4 address 62:b6:e1:6e:14:f8 流程:

/* ip link 程序通过 netlink 来进行 MAC 设置 */

sys_sendmsg()
	...
	netlink_unicast()
		rtnetlink_rcv()
			netlink_rcv_skb()
				rtnetlink_rcv_msg()
					rtnl_newlink()
						do_setlink()
							dev_set_mac_address()
								// 触发 lan4 的 MAC 设置接口
								ops->ndo_set_mac_address(dev, sa) = dsa_slave_set_mac_address()

// 接上面流程
static int dsa_slave_set_mac_address(struct net_device *dev, void *a)
{
	// 这里回答了问题 1. 操作的 lan4,为什么影响到了 eth0?
	// @dev   : lan4
	// @master: eth0
	// 对 lan4 的操作反映到了 eth0
	struct net_device *master = dsa_slave_to_master(dev);

	...

	if (!ether_addr_equal(addr->sa_data, master->dev_addr)) {
		err = dev_uc_add(master, addr->sa_data);
		...
	}

	...
}

int dev_uc_add(struct net_device *dev, const unsigned char *addr)
{
	...
	// 增加一条 单播过滤(unicast filtering)地址 到 eth0
	err = __hw_addr_add(&dev->uc, addr, dev->addr_len,
			NETDEV_HW_ADDR_T_UNICAST);
	if (!err)
		__dev_set_rx_mode(dev);
	...
}

void __dev_set_rx_mode(struct net_device *dev)
{
	...
	
	if (!(dev->priv_flags & IFF_UNICAST_FLT)) { // 如果 eth0 不支持单播地址过滤
		// 如果 eth0 不支持单播地址过滤,通过将 eth0 设置为 promiscuous(混杂)
		// 变相的来支持 eth0 单播地址过滤。
		if (!netdev_uc_empty(dev) && !dev->uc_promisc) { // 场景下,触发这条执行路径
			__dev_set_promiscuity(dev, 1, false);
			dev->uc_promisc = true;
		}  else if (netdev_uc_empty(dev) && dev->uc_promisc) {
			__dev_set_promiscuity(dev, -1, false);
			dev->uc_promisc = false;
		}
	}

	// eth0 的 RX 模式 配置
	if (ops->ndo_set_rx_mode)
		ops->ndo_set_rx_mode(dev); // cpsw_ndo_set_rx_mode()
}

// 设置网卡 eth0 promiscuous(混杂)模式标记 IFF_PROMISC
static int __dev_set_promiscuity(struct net_device *dev, int inc, bool notify)
{
	...
	// 这里回答了问题 2. 不过是一条设置 MAC 的指令,怎么会导致进入 promiscuous(混杂)模式?
	dev->flags |= IFF_PROMISC;
	dev->promiscuity += inc;
	...
	if (dev->flags != old_flags) {
		// 对应内核日志:
		// [ 5384.145131] device eth0 entered promiscuous mode
		pr_info("device %s %s promiscuous mode\n",
			dev->name,
			dev->flags & IFF_PROMISC ? "entered" : "left");
		...

		dev_change_rx_flags(dev, IFF_PROMISC);
	}
	if (notify)
		__dev_notify_flags(dev, old_flags, IFF_PROMISC);
	...
}

// eth0 的 rx 模式配置
static void cpsw_ndo_set_rx_mode(struct net_device *ndev)
{
	...
	if (ndev->flags & IFF_PROMISC) {
		/* Enable promiscuous mode */
		cpsw_set_promiscious(ndev, true); // 将 eth0 设为 promiscuous(混杂)模式
		...
	}  else {
		...
	}
	...
}

到此,真相浮出水面,原来,交换芯片 port3 (lan3)port4 (lan4),要将数据转发给 eth0。从前面的信息看到,lan3eth0 公用了 MAC ,lan4 配置了一个不同于 eth0 的 MAC,然后将 lan4 的 MAC 添加到 eth0单播过滤(unicast filtering) MAC 列表,这样使得 eth0 除了可以接收 lan3 的数据外,也可以接收 lan4 的数据,同时由于 eth0 不支持 单播过滤(unicast filtering) 功能,所以只能将 eth0 配置为 promiscuous(混杂)模式来变相的达到目的。

4. 参考资料

[1] 4.5.3.1. Unicast Frame Filtering
[2] Layerscape Software Development Kit User Guide
[3] UG10081: Layerscape Linux Distribution POC User Guide

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/757806.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【吊打面试官系列-MyBatis面试题】MyBatis 与 Hibernate 有哪些不同?

大家好,我是锋哥。今天分享关于 【MyBatis 与 Hibernate 有哪些不同?】面试题,希望对大家有帮助; MyBatis 与 Hibernate 有哪些不同? 1、Mybatis 和 hibernate 不同,它不完全是一个 ORM 框架,因…

grpc学习golang版( 四、多服务示例 )

系列文章目录 第一章 grpc基本概念与安装 第二章 grpc入门示例 第三章 proto文件数据类型 第四章 多服务示例 第五章 多proto文件示例 第六章 服务器流式传输 第七章 客户端流式传输 第八章 双向流示例 文章目录 一、前言二、定义proto文件三、编写server服务端四、编写Client客…

盘点全球Top10大云计算平台最热门技能证书

小李哥花了一年半时间终于考下全球10大云的77张认证,今天盘点下各个云的热门证书,希望能帮到非CS专业转IT和刚刚入行云计算的小伙伴。 排名取自23年Yahoo云计算市场份额排名报告,我会从云平台、证书价格、证书热门程度做推荐。 1️⃣亚马逊云…

MathType7.6永久破解激活码注册码 包含安装包下载

MathType是一款强大的数学公式编辑器,它能够帮助用户轻松编辑各种复杂的数学公式和符号。无论是学生、教师还是科研人员,MathType都能提供专业、精确的数学公式编辑服务。 在学习和工作中,我们常常会遇到需要编写数学公式的情况。然而&#x…

Python 算法交易实验74 QTV200第二步(改): 数据清洗并写入Mongo

说明 之前第二步是打算进入Clickhouse的,实测下来有一些bug 可以看到有一些分钟数据重复了。简单分析原因: 1 起异步任务时,还是会有两个任务重复的问题,这个在同步情况下是不会出现的2 数据库没有upsert模式。clickhouse是最近…

除了重塑千行百业,生成式AI还能改善运动健康

飞速发展的生成式AI与大模型技术,不但正在重塑千行百业,而且还能有效改善人们的运动健康。 生成式AI技术应用的挑战 随着生活品质的不断提升,人们对于健康问题也越来越重视。作为一家以“AI重塑健康与美”为使命的AI数字健康解决方案提供商&a…

langchain学习总结

大模型开发遇到的问题及langchain框架学习 背景: 1、微场景间跳转问题,无法实现微场景随意穿插 2、大模型幻读(推荐不存在的产品、自己发挥) 3、知识库检索,语义匹配效果较差,匹配出的结果和客户表述的…

解决指南:如何应对错误代码 0x80070643

在使用Windows操作系统过程中,用户可能会遭遇各种错误代码,其中错误 0x80070643是比较常见的一种。这个错误通常在安装更新或某些软件时发生,尤其是在微软的Windows Defender或其他Microsoft安全产品以及.NET Framework更新过程中更为常见。本…

动画重定向——当给一个人物模型用别人物的动画时,会遇到人物与动画不匹配问题,怎么解决呢?

每日一句:实践出真知,试错方确信 目录 最开始我想的原因! 分析一下动画相关参数 Animator组件参数详解: 人物模型的导入设置参数: Skinned Mesh Renderer组件详解: Skinned Mesh Renderer工作原理 设置Skinned …

【吴恩达深度学习笔记系列】Logistic Regression 【理论】

Binary Classification: Logistic Regression: y ^ σ ( w T x b ) \hat{y}\sigma{(w^T xb)} y^​σ(wTxb) using sigmoid function σ 1 1 e − z \sigma \frac{1}{1e^{-z}} σ1e−z1​. 【torch.sigmoid(x)】 Sigmoid ( x ) 1 1 e − x \text{Sigmoid}(x)\frac{1}{…

nginx优势以及应用场景,编译安装和nginx

一. Nginx是什么? 1. Nginx概述 高性能、轻量级Web服务软件系统资源消耗低对HTTP并发连接的处理能力高单台物理服务器可支持30,000~50,000个并发请求Nginx(发音同 “engine x”)是一个高性能的反向代理和Web服务器软件&#xff0c…

【05】从0到1构建AI生成思维导图应用 -- 前端交互实现

【05】从0到1构建AI生成思维导图应用 – 前端交互实现 大家好!最近自己做了一个完全免费的AI生成思维导图的网站,支持下载,编辑和对接微信公众号,可以在这里体验:https://lt2mind.zeabur.app/ 上一章:http…

【C++】初识C++(一)

一.什么是C C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度 的抽象和建模时,C语言则不合适。为了解决软件危机, 20世纪80年代, 计算机界提出了OOP(object o…

Mathematica训练课(46)-- 一些常用的画图函数

在前面的课程中,我们已经梳理了Plot的画图用法,今天就详细梳理一下其他的画图函数用法; 1. 画一条直线 2. Circle(圆) 3. Disk(圆盘) 4. 画出一个矩形 5. 箭头

itext生成pdf文件demo示例

需求 在PDF文件中植入一些信息(pdf模版) 制作模版 可以看到下面红色箭头标注位置,这都是我们需要动态写入数据的表单域,可以使用wps等工具来制作 点击编辑表单,可以给对应空间添加表单域,表单域名称是ke…

ic基础|功耗篇04:门级低功耗技术

大家好,我是数字小熊饼干,一个练习时长两年半的IC打工人。我在两年前通过自学跨行社招加入了IC行业。现在我打算将这两年的工作经验和当初面试时最常问的一些问题进行总结,并通过汇总成文章的形式进行输出,相信无论你是在职的还是…

UE5材质之HLSL:深度

UE4/5的Custom节点:在VScode使用HLSL(新手入门用)_vscode写hlsl-CSDN博客 效果: 材质节点: 自定义节点代码: float3 rayStepViewDir*-1; float4 inputTexTexture2DSample(TexObject,TexObjectSampler,uv)…

AGPT•intelligence:带你领略全新量化交易的风采

随着金融科技的快速发展,量化交易已经成为了投资领域的热门话题。越来越多的投资者开始关注和使用量化交易软件来进行投资决策。在市场上有许多量化交易软件可供选择。 Delaek,是一位资深的金融科技专家,在 2020年成立一家专注于数字资产量化…

【第三方JSON库】org.json.simple用法初探—Java编程【Eclipse平台】【不使用项目管理工具】【不添加依赖解析】

本文将重点介绍,在不使用项目管理工具,不添加依赖解析情况下,【第三方库】JSON.simple库在Java编程的应用。 JSON.simple是一种由纯java开发的开源JSON库,包含在JSON.simple.jar中。它提供了一种简单的方式来处理JSON数据和以JSO…

计算机类主题会议推荐之——AIIIP 2024

【ACM出版 |IEEE&ACM院士、CCF杰出会员担任组委| 往届会后4个月检索 】 第三届人工智能与智能信息处理国际学术会议(AIIIP 2024) 2024 3rd International Conference on Artificial Intelligence and Intelligent Information Processing 中国-天…