Linux 网络:网卡 promiscuous 模式疑云

news2024/12/30 7:25:26

文章目录

  • 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.coloradmin.cn/o/1865422.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux源码阅读笔记05-进程优先级与调度策略-实战分析

基础知识 Linux 内核当中有 3 种调度策略: SCHED_OTHER 分时调度策略;SCHED_FIFO 实时调度策略,先到先服务;SCHED_RR 实时调度策略,时间片轮转。 如果有相同优先级的实时进程(根据优先级计算的调度权值是…

centos上快速搭建zfile文件网站

什么是zfile? zfile文件网站是最方便快捷的在线目录展示程序,支持将本地文件、FTP、SFTP、S3、OneDrive 等存储在网站上展示并浏览! 本教程参考: https://docs.zfile.vip/install/os-linux复现 今天的搭建环境是centos7.9 第一…

vscode中的字符缩进问题

问题描述: 如图当一行代码中出现不同类型的字符时,使用tab缩只是插入了固定数量(默认4)的空格或制表符,仍然无法对齐。 解决方法: vscode找到设置,搜索fontFamily,对应输入框写入mon…

Linux下安装搜狗拼音不能显示中文?

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&…

这5款国内可用的宝藏AI视频工具,不允许有人还不知道!(建议收藏)

文章首发于公众号:X小鹿AI副业 大家好,我是程序员X小鹿,前互联网大厂程序员,自由职业2年,也一名 AIGC 爱好者,持续分享更多前沿的「AI 工具」和「AI副业玩法」,欢迎一起交流~ 前几天一位粉丝说给…

海外短剧系统:一扇窥探多元文化的奇妙之窗

随着全球化的推进,文化交流的壁垒逐渐消融,我们得以更加便捷地领略到世界各地的独特风情。在这一背景下,海外短剧系统应运而生,它如同一扇扇虚拟的窗户,将我们带入不同国家、不同民族、不同文化的世界,让我…

Navicat Premium Lite绿色免费版

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl Navicat Premium Lite概述 Navicat 最近推出了一款名为 Navicat Premium Lite 的免费数据库管理开发工具,专为入门级用户设计。这款工具虽然在功能上与 Navicat…

内网安全【4】SSH隧道技术

1.四大隧道协议 (1)SMB协议 判断:445端口是否开放 (2)ICMP协议 判断:ping命令能通说明使用icmp协议 (3)DNS协议 判断:nslookup www.baidu.com 属于UDP iodine工作原理是 ,通过TAP虚拟网卡,在服…

北方银行 - HDFS 现代化快速案例研究

故事很重要,客户故事是最好的。他们提供令人瞠目结舌的统计数据或克服巨大障碍的那些是获得最佳头条新闻的那些。它们也是最难发表的。我们知道,因为我们将与您分享一些我们正在孜孜不倦地努力出版的内容 - 但现在它们将保持匿名。话虽如此,如…

Java:从嵌入式到云时代的编程语言传奇

Java,自1995年面世以来,已成为全球最受欢迎的编程语言之一。起初,Sun Microsystems公司为了解决嵌入式设备编程的难题,开发了Oak语言,这便是Java的前身。随着互联网的兴起,Oak更名为Java,并迅速…

11.异常(java版)

异常的概念 在日常开发时 代码在程序运行过程中 难免会出现一些其奇奇怪怪的问题 有时通过代码很难去控制 比如:数据格式不对、网络不流畅、内存报警等 在Java中 将程序执行过程中发生的不正常行为称为异常 比如我们之前写代码时经常会遇到的: 1.算术…

tldraw白板组件

tldraw 是一个开源的白板组件&#xff0c;10行代码就可以将其接入到 React 项目中&#xff1a; import { Tldraw } from tldraw import tldraw/tldraw.cssexport default function App() {return (<div style{{ position: fixed, inset: 0 }}><Tldraw /></div&…

C#与工业自动化结合还有搞头吗?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「c#的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“666”之后私信回复“666”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;当然有搞头&#xff01;C#是一…

自动化软件运行手机脚本需要用上的源代码!

在现今这个科技高速发展的时代&#xff0c;自动化软件运行手机脚本已经成为许多开发者、测试人员乃至普通用户提高工作效率的利器。 通过编写和执行手机脚本&#xff0c;我们可以实现自动化测试、数据抓取、任务批量处理等多种功能&#xff0c;本文将分享五段用于不同场景的自…

【LLM】一分钟带你了解Agent工作流四范式

文章目录 1. 大模型直接生成-generation2. 大模型充当工具使用-tool3. 大模型执行思维链-Planning4. 多大模型Agent合作-multiagent collaboration 1. 大模型直接生成-generation 通过提示词&#xff0c;大模型直接生成想要的结果&#xff1a; 2. 大模型充当工具使用-tool …

如何寻找暴利产品并通过整合产品资源变现

互联网上很多人都喜欢做暴利产品&#xff0c;这是人之常情&#xff0c;赚钱嘛&#xff0c;谁不希望一次多赚点。 说到暴利产品&#xff0c;那就不得不提微商&#xff0c;微商运营的本质是基于代理商进行用户的裂变&#xff0c;也就是说代理商越多&#xff0c;自然也就收割越多&…

24年了 直播带货的未来如何?

32 个国家在取消电商&#xff0c; 那我国的电商呢&#xff0c;首先电商是不会被取缔的。直播电商会被严格的控制&#xff0c;比如有一家饼店&#xff0c;它线下的销售是 3000 万&#xff0c;线上抖音的销售是 5, 000 万。 这一类型小而精又专业的品牌企业&#xff0c;未来在抖…

Excel 将某个序列随机重排 N 次

A 列是个随机序列&#xff0c;B2 格是参数&#xff0c;表示重排的次数。 AB1ItemsReplicates2A23B4C5D 要求将 A 列重拍 N 次 D1Result2C3D4B5A6D7A8B9C 使用 SPL XLL&#xff0c;输入公式&#xff1a; spl("?2.conj(?1.sort(rand()))",A2:A5,B2)"整数.()…

在数字化转型中,数字孪生技术的作用和价值几何?

引言&#xff1a;随着全球化和市场竞争的加剧&#xff0c;企业需要通过数字化转型来提高生产效率、优化产品质量、降低成本&#xff0c;以增强自身竞争力。企业需要通过数字化转型更好地理解客户需求&#xff0c;提供个性化、定制化的产品和服务&#xff0c;从而满足客户的多样…

java对word文档预设参数填值并生成

目录 &#xff08;1&#xff09;定义word文档模板 &#xff08;2&#xff09;模板二次处理 处理模板图片&#xff0c;不涉及图片可以跳过 处理模板内容 &#xff08;3&#xff09;java对word模板填值 &#xff08;4&#xff09;Notepad的XML Tools插件安装 工作上要搞一个…