☰
IP地址与MAC地址详解:从ip addr命令到ARP排障实战
2026/9/26 4:45:08 网站建设 项目流程

搞网络的人基本都绕不开三件事:IP协议、地址划分、MAC地址。再加一条ip addr命令,基本就是每天都要碰的东西。很多人一开始都搞不清IP地址和MAC地址的区别,一直到在模拟器里抓包看到ARP报文,才算真正想明白。这篇文章我就从这三个点展开:IP协议的地址划分逻辑、MAC地址的实际作用,以及Linux下ip addr命令的用法和排障思路。刚入行的网络工程师、运维同学,或者自己折腾虚拟机、嵌入式设备的朋友,都可以参考。

1. IP协议与MAC地址:一张网络里的两个“身份”

1.1 IP地址是逻辑定位,MAC地址是物理身份

先说IP协议。在TCP/IP协议栈里,IP协议属于网络层,它的核心任务是把数据包从源设备送到目的设备,不管中间经过多少路由器。IP地址就是网络层的“寻址标识”,类似于快递单上的“省市区街道门牌”。你在家访问一台服务器,源IP是你家出口地址,目的IP是服务器地址,这个地址在网络层不会因为经过多少个设备而改变,它会一直跟着数据包,直到对方收到。

而MAC地址工作在数据链路层,是网卡出厂时被烧录进去的物理标识,由48位十六进制组成,通常写成00:0c:29:3a:b1:62这种格式。前24位是厂商标识,后24位是网卡序列号。你可以把它理解成“身份证号”:无论你走到哪个城市,身份证号不变,但你的临时住址(IP)会变。很多朋友刚开始配置网络时,经常把这两个搞混,导致排错时一头雾水。记住一个简单原则:IP负责“在哪”,MAC负责“是谁”。

1.2 数据转发时IP和MAC如何配合

假设主机A(192.168.1.10)要访问主机B(192.168.1.20),两者在同一局域网。A在发送数据前,先要确定B的MAC地址。如果ARP缓存表里没有对应关系,就会向整个广播域发送一条ARP请求:“谁是192.168.1.20?请把你的MAC地址告诉我。”B收到后单播回复自己的MAC地址,A把目的MAC填入以太网帧头,这才把数据包发送出去。这个过程就是ARP协议在工作,也是我在GNS3里做实验时看得最清楚的一段。

如果主机A访问的是跨网段地址,比如外网的一个IP,A会发现自己和目的IP不在一个网段,于是把帧的目的MAC设置成默认网关的MAC,而不是最终目标服务器的MAC。数据包到达网关后,网关根据路由表选择下一跳,再改写源MAC和目的MAC,继续转发。所以你抓包时会看到:三层IP地址始终是源和目的的IP,但二层源MAC/目的MAC会随着每一跳不断变化。理解这一点,就能看懂“IP数据转发报文”过程中那些MAC地址跳来跳去的抓包结果。

1.3 为什么不能只用IP或只用MAC

我经常被问:既然IP和MAC都能标识设备,为什么不能只用一种?只靠MAC是做不到的,因为MAC地址没有层次,全球几十亿设备的MAC地址分布毫无规律,路由表根本没法聚合。就好比你给全国所有人寄快递,地址只写“身份证号”,没有省市分级,快递系统根本没法分拣。IP地址则是分层的,可以用前缀聚合,例如192.168.0.0/16代表一段连续的地址,这样路由条目大幅减少。

但只靠IP也不行,因为以太网等二层技术最终需要知道对端网卡的MAC地址,才能把帧从物理接口发出去。IP负责跨网络寻址,MAC负责局域网内最后一跳的精确投递,两者配合才构成了完整的TCP/IP转发模型。简单说:IP让数据包找到网段,MAC让数据包找到网卡。

2. 地址划分:从分类编址到CIDR,自己动手划子网

2.1 IPv4地址的基本结构

IPv4地址是32位二进制,为了方便记忆,分成四段点分十进制。早期为了管理方便,按首字节把地址划分成A到E五类:

类别首字节范围默认子网掩码用途
A1~126255.0.0.0 (/8)大型网络
B128~191255.255.0.0 (/16)中型网络
C192~223255.255.255.0 (/24)小型网络
D224~239无组播
E240~255无保留

