Linux查看MAC地址常用命令汇总
时间:2025-10-07 08:21:31 424浏览 收藏
想知道Linux系统下如何查看和修改MAC地址吗?本文为你提供一份详尽的Linux查MAC地址命令大全,助你轻松掌握。文章将介绍如何通过`ip a`、`ifconfig`等命令以及直接读取`/sys/class/net/接口名/address`文件来查询网卡的MAC地址。同时,还会教你如何区分物理网卡与虚拟网卡,通过接口名、驱动信息及OUI特征进行辨别。更重要的是,本文还提供了临时和永久修改MAC地址的方法,包括使用`ip link set`命令以及配置NetworkManager、netplan或ifcfg文件。最后,文章还深入解析了MAC地址与IP地址的区别,以及它们如何通过ARP协议协同工作,实现局域网内的精确通信,是Linux网络管理不可或缺的知识点。
使用ip a、ifconfig或读取/sys/class/net/接口名/address可查MAC地址;通过接口名、驱动信息及OUI特征可区分物理与虚拟网卡;临时改MAC需ip link set down后修改再up,永久修改需配置网络管理工具如NetworkManager、netplan或ifcfg文件;MAC地址为数据链路层的物理标识,IP地址为网络层的逻辑地址,二者通过ARP协议协同实现局域网内精确通信。

