ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

IP地址与MAC地址详解:从ip addr命令到ARP排障实战

IP地址与MAC地址详解:从ip addr命令到ARP排障实战 搞网络的人基本都绕不开三件事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如何配合假设主机A192.168.1.10要访问主机B192.168.1.20两者在同一局域网。A在发送数据前先要确定B的MAC地址。如果ARP缓存表里没有对应关系就会向整个广播域发送一条ARP请求“谁是192.168.1.20请把你的MAC地址告诉我。”B收到后单播回复自己的MAC地址A把目的MAC填入以太网帧头这才把数据包发送出去。这个过程就是ARP协议在工作也是我在GNS3里做实验时看得最清楚的一段。如果主机A访问的是跨网段地址比如外网的一个IPA会发现自己和目的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^8256个地址去掉网络地址和广播地址可用主机数就是2^8-2254。这里提醒一下这254个地址里通常还要去掉网关占用的一个所以真正给终端用的可能是253个。如果需要把192.168.1.0/24划分成4个子网就要借2位主机位变成/26。每个子网的地址数是2^(32-26)64可用主机数是64-262。但要注意子网起始地址必须是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台设备我至少给一个/25126个可用地址而不是刚好够用就行。否则后期想加几台打印机、几个无线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 foreverlo是回环接口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/24R2的f0/0配192.168.1.2/24PC1配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 serialnumberLinux用lsblk -d -o name,serial。这类硬件标识和MAC一样都是设备的“硬件指纹”适合做资产盘点。如果你管理着一堆设备建议把这些信息整理成表格排错时能省很多时间。4.2 ARPIP地址到MAC地址的翻译官ARP协议就是IP和MAC之间的翻译官。每一台设备都维护一张ARP缓存表用arp -aWindows/Linux或ip neighLinux可以查看。表项的内容大致是“哪个IP对应哪个MAC在哪个接口上”。如果这张表错了就会出现“ping IP能通但某些业务不通”“数据老往错误的地方发”等奇怪现象。我曾经遇到一个问题同一交换机下两台PCIP一个配成.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主机没问题但路由器接口是DOWNping自然不通。所以实验里一定先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命令”这条路上少走一些弯路。
返回列表