其中A类里有127.0.0.0/8被留作回环地址,不参与正常路由。分类编址在早期网络规模不大时够用,但后来发现浪费严重:一个C类只有254个可用地址,一个大公司可能有多个C类,而B类又太大,很难分配。所以现在更常用的是CIDR(无类域间路由),也就是我们常说的“斜杠记法”。

2.2 子网掩码与可用主机数计算

子网掩码的二进制中,1表示网络位,0表示主机位。比如255.255.255.0,写成二进制后是24个1后面跟8个0,所以也叫/24。一个/24子网有2^8=256个地址,去掉网络地址和广播地址,可用主机数就是2^8-2=254。这里提醒一下:这254个地址里,通常还要去掉网关占用的一个,所以真正给终端用的可能是253个。

如果需要把192.168.1.0/24划分成4个子网,就要借2位主机位,变成/26。每个子网的地址数是2^(32-26)=64,可用主机数是64-2=62。但要注意,子网起始地址必须是64的倍数,所以这四个子网分别是192.168.1.0/26、192.168.1.64/26、192.168.1.128/26、192.168.1.192/26。这个“必须是倍数”的规则特别容易踩坑,我见过太多人把子网范围算错,导致广播地址落到主机可用范围里。

2.3 CIDR与地址规划实践

CIDR的写法就是“IP地址/前缀长度”,比如192.168.10.0/26。它的好处是让网络位不再被A/B/C类锁死,可以根据实际需求灵活划分。下面是一个小型办公网的规划示例:

部门预计终端数分配网段可用地址数
办公区100192.168.10.0/25126
生产区50192.168.10.128/2662
监控区30192.168.10.192/2730
预留10192.168.10.224/2730

这样规划的好处是每个部门都有自己的网络位,便于后续做路由隔离、访问控制,也方便排错。实际规划时,我习惯预留20%~30%的地址余量,别把子网卡得太死。比如一个部门实际只有80台设备,我至少给一个/25(126个可用地址),而不是刚好够用就行。否则后期想加几台打印机、几个无线AP都会很痛苦。

2.4 私有地址和保留地址

IANA规定了几段不会在公网路由的私有地址:10.0.0.0/8、172.16.0.0/12和192.168.0.0/16。你在家里的路由器、公司的局域网,绝大多数用的都是这些地址。GNS3模拟器里做实验,也建议直接用192.168.x.x,免得后期规划混乱。

除了私有地址,还要记住回环地址127.0.0.1代表本机,以及链路本地地址169.254.0.0/16。如果设备在DHCP拿不到地址时,会自动给自己分配一个169.254.x.x的地址。看到这个地址,基本可以断定DHCP出问题了,这本身就是一条很有用的排错线索。

3. ip addr命令:Linux里网络配置的“一把新钥匙”

3.1 为什么不用ifconfig了

老牌命令ifconfig来自net-tools,这个包已经很久不更新,功能上也跟不上现代内核的网络命名空间、VLAN、链路状态管理等需求。ip命令来自iproute2,是Linux网络管理的标准工具族,其中ip addr就是专门用来查看和配置IP地址的。在很多新版发行版里,连ifconfig都不预装了,装完系统后可能第一件事就是apt install iproute2或者yum install iproute。

如果你之前习惯了ifconfig,刚开始用ip addr可能觉得输出有点乱。但多看几遍就会发现信息非常完整,一个命令就能看到接口状态、MAC地址、IPv4和IPv6地址,不像ifconfig那样很多信息被截断。

3.2 看懂ip addr的输出

在Linux上随便敲一句ip addr,可能看到类似这样的输出:

$ ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default link/ether 00:0c:29:3a:b1:62 brd ff:ff:ff:ff:ff:ff inet 192.168.1.100/24 brd 192.168.1.255 scope global ens33 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe3a:b162/64 scope link valid_lft forever preferred_lft forever

lo是回环接口,ens33是物理网卡。其中link/ether后面的就是MAC地址,inet后面是IPv4地址和前缀长度,inet6是IPv6地址。state UP很关键,如果这里是DOWN,说明接口没有启用,可能是网线没插好、驱动没加载,或者管理员执行了ip link set down。我排查网络时,第一眼不看IP,而是看接口状态,状态不对,后面全是白搭。

3.3 常用操作:添加、删除、启用、禁用地址

