数通面试 : ARP/免费ARP/代理ARP

ARP概述

今天是数通面试第五篇,让我们来深入理解一下ARP协议。

首先作用方面是根据已知对端ip地址,去询问对应的MAC地址 以便完成数据链路层必要的封装。

所以对ARP 大家没有明确的定性它是网络层协议或者数据链路层,大部分情况下我们会把他当做2.5层的协议看待(类似MPLS)。ARP虽然涉及到IP地址,但它主要是在为数据链路层提供必要的地址转换服务,所以通常被认为更贴近数据链路层(也有一些人会认为更贴近IP层)。


ARP的工作流程

image-20231207032221769

比如一个简单的环境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

image-20231207032701026

image-20231207032808171


第三步

所有收到该ARP Request报文的主机 , 都会去检查报文的目的IP和自身IP是否匹配(因为是泛洪出去的 )

  • 不匹配的话主机执行丢弃报文操作

  • 如果匹配将ARP报文中 请求端的IP/MAC 信息记录到自己的ARP缓存表中 , 并回复单播Reply报文告知Host1自身的MAC地址

    注意不是直接回复 Reply , 先把Request主机相关信息收录进自身的ARP缓存表

第四步

Host1收到ARP Reply之后检查ARP报文中的目的地址是否为自己的IP

如果确认没问题 , 就会把这个Reply的内容记录到自己的ARP缓存表中 , 此时完成了双向缓存

如果是不同网段

不同网段的情况下 , 设备会主动判断目标ip和自身是否处于同一网段 , 如果发现不是 , 则会向网关发起ARP请求 , 这个操作通常会有缓存


ARP表项类型

  1. 动态ARP表项 , 通过arp报文自动生成维护的 , 但是会老化 , 会被新的arp表更新掉 , 且被静态arb表项覆盖 , 优先级比较低 , 失效的2种情况 ,到达老化时间/端口down

  2. 静态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

      image-20231208022808548

    • 短静态ARP表项只包括IP地址和MAC地址。如果出接口是三层以太网接口,短静态ARP表项可以直接用于报文转发。如果出接口是VLAN接口,短静态ARP表项不能直接用于报文转发,需要对表项进行解析

      简单了解即可 , 很少遇到 , 和长静态本质区别就是没有固定出接口或VLAN 只有IP和MAC

  3. OpenFlow ARP表项 : OpenFlow ARP表项由OpenFlow添加,不会被老化,不能通过ARP报文更新。可以直接用于转发报文 , SDN相关内容


免费ARP

image-20231209180814624

来做个简单的实验 , 一个直连的链路 , 双方同时配置了IP地址为1.1.1.1 , 此时设备上会不断地提示IP地址冲突 ,

image-20231209182801860

那么设备是怎么知道对端的地址和自己重复的?

特定设备型号在配置某个ip后会发送免费ARP来检测网段中有没有相同ip地址的设备 , 比如1.1.1.1 发送arp 询问1.1.1.1的mac , 如果有人回复则代表这个ip被使用 ,

image-20231209183036260

抓包查看细节会发现免费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失败分配的地址

image-20231209183736042


代理ARP

这个基本上算是ARP里面比较难理解的地方 , 首先遇到的就是一个场景/技术背景的问题 , 用比较官方的话来说 : **就是可以帮助同一网段、不同物理网络上的计算机之间实现通信。**只有深刻理解背景才能知晓这个技术的作用

什么是同一网段 ,不同物理网络 ?

image-20231209184055418

同一网段指主机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这个地址 还是可以访问 .

image-20231209185401657

所以在现在的情况下 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地址相同

image-20231209191610318

这里G0/0/0配置命令后会检查 , 主机A的ARP报文目的IP是否为自己路由可达 , 如果没问题 ,他会代替主机B回复自身接口的MAC , 这个流程就叫做ARP代理 , 对于主机A来说这个过程是无法感知的 , 所以ARP代理在某种程度上就是一种善意的ARP欺骗 , 目的就是为了越过某些网络设计上的缺陷 (正确的设计不应该出现AB主机同网段 , 且接到不同的路由器接口上 , 这样会导致ARP报文在封装对象不是网关 , 而是广播)

最后明确一个点 , 仅在G0/0/0上开启代理 , 主机B是无法主动访问主机A的 , 这个是基于接口生效的命令

image-20231209192357315

那么为什么A访问B的ICMP可以回包呢 ?

这里本质的问题就是主动访问是需要封装目的MAC的 , 而回复ICMP报文 , 则不需要

其重要信息都可以在接收到的ICMP Request中获取 , 主机B只需要关心Request中的目的MAC和IP是不是自己 ,

然后反转Request报文中的源目IP/MAC , 既可封装ICMP Reply

  • 24
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孤单77

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值