ARP概述
今天是数通面试第五篇,让我们来深入理解一下ARP协议。
首先作用方面是根据已知对端ip地址,去询问对应的MAC地址 以便完成数据链路层必要的封装。
所以对ARP 大家没有明确的定性它是网络层协议或者数据链路层,大部分情况下我们会把他当做2.5层的协议看待(类似MPLS)。ARP虽然涉及到IP地址,但它主要是在为数据链路层提供必要的地址转换服务,所以通常被认为更贴近数据链路层(也有一些人会认为更贴近IP层)。
ARP的工作流程
比如一个简单的环境1.1访问1.2 ( 同网段ARP )
第一步
Host1查询自身的APR缓存表
arp -a / dispaly mac-address
- 如果有对应的ip和mac表项 则直接封装
- 如果没有 则发送arp来获取
第二步
Host1发送ARP Request来获取对端主机的地址
由于不知道其mac地址 , 因此ARP Request报文的目的MAC地址填写全0
交换机收到ARP Request后 因为该帧为广播数据帧(全F) , 所以进行泛洪操作
这里会出现一个很容易混淆的知识点 , 全0/全F?
ARP协议是封装在以太网之上的 , 所以在拆的过程中是先看到全F , 再看见ARP报文中的全0
第三步
所有收到该ARP Request报文的主机 , 都会去检查报文的目的IP和自身IP是否匹配(因为是泛洪出去的 )
-
不匹配的话主机执行丢弃报文操作
-
如果匹配将ARP报文中 请求端的IP/MAC 信息记录到自己的ARP缓存表中 , 并回复单播Reply报文告知Host1自身的MAC地址
注意不是直接回复 Reply , 先把Request主机相关信息收录进自身的ARP缓存表
第四步
Host1收到ARP Reply之后检查ARP报文中的目的地址是否为自己的IP
如果确认没问题 , 就会把这个Reply的内容记录到自己的ARP缓存表中 , 此时完成了双向缓存
如果是不同网段
不同网段的情况下 , 设备会主动判断目标ip和自身是否处于同一网段 , 如果发现不是 , 则会向网关发起ARP请求 , 这个操作通常会有缓存
ARP表项类型
-
动态ARP表项 , 通过arp报文自动生成维护的 , 但是会老化 , 会被新的arp表更新掉 , 且被静态arb表项覆盖 , 优先级比较低 , 失效的2种情况 ,到达老化时间/端口down
-
静态ARP表项 , 自己手动去配置维护的 , 适合场景为接口下设备长期固定 , 后续专门会写一篇二层以太网安全的 , 静态ARP表项就是其中重要的一个手段 , 不会老化和覆盖 , 避免了arp欺骗的场景 , 静态ARP分为2类
-
长静态ARP表项 , 可以直接用于报文转发,除了包括IP地址和MAC地址外,还需要包括该ARP表项所在VLAN和出接口。
配置一条长静态ARP表项,IP地址为192.168.1.1,对应的MAC地址为00e0-fc01-0000,此条ARP表项对应的出接口为属于VLAN 10的接口Ten-GigabitEthernet1/0/1
arp static 192.168.1.1 00e0-fc01-0000 10 ten-gigabitethernet 1/0/1 -
短静态ARP表项只包括IP地址和MAC地址。如果出接口是三层以太网接口,短静态ARP表项可以直接用于报文转发。如果出接口是VLAN接口,短静态ARP表项不能直接用于报文转发,需要对表项进行解析
简单了解即可 , 很少遇到 , 和长静态本质区别就是没有固定出接口或VLAN 只有IP和MAC
-
-
OpenFlow ARP表项 : OpenFlow ARP表项由OpenFlow添加,不会被老化,不能通过ARP报文更新。可以直接用于转发报文 , SDN相关内容
免费ARP
![image-20231209180814624](https://img-blog.csdnimg.cn/img_convert/de36739d6051ad1868d797953360009a.png)
来做个简单的实验 , 一个直连的链路 , 双方同时配置了IP地址为1.1.1.1 , 此时设备上会不断地提示IP地址冲突 ,
那么设备是怎么知道对端的地址和自己重复的?
特定设备型号在配置某个ip后会发送免费ARP来检测网段中有没有相同ip地址的设备 , 比如1.1.1.1 发送arp 询问1.1.1.1的mac , 如果有人回复则代表这个ip被使用 ,
抓包查看细节会发现免费ARP的典型特征就是 Sender ip == Target IP , 8b发送Request后a9立马做出了回复 , 此时报文就会注明duplicate , 也就是重复的意思 , 网络管理员如果没有及时修改这个问题 , 他俩之间就会重复触发重复确认 , 直到多次之后会有一方会做出主动修改 (特定版本设备)
在Windows场景下 , 如果发生设备的ip冲突 , 本质上也是通过免费ARP发现的 , 但是大部分系统版本会自动运行一个服务来防止冲突的情况 , 规则就是先到先得 , 比如A配置了1.1.1.1 , B再配置1.1.1.1 , WIN10环境不会报错 , 但是会在B确定之后自动把IP设置为169.254 , 也就是DHCP失败分配的地址
代理ARP
这个基本上算是ARP里面比较难理解的地方 , 首先遇到的就是一个场景/技术背景的问题 , 用比较官方的话来说 : **就是可以帮助同一网段、不同物理网络上的计算机之间实现通信。**只有深刻理解背景才能知晓这个技术的作用
什么是同一网段 ,不同物理网络 ?
同一网段指主机AB的网络 , 不同物理网络指被路由器分离广播域
先来看主机A和B , 2台设备都处于10.0.0.0 /8 这个网段中 , 这是一个很大的网段 , 所以当主机A尝试访问主机B的时候 , 在ARP层面会去询问10.2.0.1的MAC地址 , 又因为他们是同一网段 ,所以这个ARP会以广播的形式发送出去 , 既然是广播 , 那么中间的设备就会判断 , 这个问题就出在这台设备上 , 这个设备是一台路由器 , 路由器的每一个接口都是不同网段的 , 而且会隔绝广播报文 ,这样ARP请求就无法达到主机B . (注意分析A和G0/0/0 , B和G0/0/1, G0/0/1和G0/0/2的网段关系)
好 这里出现了一个很奇怪的现象 :
10.1.0.1/8 网络地址 10.0.0.0
10.1.0.2/16 网络地址 10.1.0.0 这么一看很明显因为掩码的关系 , 这2个IP地址不在同一个网段 , 为什么主机A可以访问G0/0/0?
这里要明确一个点 , 发送者是不知道对方的掩码的 , 对于主机A来说 , A只知道自己是/8的掩码 ,所以他在判断10.1.0.2这个地址的时候 , 也会使用/8的掩码判断 , 这样子大家都是10.0.0.0 在同一个网段 可以访问 ,
再来站在G0/0/0口的视角分析 , 他清楚自己是10.1.0.0 这个网段 , 他在分析10.1.0.1的时候 也会使用/16的掩码, 这样子大家还是处于10.1.0.0这个地址 还是可以访问 .
所以在现在的情况下 A和G0/0/0 , B和G0/0/1 是可以互通的 , 但唯独A不能直接访问B , 因为他们互相之间无法接收对端的ARP报文 不能得知对方的MAC地址 .
铺垫了这么多 , 来请出我们的ARP代理技术 , 命令及其简单 , 如果需要解决A访问B , 只需要再G0/0/0接口下配置
int g0/0/0
arp-proxy enable
如果此时去ping主机B 和G0/0/0 , 再ARP -a 查看A的ARP表项 , 你会惊奇的发现 2者的MAC地址相同
这里G0/0/0配置命令后会检查 , 主机A的ARP报文目的IP是否为自己路由可达 , 如果没问题 ,他会代替主机B回复自身接口的MAC , 这个流程就叫做ARP代理 , 对于主机A来说这个过程是无法感知的 , 所以ARP代理在某种程度上就是一种善意的ARP欺骗 , 目的就是为了越过某些网络设计上的缺陷 (正确的设计不应该出现AB主机同网段 , 且接到不同的路由器接口上 , 这样会导致ARP报文在封装对象不是网关 , 而是广播)
最后明确一个点 , 仅在G0/0/0上开启代理 , 主机B是无法主动访问主机A的 , 这个是基于接口生效的命令
那么为什么A访问B的ICMP可以回包呢 ?
这里本质的问题就是主动访问是需要封装目的MAC的 , 而回复ICMP报文 , 则不需要
其重要信息都可以在接收到的ICMP Request中获取 , 主机B只需要关心Request中的目的MAC和IP是不是自己 ,
然后反转Request报文中的源目IP/MAC , 既可封装ICMP Reply