ip addr不只是用来查看,配置操作也很常用。下面这几条是我平时用得最多的:

# 临时添加一个IP地址 sudo ip addr add 192.168.1.10/24 dev ens33 # 删除IP地址 sudo ip addr del 192.168.1.10/24 dev ens33 # 启用/禁用网卡 sudo ip link set ens33 up sudo ip link set ens33 down # 清空网卡上所有IP地址 sudo ip addr flush dev ens33 # 紧凑输出,只看接口名和地址 ip -br addr

注意,ip addr add这个操作只是临时生效,它不会写进任何配置文件。很多人配完地址后重启网络服务,发现地址丢了,就以为系统出问题,其实是因为没有做持久化配置。Ubuntu上要改Netplan的YAML文件,CentOS/RHEL要改ifcfg脚本,这个一定要记住。另外,一个网卡可以添加多个IP地址,ip addr add重复执行就行,这在做多网段测试时很有用。

3.4 在GNS3里验证IP转发与ARP

我们可以在GNS3里搭一个最简单的实验:两台路由器R1和R2,各接一台虚拟PC。给R1的f0/0配192.168.1.1/24,R2的f0/0配192.168.1.2/24,PC1配192.168.1.10/24。配置完,在PC1上ping 192.168.1.2。

这时如果开Wireshark抓包,你会先看到一条ARP广播请求,然后是R2的ARP应答,接着才是ICMP的echo request和reply。这个实验特别直观地展示了ARP和IP转发的关系。路由器的接口即使不手动指定MAC,也会自动生成一个以厂商OUI开头的MAC地址,这说明MAC地址到底是怎么在二层起作用的。

我自己的习惯是,在GNS3里每做完一个链路配置,都会在路由器上敲一句show ip interface brief,在Linux主机上敲ip -br addr,先确认所有接口状态是UP、IP地址正确,再去ping。这样可以把配置错误和物理链路问题分开。另外,GNS3里路由器接口默认是shutdown状态,配置完IP后一定记得no shutdown,这个坑无数人踩过。

4. MAC地址的实战细节:查询、修改与排障

4.1 不同设备上查询MAC地址的方法

很多场景都需要查MAC地址。Windows下用ipconfig /all,里面“物理地址”就是网卡MAC;或者用getmac /v能一次性列出所有网卡的MAC。Linux下最直接的是ip link show,也可以读文件cat /sys/class/net/eth0/address。

如果你是在调试Codesys连接的PLC网口,一般可以从PLC的设备信息页面看到MAC,或者用编程指令去读。工业设备往往会在外壳上印MAC地址,方便现场管理。顺带一提,查硬盘序列号:Windows用wmic diskdrive get serialnumber,Linux用lsblk -d -o name,serial。这类硬件标识和MAC一样,都是设备的“硬件指纹”,适合做资产盘点。如果你管理着一堆设备,建议把这些信息整理成表格,排错时能省很多时间。

4.2 ARP:IP地址到MAC地址的翻译官

ARP协议就是IP和MAC之间的翻译官。每一台设备都维护一张ARP缓存表,用arp -a(Windows/Linux)或ip neigh(Linux)可以查看。表项的内容大致是“哪个IP对应哪个MAC,在哪个接口上”。如果这张表错了,就会出现“ping IP能通但某些业务不通”“数据老往错误的地方发”等奇怪现象。

我曾经遇到一个问题:同一交换机下两台PC,IP一个配成.10,一个配成.10,结果交换机MAC地址表不断漂移,整个局域网间歇性丢包。后来用arping 192.168.1.10收到两个MAC的回复,才定位到IP冲突。所以排错时别只顾着ping,多看一眼ARP表,往往能找到线索。在GNS3里也可以用show arp查看路由器的ARP表,看看IP到MAC的映射是不是符合预期。

4.3 修改MAC地址的方法与注意事项

修改MAC地址在运维测试里偶尔会用到。Windows最简单的方式是网卡属性->高级->Network Address,填12位十六进制。Linux下可以用:

sudo ip link set dev eth0 down sudo ip link set dev eth0 address 00:11:22:33:44:55 sudo ip link set dev eth0 up