在Linux系统里,想查网卡的MAC地址其实挺直接的,主要就是通过几个命令来搞定。最常用也最推荐的,是 ip a 或者 ip addr show,它能显示所有网络接口的详细信息,包括MAC地址。如果你的系统还保留着比较旧的网络工具,ifconfig 也能派上用场,虽然它在很多新发行版里已经被 ip 命令家族取代了。此外,你甚至可以直接从 /sys 文件系统里读取,这对于脚本自动化来说特别方便。
解决方案
要查看Linux系统中的MAC地址,我通常会根据习惯和系统版本选择不同的方法。
最现代、也最推荐的方式是使用 ip 命令。你只需要在终端输入:
ip a
或者更具体的:
ip addr show
执行后,你会看到类似这样的输出(我这里会简化一下):
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:1a:2b:3c:4d:5e brd ff:ff:ff:ff:ff:ff
inet 192.168.1.100/24 brd 192.168.1.255 scope global dynamic eth0
valid_lft 86337sec preferred_lft 86337sec在这里,eth0 是我的一个网络接口名,紧随其后的 link/ether 00:1a:2b:3c:4d:5e 就是它的MAC地址。lo 是环回接口,它的MAC地址通常都是全零,这很正常。
如果你是在一些较老的系统,或者习惯了老工具,ifconfig 依然可用:
ifconfig
输出会是这样(同样是简化版):
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.100 netmask 255.255.255.0 broadcast 192.168.1.255
ether 00:1a:2b:3c:4d:5e txqueuelen 1000 (Ethernet)
RX packets 12345 bytes 6789012 (6.7 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 54321 bytes 9876543 (9.8 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0ether 00:1a:2b:3c:4d:5e 这一行清楚地显示了MAC地址。不过,我个人更倾向于 ip a,因为它提供了更统一、更现代的接口管理方式,而且在许多新系统上 ifconfig 默认可能都没安装了。
还有一种方法,尤其适合在脚本里自动化获取某个特定网卡的MAC地址,那就是直接读取 /sys 文件系统:
cat /sys/class/net/eth0/address
将 eth0 替换成你想要查询的网卡接口名,比如 enp0s3 或 wlan0。这个路径下存放着网卡的大量信息,address 文件就直接存储着MAC地址。这种方式的好处是,它非常直接,没有额外的命令解析开销,但缺点是你得先知道网卡的接口名。

Linux下如何区分物理网卡与虚拟网卡的MAC地址?
区分物理网卡和虚拟网卡的MAC地址,在Linux系统里其实有些技巧,但并非总是一眼就能看出来。我通常会结合接口命名、驱动信息以及MAC地址本身的特性来判断。
首先,从命名上看,物理网卡通常会有比较规律的命名,比如老旧的 eth0、eth1,或者新的基于PCI总线位置的命名规则,像 enp0s3、ens33。无线网卡则可能是 wlan0。这些通常指向硬件设备。
虚拟网卡的名字就五花八门了,它们往往与创建它们的软件相关联。例如:
- 虚拟网桥 (Bridge):
br0、virbr0(KVM/QEMU默认创建的网桥)。这些网桥本身也有MAC地址,通常是随机生成的。 - Docker 相关的接口:
docker0(Docker的默认网桥),veth...(Docker容器内部和外部连接的虚拟以太网对)。 - VPN 隧道接口:
tun0、tap0(OpenVPN等创建的虚拟接口)。 - 虚拟机内部接口:
vnet0、vnet1(虚拟机内部的虚拟网卡,宿主机上可以看到其对应的虚拟接口)。
使用 ip a 命令时,除了MAC地址,还会显示接口的状态和类型。例如,virbr0 会显示 link/ether 后面跟着MAC,但它的 state 可能是 UP 或 DOWN,而且通常没有物理设备的 bus-info 信息。
更深入一点,你可以查看网卡的驱动信息。通过 ethtool -i 命令,你可以看到网卡所使用的驱动模块、版本等。物理网卡会有对应的硬件驱动(如 e1000、virtio_net),而虚拟接口可能显示 bridge、veth 等驱动,或者根本没有实际的硬件总线信息。
ethtool -i eth0
如果 eth0 是物理网卡,你可能会看到 driver: e1000 或 driver: virtio_net(对于虚拟化环境中的半虚拟化网卡)。而对于 docker0 这样的虚拟网桥,ethtool 可能显示 driver: bridge。
MAC地址本身也有一些特征。物理网卡的MAC地址通常由厂商分配,前三对十六进制数(OUI,Organizationally Unique Identifier)可以查询到对应的硬件厂商。虚拟网卡的MAC地址则常常是软件随机生成,或者遵循特定的虚拟化平台规则,比如VMware、VirtualBox、KVM等都有自己的一套OUI范围。虽然不是绝对,但如果一个MAC地址的OUI指向一个虚拟化软件厂商,那它很可能是虚拟网卡。
我个人在判断时,会先看接口名,再结合 ip a 的输出判断是否有IP地址、状态等,如果还不确定,就用 ethtool -i 看看驱动信息,基本就能八九不离十了。

如何临时或永久更改Linux网卡的MAC地址?
更改MAC地址,这在某些特定场景下确实很有用,比如网络测试、绕过一些基于MAC地址的认证,或者只是想隐藏真实的硬件MAC。在Linux里,无论是临时还是永久,都有办法实现。
临时更改MAC地址
临时更改MAC地址是最常见的操作,它在系统重启后就会失效,恢复到原始的MAC地址。这通常通过 ip link 命令来完成。
假设我想把 eth0 的MAC地址改成 00:11:22:33:44:55:
先关闭网卡接口:
sudo ip link set dev eth0 down
这一步是必要的,因为网卡在工作状态下通常不允许直接修改MAC地址。
设置新的MAC地址:
sudo ip link set dev eth0 address 00:11:22:33:44:55
重新启用网卡接口:
sudo ip link set dev eth0 up
现在,你再用 ip a 命令查看 eth0,就会发现它的MAC地址已经变成了 00:11:22:33:44:55。这种方法简单快捷,但正如我说的,重启后就会恢复原样。
永久更改MAC地址
要永久更改MAC地址,就需要修改网络配置文件了。不同的Linux发行版和网络管理工具,配置文件的位置和格式会有所不同。
对于使用 systemd-networkd 或 NetworkManager 的系统 (如Ubuntu、CentOS 8/Stream、Fedora):
NetworkManager (常见于桌面环境和服务器): 可以使用
nmcli命令或者直接编辑NetworkManager的配置文件。 使用nmcli:sudo nmcli connection modify eth0 mac-address 00:11:22:33:44:55 sudo nmcli connection up eth0
或者,编辑
/etc/NetworkManager/system-connections/目录下对应的连接配置文件(例如eth0.nmconnection)。在[ethernet]部分添加或修改mac-address=字段。[ethernet] mac-address=00:11:22:33:44:55
然后重启NetworkManager服务或重新激活连接。
netplan (Ubuntu 18.04+ 推荐): 编辑
/etc/netplan/*.yaml文件。找到你对应的网卡配置部分,添加macaddress字段。network: ethernets: eth0: dhcp4: true macaddress: 00:11:22:33:44:55 version: 2保存后,应用配置:
sudo netplan apply
对于使用 ifcfg 文件的系统 (如CentOS 7、RHEL 7):
编辑 /etc/sysconfig/network-scripts/ifcfg-eth0 文件(将 eth0 替换为你的网卡接口名)。
添加或修改 MACADDR 字段:
TYPE=Ethernet BOOTPROTO=dhcp DEFROUTE=yes PEERDNS=yes PEERROUTES=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_PEERDNS=yes IPV6_PEERROUTES=yes IPV6_FAILURE_FATAL=no NAME=eth0 UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx DEVICE=eth0 ONBOOT=yes MACADDR=00:11:22:33:44:55 # 添加或修改这一行
保存文件后,重启网络服务或者重启系统。
sudo systemctl restart network
需要注意的是,更改MAC地址可能会带来一些网络问题,比如在某些交换机上,如果新的MAC地址与网络中已知的MAC地址冲突,或者与交换机的端口安全策略不符,可能会导致网络不通。另外,一些ISP会绑定MAC地址进行认证,更改后可能需要重新注册。所以,在生产环境中操作时,务必谨慎。

Linux中MAC地址与IP地址有什么不同,它们如何协同工作?
MAC地址和IP地址是网络通信中两个非常基础且关键的概念,它们虽然都用于标识网络设备,但工作在不同的网络层次,扮演着不同的角色。我把它们理解为“物理门牌号”和“逻辑邮政地址”。
MAC地址 (Media Access Control Address)
- 性质: MAC地址是物理地址,通常由网络接口卡 (NIC) 制造商在生产时烧录到硬件中,是全球唯一的。它是一个48位的二进制数,通常表示为6组十六进制数,例如
00:1A:2B:3C:4D:5E。 - 作用: MAC地址工作在OSI模型的第二层,即数据链路层。它主要用于在同一个局域网 (LAN) 内识别和定位设备。当数据帧在局域网内传输时,交换机就是根据MAC地址来决定将数据帧转发到哪个端口。
- 特点: MAC地址是“扁平”的,没有层级结构,不能直接用于跨网络的路由。它更像是设备的“身份证号”。
IP地址 (Internet Protocol Address)
- 性质: IP地址是逻辑地址,由网络管理员或DHCP服务器分配。它是一个32位(IPv4,如
192.168.1.100)或128位(IPv6,如2001:0db8::1)的二进制数,具有层级结构。 - 作用: IP地址工作在OSI模型的第三层,即网络层。它主要用于在不同网络之间(广域网,WAN)识别和路由数据包。路由器就是根据IP地址来决定将数据包转发到哪个网络。
- 特点: IP地址是“分层”的,包含网络部分和主机部分,可以用于跨网络的寻址和路由。它更像是设备的“邮政地址”,指明了数据包应该去往哪个“城市”和“街道”。
它们如何协同工作?
MAC地址和IP地址的协同工作,主要依赖于地址解析协议 (ARP - Address Resolution Protocol)。我喜欢把这个过程想象成一个快递员(数据包)在送货。
跨网络通信 (IP地址主导): 当一台计算机(比如A)想给另一台不同网络中的计算机(比如B)发送数据时,它首先知道B的IP地址。数据包会封装上B的IP地址作为目标地址。A会将数据包发送给它的默认网关(路由器)。路由器会根据目标IP地址,决定将数据包路由到哪个下一个网络。这个过程会重复多次,直到数据包到达B所在的局域网。
局域网内通信 (MAC地址主导,ARP辅助): 当数据包到达B所在的局域网后,路由器或发送方(如果A和B在同一局域网)需要知道B的MAC地址,才能将数据包精确地交付给B。这时候,ARP就登场了。
- 发送方(或者路由器)会向局域网广播一个ARP请求,询问“谁是IP地址为
XXX.XXX.XXX.XXX的设备?请告诉我你的MAC地址!” - 局域网中IP地址为
XXX.XXX.XXX.XXX的设备(也就是B)收到ARP请求后,会回复一个ARP响应,告诉发送方“我是XXX.XXX.XXX.XXX,我的MAC地址是YY:YY:YY:YY:YY:YY。” - 发送方收到ARP响应后,就会将这个IP地址和MAC地址的映射关系存储在自己的ARP缓存中,以便后续快速查找。
- 然后,发送方就可以构建一个数据帧,将数据包封装在其中,并使用目标MAC地址
YY:YY:YY:YY:YY:YY,通过局域网的交换机直接发送给B。
- 发送方(或者路由器)会向局域网广播一个ARP请求,询问“谁是IP地址为
简单来说,IP地址负责将数据包从一个网络送到另一个网络,而MAC地址则负责在最终的局域网内,将数据包精确地投递到目标设备。它们就像是层层包裹的信件,IP地址是信封上的收件人地址,而MAC地址则是信件到达邮局后,邮递员根据具体门牌号进行最终投递的依据。没有其中任何一个,网络通信都无法顺利进行。
文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《Linux查看MAC地址常用命令汇总》文章吧,也可关注golang学习网公众号了解相关技术文章。
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
162 收藏
-
463 收藏
-
258 收藏
-
468 收藏
-
198 收藏
-
172 收藏
-
144 收藏
-
417 收藏
-
492 收藏
-
142 收藏
-
441 收藏
-
184 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习