也可以用macchanger这类工具。但要注意,有些网卡驱动对MAC地址修改有限制,改完必须重启网卡才生效。某些网卡(比如RTL8125BG)的MAC地址烧在EEPROM里,需要专门的刷写工具才能改,操作有风险,一般不建议乱动。修改完MAC后,最好先ip link show确认一下是否真的生效,再验证网络连通性。

这里必须提醒一句:修改MAC地址只应使用在合规的设备测试、克隆、排障场景,别拿它去绕过网络准入认证或者冒用其他设备,后果可能很严重。像校园网、办公网的MAC绑定,如果不是管理员授权,不要去尝试破解。

4.4 共享主机、打印机与MAC地址的坑

热词里有一条很典型的案例:微软系统已经设置共享主机后,mac设置打印机后无法通信。这种情况多半出现在网络共享打印场景。Windows主机的共享设置了防火墙和权限控制,打印机如果通过MAC地址绑定了IP,或者交换机上做了MAC白名单,一旦设备换了网卡、改了MAC,就再也拿不到正确的IP,自然无法通信。

还有一个常见现象是“ping IP地址是通的,但无法访问共享”。IP能通说明二层三层没问题,问题大概率在四层以上,比如防火墙拦了445端口、共享服务未启动,或者只允许特定MAC访问。排查的顺序应该是:先ping网关,再ping目标IP,然后telnet目标端口,最后看ARP表和防火墙日志,一步步缩小范围。别一上来就怀疑网线,那样只会越搞越乱。

5. 常见问题与排查技巧实录

5.1 问题速查表

为了便于查阅,我整理了一张简单的速查表:

现象可能原因排查命令/动作
ping不通网关网卡down、IP掩码错、交换机阻塞ip link查看状态,ip addr检查掩码
能ping通IP但不能访问共享防火墙、共享服务、MAC白名单systemctl status smb,检查防火墙和ARP表
网卡显示169.254.x.xDHCP失败检查DHCP服务、网线连接,dhclient重新获取
频繁掉线、丢包IP地址冲突、MAC表漂移arping检测重复IP,看交换机的MAC地址表
ip addr命令不存在未安装iproute2用发行版包管理安装

这张表不是标准答案,但覆盖了我平时遇到的大部分场景。遇到问题时,先按表格里“可能原因”的顺序去排查,往往比东查一下西查一下更高效。尤其是“ping IP通但应用不通”这一类,很多人会卡在二层三层,忘了往上走。

5.2 实操心得与避坑

第一个坑是子网掩码算错。我刚开始做地址规划时,把一个需要60台设备的部门分成了/26,但没注意/26每个子网的起始地址必须是64的倍数,结果把广播地址写进了主机的可用范围,配置完成一堆设备上不了网。后来我习惯先用公式算好,再列一个网络范围表,把网络地址、可用范围、广播地址都写清楚,再动手配置。

第二个坑在GNS3里最常见:路由器接口配置IP后忘记no shutdown。你用ip addr看Linux主机没问题,但路由器接口是DOWN,ping自然不通。所以实验里一定先show ip interface brief,确认所有接口都是up。我当时排查了很久,因为show running-config里IP地址明明在,就是不通,最后才发现是接口被shutdown。

第三个坑是修改MAC地址后不生效。我在虚拟机里执行ip link set eth0 address,结果显示成功,但业务流量还是不通,后来才发现需要把网卡down再up,让驱动重新初始化。而且改完后交换机上的MAC地址表也不会立刻更新,最好再等一段时间或者主动清一下。如果修改后依然不通,先检查是不是网卡驱动不支持,再检查交换机端口上的MAC绑定。

5.3 后续还能怎么玩

如果你已经掌握了ip addr和地址划分,下一步可以结合Wireshark抓一个完整的TCP连接。从ARP请求开始,看到三次握手,再看到数据发送结束,整个TCP/IP的样子就立体起来了。GNS3里也可以多拉两台路由器,练习静态路由、OSPF,然后用ip route查看路由表,理解数据包是怎么逐跳转发的。

写到这里,我最大的体会就是:别把IP和MAC当成两个孤立的概念。排错的时候,先用ip addr确认自己这台机器的身份,再顺着ARP表和路由表一步一步看数据包怎么走,很多问题自然就暴露了。模拟器里多抓几次包,比死记理论强得多。希望这篇能帮你在“IP协议 地址划分&MAC地址作用&ip addr命令”这条路上少走一些弯路。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询