admin 管理员组文章数量: 887006
注:本文为陈鑫杰《图解 ARP 协议》系列的合集。作者行文生动有趣。
图解 ARP 协议(一)ARP 原理
陈鑫杰 拼客院长陈鑫杰 2017 年 08 月 25 日 07:07
一、ARP 概述
如果要在 TCP/IP 协议栈中选择一个**“最不安全的协议”**,那么我会毫不犹豫把票投给 ARP 协议。我们经常听到的这些术语,包括 “网络扫描”、“内网渗透”、“中间人拦截”、“局域网流控”、“流量欺骗”,基本都跟 ARP 脱不了干系。大量的安全工具,例如大名鼎鼎的 Cain、功能完备的 Ettercap、操作傻瓜式的 P2P 终结者,底层都要基于 ARP 实现。
听上去这么 “逆天” 的协议,其实技术原理又简单的难以置信,例如 ARP 整个完整交互过程仅需要两个包,一问一答即可搞定!但是 ARP 协议也有它令初学者迷惑的地方,例如由它本身延伸出来的 “代理 ARP”、“免费 ARP”、“翻转 ARP”、“逆向 ARP”,而这些不同种类的 ARP,又应用于不同的场景。好吧,在深入到技术原理之前,作为初学者,我们先记住下面三句话:
① ARP(Address Resolution Protocol)即地址解析协议, 用于实现从 IP 地址到 MAC 地址的映射,即询问目标 IP 对应的 MAC 地址。
② 在网络通信中,主机和主机通信的数据包需要依据 OSI 模型从上到下进行数据封装,当数据封装完整后,再向外发出。所以在局域网的通信中,不仅需要源目 IP 地址的封装,也需要源目 MAC 的封装。
③ 一般情况下,上层应用程序更多关心 IP 地址而不关心 MAC 地址,所以需要通过 ARP 协议来获知目的主机的 MAC 地址,完成数据封装。
接下来,我们通过图解的方式来深入了解 ARP 协议是如何工作的。
二、ARP 原理之请求应答
同一个局域网里面,当 PC1 需要跟 PC2 进行通信时,此时 PC1 是如何处理的?
根据 OSI 数据封装顺序,发送方会自顶向下(从应用层到物理层)封装数据,然后发送出去,这里以 PC1 ping PC2 的过程举例 ==>
PC1 封装数据并且对外发送数据时,上图中出现了 “failed”,即数据封装失败了,为什么?
我们给 PC1 指令 -“ping ip2”,这就告知了目的 IP,此时 PC1 便有了通信需要的源目 IP 地址,但是 PC1 仍然没有通信需要的目的 MAC 地址。这就好比我们要寄一个快递,如果在快递单上仅仅写了收件人的姓名(IP),却没有写收件人的地址(MAC),那么这个快递就没法寄出,因为信息不完整。
那么,现在 PC1 已经有了 PC2 的 IP 地址信息,如何获取到 PC2 的 MAC 地址呢?此时,ARP 协议就派上用场了。我们接着上面这张图,继续 ==>
通过第三和第四步骤,我们看到 PC1 和 PC2 进行了一次 ARP 请求和回复过程,通过这个交互工程,PC1 便具备了 PC2 的 MAC 地址信息。
接下来 PC1 会怎么做呢?在真正进行通信之前,PC1 还会将 PC2 的 MAC 信息放入本地的【ARP 缓存表】,表里面放置了 IP 和 MAC 地址的映射信息,例如 IP2<->MAC2。接下来,PC1 再次进行数据封装,正式进入 PING 通信,如下 ==>
小结:经过上面 6 个步骤的处理,PC1 终于把数据包发送出去了,之后便可以进行正常的通信了。看到了吧,ARP 的功能和实现过程是如此的简单:它在发送方需要目标 MAC 地址的时及时出手,通过 “一问一答” 的方式获取到特定 IP 对应的 MAC 地址,然后存储到本地【ARP 缓存表】,后续需要的话,就到这里查找。
既然是 “缓存” 表,意味着它有时效性,并且如果电脑或者通信设备重启的话,这张表就会清空;也就是说,如果下次需要通信,又需要进行 ARP 请求。在我们的 windows/macos 系统下,可以通过命令行 “arp -a” 查看具体信息 =>
三、ARP 原理之广播请求单播回应
上面的图解过程看上去简单又纯粹,好像我们就已经把这个协议的精髓全部 get 到,但其实,我们只是刚揭开了它的面纱,接下来我们才真正进入正题。例如,上面的图解过程中,整个局域网(LAN)只有 PC1 和 PC2 两个主机,所以这个一问一答过程非常的顺畅。
而实际网络中,这个 LAN 可能有几十上百的主机,那么请问,PC1 如何将这个【ARP 请求包】顺利的交给 PC2,而 PC2 又如何顺利的把【ARP 回应包】返回给 PC1? 我们看下面的图:
为了营造出 “几十上百” 的效果,这里多添加了 2 个主机进来 ⁄(⁄ ⁄・⁄ω⁄・⁄ ⁄)⁄,并且增加了有线和无线的环境。那么,在多主机环境下,PC1 现在发出的 ARP 请求包,怎么交到 PC2 手里?
这时,ARP 协议就需要采用以太网的 “广播” 功能:将请求包以广播的形式发送,交换机或 WiFi 设备(无线路由器)收到广播包时,会将此数据发给同一局域网的其他所有主机。
那么,什么是广播?对于初学者而言,我们只需要知道,大部分的广播包,它们有一个共同特征:二层封装时目的 MAC 是全 f(ffff.ffff.ffff)或三层封装时目的 IP 是全 1(255.255.255.255)。
可以这样更方便的记住:目的地址最大的,就是广播。
注明:广播根据所在层次可分为二层广播和三层广播,根据发生范围可分为本地广播和定向广播,有兴趣可以自己去拓展下。
接下来我们来看下这个 ARP 广播请求包接下来是如何工作的?
根据上图我们看到,PC1 发送的请求广播包同时被其他主机收到,然后 PC3 和 PC4 收到之后(发现不是问自己)则丢弃。而 PC2 收到之后,根据请求包里面的信息(有自己的 IP 地址),判断是给自己的,所以不会做丢弃动作,而是返回 ARP 回应包。
ARP 请求是通过广播方式来实现的,那么,PC2 返回 ARP 回应包,是否也需要通过广播来实现呢?答案是否定的。大部分网络协议在设计的时候,都需要保持极度克制,不需要的交互就砍掉,能合并的信息就合并,能不用广播就用单播,以此让带宽变得更多让网络变得更快。
那么,ARP 回应包是如何处理的?这里需要特别关注 ARP 请求包的内容,在上面的图解里面,ARP 请求包的完整信息是:我的 IP 地址是 IP1,MAC 地址是 MAC1,请问谁是 PC2,你的 IP2 对应的 MAC 地址是多少?
简单来说,ARP 请求首先有 “自我介绍”,然后才是询问。这样的话,PC2 在收到请求之后,就可以将 PC1 的 IP 和 MAC 映射信息存储在本地的【ARP 缓存表】,既然知道 PC1 在哪里,就可以返回 ARP 单播回应包。
这张图我们需要得到两个信息:
① 被询问者 PC2 先生成了 ARP 映射信息,然后才是询问者 PC1;
② PC3 和 PC4 等其他主机,无法收到这个 ARP 回应包,因为是单播形式。
小结:ARP 协议通过 “一问一答” 实现交互,但是 “问” 和 “答” 都有讲究,“问” 是通过广播形式实现,“答” 是通过单播形式。
四、ARP 数据包解读
为了让大家更好的理解 ARP 协议以及广播和单播的概念,我们来看一下用 Wireshark 抓取到的真实网络中的 ARP 过程,通过数据包的方式来呈现,地址信息如下,部分 MAC 信息隐去。(建议初学者用 GNS3 配合 Wireshark 来抓取协议包进行分析,相比真实网络更加干净,方便分析)
主机 1 <—> 主机 2
主机 1: IP1 10.1.20.64 MAC1:00:08:ca:xx:xx:xx
主机 2: IP2 10.1.20.109 MAC2:44:6d:57:xx:xx:xx
【ARP 请求包】
【ARP 回应包】
【ARP 协议字段解读】
Hardware type :硬件类型,标识链路层协议
Protocol type: 协议类型,标识网络层协议
Hardware size :硬件地址大小,标识 MAC 地址长度,这里是 6 个字节(48bti)
Protocol size: 协议地址大小,标识 IP 地址长度,这里是 4 个字节(32bit)
Opcode: 操作代码,标识 ARP 数据包类型,1 表示请求,2 表示回应
Sender MAC address :发送者 MAC
Sender IP address :发送者 IP
Target MAC address :目标 MAC,此处全 0 表示在请求
Target IP address: 目标 IP
五、ARP 到底是链路层还是网络层?
这个问题的难度堪比另外一个世界级难题:世界上最好的编程语言是什么?
其实早在 20 世纪时,W.Richard Stevens 在《TCP/IP 详解卷一》里面就提到了这个难题。这里给出我个人的协议分层思路,给大家作为参考 =>
协议到底所属哪一层,可以从应用 / 功能来考虑,也可以从层次 / 包封装来考虑。
以 ARP 协议为例,它的功能最终是获取到 MAC 信息,服务于链路层,从这点考虑,ARP 是链路层协议;但是从层次来看,ARP 基于 Ethernet 协议,IP 协议基于 Ethernet 协议,它们在 Ethernet 协议里面有独立的 Type 类型,前者是 0x0806,后者是 0x0800,既然 ARP 和 IP 协议 “平起平坐”,那么 IP 是网络层,ARP 难道就不是网络层?
小结:基于功能来考虑,ARP 是链路层协议;基于分层 / 包封装来考虑,ARP 是网络层协议。(此方法对于 ICMP 协议同样管用)
图解 ARP 协议(二)ARP 攻击篇
陈鑫杰 拼客院长陈鑫杰 2017 年 08 月 27 日 10:00
一、ARP 攻击概述
在上篇文章里,我给大家普及了 ARP 协议的基本原理,包括 ARP 请求应答、数据包结构以及协议分层标准,我们继续讨论大家最感兴趣的话题:
ARP 攻击原理是什么?
通过 ARP 攻击可以做什么,账号是否可以被窃取?
有哪些常见的 ARP 渗透(攻击)工具可以用来练手?
ARP 扫描和攻击有什么区别,底层数据包特征是怎样的?
接下来,我们通过图解的方式来深入了解 ARP 攻击是如何实现的。
二、ARP 攻击原理
但凡局域网存在 ARP 攻击,都说明网络存在 “中间人”,我们可以用下图来解释。
在这个局域网里面,PC1、PC2、PC3 三台主机共同连接到交换机 SW1 上面,对应 3 个接口 port1/2/3。假设 PC3 这台主机安装了 ARP 攻击软件或遭受 ARP 病毒,成为这个网络的攻击者(hacker),接下来,PC3 是如何攻击的?
先不急,先来回顾下 PC1 和 PC2 是如何通信的。
①PC1 需要跟 PC2 通信,通过 ARP 请求包询问 PC2 的 MAC 地址,由于采用广播形式,所以交换机将 ARP 请求包从接口 P1 广播到 P2 和 PC3。(注:交换机收到广播 / 组播 / 未知帧都会其他接口泛洪)
②PC2 根据询问信息,返回 ARP 单播回应包;此时 PC3 作为攻击者,没有返回 ARP 包,但是处于 “监听” 状态,为后续攻击做准备。
③PC1 和 PC2 根据 ARP 问答,将各自的 ARP 映射信息(IP-MAC)存储在本地 ARP 缓存表。
④交换机根据其学习机制,记录 MAC 地址对应的接口信息,存储在CAM 缓存表(也称为 MAC 地址表)。交换机收到数据包时,会解封装数据包,根据目标 MAC字段进行转发。
关于上面的图解,我们要记住这些关键知识(敲黑板!):
① 主机通信需要查找 ARP 表,而交换机通信需要查找 CAM 表(路由器则查找 Route 表)。
注:ARP 表:ip<->mac CAM 表:mac<->port (Route 表:route<->port)
② 交换机基于源 MAC 地址学习,基于目的 MAC 地址转发。
③ 同一局域网内,攻击者可以根据主机的 ARP 广播请求监听其 IP 和 MAC 信息。
注:这里是 “被动监听”,跟后面要谈到的 “主动扫描”,原理上有区分,这里先埋个坑)
接下来是重点,我们来看看 PC3(Hacker)是如何发起 ARP 攻击的 =>
正常情况下,若收到的 ARP 请求不是给自己的,则直接丢弃;而这里 PC3(Hacker)在监听之后,发起了 ARP 回应包:我就是 PC2(IP2-MAC3)。
从拓扑可以出现,PC3 明明是 IP3 对应 MAC3,很显然这就是一个 ARP 欺骗行为。于此同时,PC2 正常的 ARP 回应包也交到了 PC1 手中,我们来看 PC1 接下来如何处理的:
PC1 收到两个 ARP 回应包,内容分别如下:
③ 我是 PC2,我的 IP 地址是IP2,我的 MAC 地址是MAC2;
③ 我是 PC2,我的 IP 地址是IP2,我的 MAC 地址是MAC3;
PC1 一脸懵:咋回事?还有这操作?不管了,我选最新的!(后到优先)
这里给大家顺便普及下网络协议里各种表在处理缓存信息的方式:
要么 “先到先得”,要么 “后到优先”。上面提到的 ARP 和 CAM 表,就是遵循 “后到优先” 原则,而后面章节我们会讲到的 DHCP 表,则遵循 “先到先得” 原则。
那么问题来了,上面两个 ARP 回应包到底哪个先到哪个后到呢?
作为初学者,可能还在纠结前后这种 naive 的问题;而作为 hacker,只要持续不停发出 ARP 欺骗包,就一定能够覆盖掉正常的 ARP 回应包。稳健的 ARP 嗅探 / 渗透工具,能在短时间内高并发做网络扫描(例如 1 秒钟成千上百的数据包),能够持续对外发送欺骗包。
无论如何,当 PC1 和 PC2 这种 “小白” 用户遇到 PC3(hacker)时,最终的结果一定是这样的:
小白 vs 黑客,很明显的较量,PC1 最终记录的是虚假的 ARP 映射:IP2<->MAC3,得到错误信息的 PC1,接下来会发生什么情况呢?(我们以 PC1 ping PC2 为例)
根据数据封装规则,当 PC1 要跟 PC2 进行通信时,无论是发生 PING 包还是发送其他数据,首先要查找 ARP 表,然后在网络层打上源目 IP,在链路层打上源目 MAC,然后将数据包发送给交换机。交换机收到之后对数据进行解封装,并且查看 CAM 表(基于目的 MAC 转发),由于目标 MAC3 对应 Port3,所以交换机自然而然将其转发给 PC3。
就这样,PC1 本来要发给 PC2 的数据包,落到了 PC3(Hacker)手里,这就完成了一次完整的 ARP 攻击。反过来,如果 PC2 要将数据包发送给 PC1,PC3 仍然可以以同样的 ARP 欺骗实现攻击,这就有了下面这张图(PC3 既欺骗了 PC1,也欺骗了 PC2)。
此时,PC1 和 PC2 的通信数据流被 PC3 拦截,形成了典型的 “中间人攻击”。那么,一旦被攻击并拦截,攻击者能做什么,普通用户又会遭受什么损失?这里给大家举几个常见的例子 =>
① 攻击者既然操控了数据流,那么直接断开通信是轻而易举的,即 “断网攻击”,例如,PC1 发给 PC2 的数据在 PC3 这里可以直接丢弃,而如果这里的 PC2 是一台出口路由器(无线路由器),那就意味着 PC1 直接无法连上互联网。
② “断网攻击” 显然容易被发现,而且比较 “残忍”,所以就有了更加常见的应用 -“限速”。例如,在宿舍上网突然很慢,在网吧上网突然打不开网页,如果这个网络没有安全防御,那么很有可能有 “内鬼”。
③ 其实无论是 “断网攻击” 还是 “限速”,整体还是比较 “善良”,因为这里流量里面的核心数据还没有被 “提取” 出来。如果攻击者是一名真正的黑客,他的目的一定不会这么无聊,因为内网流量对于黑客是没有太大价值的,而只有 “用户隐私”,例如常见网站的登录账号密码,这些才是最有价值的。
问:遭受 ARP 攻击之后,哪些账号可能被窃取?
答:任何基于明文传输的应用,都可以被窃取。 例如,如果一个网站不是 HTTPS 协议,而是基于 HTTP 明文传输,那么当你登录这个网站时,你的密码就会被窃取。除了 http(web 应用),常见的还有 telnet、ftp、pop3/smtp/imap(邮箱)等应用,都很容易泄露密码。
三、常见 ARP 渗透工具与底层原理分析
基于 ARP 欺骗原理设计出来的渗透 / 攻击工具非常多,而最终能实现什么功能则各有差异,简单举几个例子:
① 无毒无害型的仅具备 ARP 扫描功能,用来发现内网主机;例如 Metasploit 里面的 arping/arpscan 相关模块;
② ARP 扫描 + 流量控制(限速或限制能上哪些网站和应用);例如 Windows 下的 P2P 终结者;
③ ARP 扫描 + 账号窃取(网站、邮箱、各种);最强的莫过于 Windows 下的 Cain,当然还有跨平台的 Ettercap(需配合其他工具);
当然,如果攻击者足够强悍,也可以基于协议底层原理,编写自己的 ARP 工具。这里我通过 wirehshark 给大家还原真实网络中常见的 ARP 扫描和欺骗攻击(具体的软件使用这里暂时不出现,大家重点关注底层实现)。
在这张图里面,Hacker(就是我…)接入了一个 WiFi 网络,这个 10.1.20.0/24 便是所在的网段。刚进来一个陌生网络,Hacker 只知道自己的 IP 信息,例如 IP 地址是 10.1.20.253,网关地址是 10.1.20.254,而这个局域网的其他设备是什么?有多少台?地址分布是多少?Hacker 都不知道,接下来怎么办呢?是不是要直接发动 ARP 攻击了?
不用这么着急,咋们至少要先了解下这个网络,进行基本的扫描和踩点。这个时候通过 ARP 工具对这个 WiFi 网络进行扫描,具体的数据包截图如下:
上面的 ARP 扫描过程,大概的情况是这样的 =>
其实,这就是典型的 “盲扫” 或者 “暴力扫描”:反正我不知道网络到底有多少主机,那我就尝试一下把整个网段全部问一遍得了。好比老师上课点名,把每个学生的桌位号念一遍,谁举手就到勤,没举手就算逃课。
那么,这个实际网络里面,到底谁 “举手” 了呢?我们来看 Wireshark 抓包情况。
在 ARP 应答信息里面,除了 IP 地址和 MAC 信息,我们还能看到相关的设备厂商信息,例如 cisco、meizu、apple、xiaomi 等,这其实就是依靠 MAC 地址前面 24 位的 OUI(机构唯一标识符) 来识别的。
Wireshark 或扫描器能够帮我们将 OUI 转为对应的厂商(还有一些扫描器基于 Netbios 协议,还能找到电脑的主机名),所以,扫描之后可以得到下面这张图片 =>
通过扫描,我们已经知道了整个网络的主机信息,例如 20.254 对应 cisco,应该是路由器,20.248 对应 apple,是苹果手机,20.249 对应 xiaomi,是小米手机,以此类推…
接下来,如何进行 ARP 欺骗攻击呢?这里将最重点的数据包截取出来 =>
根据之前的信息,我们知道 00:08:ca:86:f8:0f 其实就是 hacker 的 mac 地址,并且对应的真正的 IP 地址应该是 10.1.20.253。而这里很明显是hacker 在欺骗局域网其他主机,它对外声称:自己就是 “所有人”。尤其是上面标红的主机,我们已经知道是小米、思科、苹果等设备,但是 hacker 都声明是自己!这样做的意义在于覆盖掉其他主机的 ARP 缓存表信息,并生成错误的 ARP 映射,最终将通信流量交给 hacker。
当然,还有另外一种 ARP 欺骗的做法:hacker 告诉所有人,自己就是网关。因为其他主机访问互联网必经之路便是网关(出口路由器 / 无线路由器),通过这种方式,同样可以截取到用户数据流,这里给出另外一个网络的实现过程 =>
Hacker 欺骗主机 Honhai,告诉它:我就是网关(10.1.1.254)
Hacker 欺骗主机 Apple,告诉它:我就是网关(10.1.1.254)
依此类推,Hacker 会告诉局域网所有主机:自己就是网关,并且后续可以把数据都丢给我,我来转发到互联网。
四、ARP 攻击总结
① ARP 缓存表基于 “后到优先” 原则,IP 与 MAC 的映射信息能被覆盖;
② ARP 攻击基于伪造的 ARP 回应包,黑客通过构造 “错位” 的 IP 和 MAC 映射,覆盖主机的 ARP 表(也被称为 “ARP 毒化”),最终截取用户的数据流;
③ 一旦遭受 ARP 攻击,账号密码都可能被窃取(如果通信协议不是加密的);
④ 通过 Wireshark 数据包分析,我们掌握了真实网络中 ARP 底层攻击原理及数据包组成。
图解 ARP 协议(三)ARP 防御篇:如何揪出 “内鬼” 并 “优雅的还手”?
陈鑫杰 拼客院长陈鑫杰 2017 年 08 月 29 日 06:10
一、ARP 防御概述
通过之前的文章,我们已经了解了 ARP 攻击的危害,黑客采用 ARP 软件进行扫描并发送欺骗应答,同处一个局域网的普通用户就可能遭受断网攻击、流量被限、账号被窃的危险。由于攻击门槛非常低,普通人只要拿到攻击软件就可以扰乱网络秩序,导致现在的公共网络、家庭网络、校园网、企业内网等变得脆弱无比。
所以,如何进行有效的 ARP 防御?作为普通用户怎么防御?
作为网络 / 安全管理员又怎么防御?有哪些 ARP 防御软件?
如果被 ARP 攻击了,如何揪出 “内鬼”,并 “优雅的还手”?
接下来,我们通过图解的方式来深入了解 ARP 防御原理与解决方案。
二、ARP 防御原理与解决方案
在讲解 ARP 防御之前,我们先回顾下 ARP 攻击最经典的一幕 =>
当 PC1 询问 PC2 的 MAC 地址时,攻击者 PC3 返回ARP 欺骗回应包:我的 IP 地址是 IP2,MAC 地址是 MAC3。一旦 PC1 记录了错误的 ARP 映射,则发给与 PC2 的数据,都会落到 PC3 手里。
也就是说,ARP 攻击的罪魁祸首便是这种 “欺骗包”,若针对欺骗包的处理是不相信或不接收的话,则不会出现问题。处理这种欺骗行为我们没法提前在黑客端做手脚,因为 “敌在暗处我在明处”。这样的话,我们就剩下两个解决方法:
① 保证电脑不接收欺骗包
② 保证电脑收到欺骗包之后不相信
目前网络安全行业现有的 ARP 防御方案,基本都是上面两个方法的具体实现。我们来看看这张防御图:
① 当黑客发起 ARP 欺骗包时,会途径局域网里面的交换机或无线路由器等网络设备;
② 如果网络设备能够识别这种欺骗包,并且提前丢弃掉,则电脑 / 手机端就不会被欺骗;
③ 如果网络设备没有拦截这种欺骗包,则电脑 / 手机端需要做安全防御,然后再丢弃。
简单来说,ARP 防御可以在网络设备上实现,也可以在用户端实现,更可以在网络设备和用户端同时实现。接下来,我们先来了解下网络设备(例如这里的交换机)的防御技术。
上面这张图,展现的是交换机的 ARP 防御能力,当 PC2 发送 ARP 回应包时,交换机将其转发给 PC1,而当 PC3 发送 ARP 回应包(欺骗)时,交换机直接丢弃。
但是,人家 PC3 上脸上又没有写着 “hacker”,凭什么交换机要丢弃它的 ARP 回应包? 凭什么判断它的包就是 “欺骗” 的呢?
接下来,我就要给大家介绍下局域网安全里比较常用的防御技术,这种防御技术被称为DAI(Dynamic ARP Inspection)- 动态 ARP 检测,原理可以用两句话简单概括:
① 交换机记录每个接口对应的 IP 地址和 MAC,即 port<->mac<->ip,生成 DAI 检测表;
② 交换机检测每个接口发送过来的 ARP 回应包,根据 DAI 表判断是否违规,若违规则丢弃此数据包并对接口进行惩罚。
我们知道,PC3 是在交换机的 Port3、MAC 地址是 MAC3,IP 地址是 IP3,所以本地 DAI 表项内容是 <port3-mac3-ip3> 。当交换机从接口 Port3 收到 ARP 回应包,内容却是 IP2 和 MAC3 映射,即 <port3-mac3-ip2>。
经判断,这个包就是虚假的欺骗包,交换机马上丢弃这个包,并且可以对接口做惩罚(不同设备的惩罚方式有所不同,可以直接将接口 “软关闭”,直接将攻击者断网;也可以 “静默处理”,仅丢弃欺骗包,其他通信正常)
上面这个动态 ARP 监测技术,可以说是目前防御 ARP 攻击最有效的方法之一。但是,作为初学者,大家可能还会有疑问:
① 一般的交换机或网络设备能部署动态 ARP 监测技术吗?
② 连接用户的交换机,怎么能识别 IP 地址信息呢?
③ 上面这张 DAI 表是如何生成的?是不是像 CAM 表一样能自动识别?
这里要给大家说个稍微悲伤一点的事实,大部分能支持这种动态 ARP 监测技术的交换机或者无线路由器,都基本是企业级的产品。 即便是企业级交换机,具备局域网安全防御功能的设备,价格都要高出不少,所以很多中小型企业网或校园网,基本都愿意买 “阉割版” 网络接入产品,因为 “能通就行”,至于安全性怎样,这是另外要考虑的问题。
所以,简单的交换机不具备动态 ARP 监测技术,即便市面上有带安全防御的网络产品,企业、学校、医院等大量网络,仍然在早期采购的时候,用的是比较基础版本的交换机。当然,随着网络与安全市场的激烈竞争和网络安全意识的增强,以后会越来越好。
另外,交换机能识别 IP 地址信息吗?
从现在的网络技术来看,分层界限越来越模糊,融合式的网络设备才是主流,现在的接入交换机基本能被 Telnet/SSH/Web 管理,更专业的交换机同时支持动态 ARP 监测(dai)、IP 源防护(ipsg)、DHCP 侦听(dhcp snooping)、端口安全、AAA、802.1x 等局域网安全技术,已经超越了原有二层交换机的定义。
所以,交换机能读三层甚至七层的数据包已经不是什么新鲜事了,不要被 “交换机就是二层设备” 给束缚了,这只是纸面上的定义。
**最后一个问题,DAI 检测表是如何生成的?
在上面图解中,我们看到交换机查看的表已经不是原来的 CAM 表了,内容也不太一样,CAM 表的内容主要是 MAC 和 Port 的映射,而 DAI 检测表则是 Port、MAC、IP 三个信息映射。
目前这张表支持两种方式来生成 =>
第一种方式就是手工静态绑定:即用户接入网络之后,管理员根据此用户电脑的 MAC 和 IP 地址,然后在接口上绑死,缺点就是用户数太多的话,手工绑定管不过来。
第二种方式就是目前最主流的做法,即在交换机上开启 DHCP 侦听技术,当用户第一次通过 DHCP 获取到地址的时候,交换机就把用户电脑的 IP、MAC、Port 信息记录在 DHCP 侦听表,后面 ARP 检测直接调用这张 DHCP 侦听表即可。
小结:以上便是在网络设备上部署的 ARP 防御技术,通过动态 ARP 监测技术(DAI),可以很好的解决 ARP 欺骗问题。技术虽好,但局域网内的交换机、无线路由器是否支持 DAI,这个则取决于实际网络情况,尤其是**十面埋伏的公共 WiFi 网络、脆弱无比的家庭网络、能通就行的校园网络…我们都应该持怀疑态度,至少不能完全信任这些网络。
既然这样的话,普通用户有没有 “自救” 的方法,能够抵挡 ARP 攻击呢? 答案是肯定的 =>
对于普通用户,陌生网络不要随意接入,肯定是首选考虑的;当然,这里研究的是用户已经接入了网络,如何做安全防御的问题。从上图可以看到,用户(电脑或手机)最重要的便是通过安装 ARP 防火墙做安全防御,很多普通用户甚至 “以电脑裸奔为豪,以骂安全厂商为荣”,这是对技术的严重藐视,对自己隐私的不负责任。 普通小白一定要记住一句话:你没有被黑,只是你还没有到达被黑的价值。
ARP 防火墙在技术实现上,一般都有以下功能:
① 绑定正确的的 IP 和 MAC 映射,收到攻击包时不被欺骗。
② 能够根据网络数据包特征(参考上一篇讲解的 ARP 攻击数据包溯源分析),自动识别局域网存在的 ARP 扫描和欺骗行为,并做出攻击判断(哪个主机做了攻击,IP 和 MAC 是多少)。
那么,有哪些常见的 ARP 安全产品呢?
自带 ARP 防御功能:腾讯电脑管家、360 安全卫士……
专业的 ARP 防火墙:彩影 ARP、金山贝壳、360ARP 防火墙……
采用安全产品肯定是普通用户最省时省力的做法,而对于技术人 / 工程师而言,如果不屑于使用安全产品,并且希望解决 ARP 攻击行为,也可以通过 “ARP 双向绑定” 的技术来实现。什么是 “ARP 双向绑定” 呢?
从上图可以看到,PC1 和 PC2 通信双方都静态绑定对方的 IP 和 MAC 映射,即便收到 ARP 欺骗包,由于静态绑定的 ARP 映射条目优先级高于动态学习到的,所以可以保证不被欺骗。
这种做法非常 “绿色无污染”,因为不需要额外的软件安装,但是缺点也非常明显,例如普通用户不知道如何在电脑上做 ARP 静态绑定,另外工作量也比较大,每个主机和网关设备都需要绑定整个局域网的 ARP 静态映射。以下面的家庭 WiFi 网络为例:
像这个 WiFi 网络,如果通过 ARP 双向绑定来解决安全问题,配置量其实蛮大的,当然,这就基本能够保障内网主机间通过以及主机访问互联网的安全性了。
Windows arp 静态绑定方法 =>
① 进入命令行 cmd 界面;
② [arp -s ip 地址 mac 地址],例如:arp -s 192.168.1.1 00-11-22-a1-c6-09
注:家用无线路由器若要进行 ARP 绑定,则需要通过 web 登录并进行图形操作
小结:用户端的 ARP 防御方法,要么安装 ARP 防火墙,要么做 ARP 双向绑定。对于绝大部分用户来讲,虽然安装防火墙不是保证百分百安全了,但是能够解决很大一部分的隐患。
三、如果被 ARP 攻击了,如何揪出 “内鬼” 并 “优雅的还手”?
相比 “如何防御 ARP 攻击”,我相信更多人感兴趣的是 “如何揪出内鬼并进行还手”,因为 “揪出内鬼” 的时候,我们充当着 “网络警察” 的角色(把小偷逮住),而 “优雅的还手” 又充当着 “法官” 的角色(惩治小偷)。
而充当网络警察或法官这种角色,我可能算是比较有经验的… 从我刚接触网络 / 安全到现在,充当的次数多的数不过来:在学校外面租房的时候(别想歪)、在网吧上网的时候、在音乐餐吧吃饭的时候、在麦当劳 / 德克士蹭网的时候… 可能普通用户觉得稀疏平常的地方,在网络世界里实则暗流涌动。
我第一次 “抓内鬼当法官” 应该是在 2010 年的时候,当时在学校旁边租了一个房子自己做技术研究。有一天晚上,网速变得特别慢,网页基本没法打开,QQ 勉强还能挂着,但是租房以来网络一直还可以,虽然不算快,但是也至少满足平常上网需求啊。我心想:算了,毕竟租的房子一般,每个月网费也就 30 快,房东拉的宽带可能比较垃圾不稳定吧,明天再看看。
第二天早上爬起来,发现网络一点问题都没有,该开的网页,该下载的资料,都没有任何影响,恩,心情不错,不用专门跑回学校一趟下载资源之类的。但是到了晚上七八点的时候,网络又出现问题了,跟昨天晚上的情况一模一样,基本没法上网,但是网卡又显示连接着,这让我非常的郁闷。
然后我突然想起这几天,这栋楼好像新来了一个租客,这栋楼一共就四层,一层就 3 户租客,一共也就 10 来户,而一楼还是房东自己一家人住,我自己住二楼。基本上这栋楼里的租客都能记得七七八八,所以如果有陌生面孔的话,一眼就能认出来,我们暂且把这个人称为 H,看上去是个上班族。
虽然当时还是个小菜鸟,但是毕竟学这块的,还是有点敏感:擦,会不会是这个人白天去上班,晚上回来宿舍,就开始限制我们的网速啊?
你不犯我,相安无事,你若范我,我必搞你。(年轻人还是有点浮躁啊…)
行,开干吧,多想没用。然后便拿出了 P2P 终结者(忘了当时用什么软件了,不过八九不离十)一扫描,想探探网络究竟。
万万没想到啊,居然遇到老司机了,人家局域网权限比我还高(很多局域网流控软件都有权限的概念,若同一个局域网同时有多个使用这个流控软件,则权限高的优先控制,其他人的软件会自动退出),网络扫描进行一半,就提示 “局域网有多人使用,由于你权限较低暂停退出” 这样的提示,这样一来,就验证了我的判断,这个内鬼应该是 H。自从他来了之后,这个网络就出了问题。这栋楼的网络拓扑结构是这样的 =>
普通小白遇到这种情况,装个 ARP 防火墙,咬咬牙也就过去了。但是咋们学网络和安全的,遇到这种情况,感觉就好像被人骑在头上一样。那咋办呢?作为一个理科男,做事情还是得按步骤走,不能被脾气牵着走,虽然当时已经非常生气了,但是基本定下来这个解决流程:
第一:马上给电脑安装防火墙,先脱离 H 的控制(当时电脑居然是裸奔的…);
第二:想尽办法找到 H 的 IP 和 MAC 地址(很多小伙伴看到这里可能会想:直接上去楼上揍他一顿不就得了,还费什么劲找地址啊。这个有必要说明下:①我个头没人家大只 ②人家要是问:你有证据吗,你取证了吗? 所以,武力不能解决问题,但是技术能力可以。)
第三:想方设法拿到网络控制权,把他踢下去。
第一步:具体就不说了,也忘了当时装的什么安全软件了;
第二步:怎么找到攻击者的 IP 和 MAC 地址呢?
2010 年的安全软件,不像现在的 ARP 防火墙,能够主动告警,并且说明攻击次数和攻击源,所以还是需要自己折腾下:熟练的打开电脑之前安装好了的 wireshark,监听自己电脑网卡的流量,设置流量过滤器(仅过滤 arp 协议),不出意外,接下来就是一堆 “带有节奏的 ARP 扫描包”(还记不记得之前章节说过的,ARP 攻击一般会涉及到持续的内网扫描和欺骗攻击)。当时收到的数据包大概这样的:
通过流量数据包分析,很快就确定了攻击者的 IP 和 MAC 地址。这里要注意:虽然抓到了攻击者的 IP 和 MAC 地址,但是!我们还是没法实锤的证明:攻击者就是 H。
这个攻击者是不是真的 H 啊?怎么确定就是这个人干的呢?如何把虚拟世界里的地址跟真实世界的人匹配起来?
接下来我便想到了一个方法:如果我们能先拿到网络的控制权,然后把攻击者给踢下去直接断网,同时保证其他人网络连通;然后,谁要是下去跟房东沟通反馈不能上网,不就可以基本断定这个人就是攻击者?说白了,就是 “谁叫谁小狗”…
好,到了计划的第三步:如何拿到整个网络的控制权?这里就没走的那么顺畅了:现在的实际情况是:我和攻击者同时开启局域网流控软件,而是我被踢下来了,因为我权限低一些。当时的第一个想法是:我换一个流控软件不就得了?这样我不跟你拼这个软件的权限。但是仔细想了想,即便换一个流控软件能用,但是顶多也就是打个平手,我控制不了你,你也控制不了我,但最终遭殃的还是其他普通小白,这个方法不能 “斩草除根” 啊。
怎么办呢?是不是只能跟他打个平手。在这里卡了很久但又心有不甘,然后到了大半夜了突然顿悟:擦,为什么要跟他 “限来限去” 呢,直接上整栋楼的出口路由器,把他踢出去不就得了?路由器(应该是 TP-LINK)就在一楼楼梯口,然后其他楼层加一个 hub 级联上去,所以大家都在一个网络里面。
但问题是没有路由器的后台登录密码,怎么解决呢?抱着侥幸的心理,查看电脑网关地址,然后浏览器输入网关地址,弹出了登录页面,尝试 admin/admin?不行,再尝试 admin/123456?还是不行… 就这样尝试了常见的十几二十个账号密码,都提示账号密码错误,看来运气不是很好。
既然这样的话,就只能拿出暴力破解软件跑几个词典看看,用 hydra 挂着用户名和密码词典,慢慢的看着命令行输出,但输出结果基本都是 failed… 所以,第二天晚上虽然发现了攻击者的 IP 和 MAC 地址信息,但是拿他没办法,只能先忍着。
到了第三天白天,脑子里想的都是如何登录这个路由器后台管理界面,尝试跑了几个词典都没法登录,心理又在想:房东不应该会设置太复杂的密码啊,四五十岁的阿姨,完全不懂技术啊,网络应该也是叫人搞的,即便别人设置密码也应该给阿姨设置比较简单的让她好记的,方便后面维护之类的… 一想到这里,赶紧从柜子里掏出之前的租房合约和房东名片,然后把房东的手机号码、房东的姓名拼音等信息做成简单的密码词典,再重新跑一次,还没反应过来,就显示密码尝试成功:admin / 房东手机号码。万万没想到,以为只要 6 位或者 8 位的密码,居然是一个 11 位的手机号码,之前尝试的词典都是 8 位以内的。
接下来用浏览器访问路由器后台管理界面,进入主机列表,还没发现这个昨晚攻击者的 IP 地址上线。等到了晚上七八点的时候,终于在路由器上发现这个 IP 地址,而且,wireshark 同时也抓到了这个攻击者发起的扫描包。看来是攻击者一回到宿舍,打开电脑,就直接挂着攻击软件,确实是个 “惯犯” 啊。好吧,看到这个情况,我直接在出口路由器上把这个 IP 和 MAC 地址禁用,看接下来发生什么。
果然,大概过了半个钟,有人从楼上下来,直接去一楼找房东阿姨去了,具体说什么这个不清楚,但是应该是询问是不是宽带欠费之类的导致不能上网。
过了一会,阿姨带着他上来二楼… 然后敲门询问:你们二楼能不能上网啊?大家都陆续回答:可以啊、没问题啊。与此同时,我已经确定了:**眼前的这个人,H 就是攻击者!他大概没料到,自己已经控制了内网,怎么可能被踢掉之类呢。
阿姨也不知道怎么办,只能说明天看看吧。看着他无辜的眼神回楼上去了,我也觉得抓到内鬼也就算了,先把他解禁看看。然后 “惯犯” 又上线了,看来没有吃够苦头啊,当天晚上直接让他断网。之后的几个晚上类似的情况慢慢少了,因为只要他一扫描发起攻击,我这边就断他网,然后隔 10 分钟或者半个钟看看他反应,就这样慢慢地把他制服了,整栋楼的网络也就逐渐恢复了平静……
四、ARP 防御总结
① ARP 攻击非常低门槛,但是造成的影响却很大,包括断网攻击、流量被限、账号被盗等;
② ARP 防御可以在网络端(网络设备)上部署,也可以在用户端(电脑 / 手机)上部署;
③ 网络设备(例如交换机)部署 ARP 防御,通常需要用到 DAI(动态 ARP 监测)技术,更加专业的局域网安全防御,还可能结合 DHCP 侦听、IP 源防护、端口安全、AAA、802.1X 等技术,这些专业的防御技术,是由网络运维和安全运维工程师来实施的。
④ 用户端(电脑 / 手机)实施 ARP 防御,最好的方法就是不要随意接入陌生网络,并且安装 ARP 防火墙。当然,技术宅的话,可以采用 “ARP 双向绑定” 的方法,相对比较麻烦,但是也奏效。
⑤ 作为一名有素养的网络 / 安全工程师,应该不作恶。但是如果遭受攻击,应该揪出内鬼并 “优雅的还手”,做一个网络警察,还普通用户一个干净的网络环境。
图解 ARP 协议(四)代理 ARP:善意的欺骗
陈鑫杰 拼客院长陈鑫杰 2017 年 08 月 30 日 23:59
一、代理 ARP 概述
我:当电脑要访问互联网上的服务器,目标 MAC 是什么?
很多小伙伴在刚学习网络协议的时候,经常这样直接回应:不就是服务器的 MAC 嘛!
这时我会反问:那电脑怎么拿到这个服务器的 MAC 地址呢?
小伙伴一般都自信的抛出下面两个点:
① 根据网络通信中数据封装的原则,通信双方需要封装源目 IP 和 MAC 地址;
② 如果要拿到目标 MAC 地址,就需要通过 ARP 协议进行交互。
我:好,确实没毛病,你是指的下面这个意思吧 ==>
小伙伴:对对对,是这个意思的。
我:好,你再看看下面这个图,再确认下。
小伙伴:好像不太对唉,刚才没注意看… 互联网这么多路由器,根据之前学过的:
① 路由器隔离广播域,每个接口 / 网段都是独立的广播域;
② ARP 请求是二层广播包,广播包没法过路由器;
这样的话,ARP 请求广播包根本没法穿越互联网到达目标服务器。
我:那我们平常上微博逛知乎去京东剁手基本都依据上面这张图,通过 DNS 协议将域名解析为 IP 地址,通过 ARP 协议将 IP 解析为 MAC 地址。现在 ARP 请求无法穿越过去,电脑便无法获取目标服务器的 MAC 地址,怎么跟它通信呢?
小伙伴:。。。。。。
上面这个疑惑,我相信每个学习网络协议的初学者经常会问到,更普遍的情况是,很多工作多年的工程师,也未必能够将下面这几个问题完全搞清楚:
① 电脑访问互联网服务器的时候,ARP 询问的内容,真的是问服务器的吗?
② 什么是代理 ARP?跟 ARP 有什么区别?什么场景下会用到代理 ARP?
③ 代理 ARP 跟网关(默认路由)设置有什么关系?
所以,这一篇文章虽然是讲代理 ARP,但其实核心内容是围绕代理 ARP,解读跨网段通信过程中,ARP / 代理 ARP / 网关(默认路由)/ 数据封装等相关问题。
二、代理 ARP 原理
当 ARP 请求目标跨网段时,网关设备收到此 ARP 请求,会用自己的 MAC 地址返回给请求者,这便是代理 ARP(Proxy ARP)。
上面这张图中,电脑发送 ARP 请求服务器 8.8.8.8 的 MAC 地址,路由器(网关)收到这个请求时会进行判断,由于目标 8.8.8.8 不属于本网段(即跨网段),此时便返回自己的接口 MAC 地址给 PC,后续电脑访问服务器时,目标 MAC 直接封装为 MAC254。
代理 ARP 本质是一个 “善意的欺骗”,是一个 “错位” 的映射。从图中我们看到服务器地址的正常映射是 < 8.8.8.8-MAC2>,而路由器返回给电脑的,却是 <8.8.8.8-MAC254>。不管是不是 “欺骗”,至少最终电脑可以与外网的服务器实现通信,以 PC Ping Server 为例 =>
实际网络中,代理 ARP 由网络中的网关设备来执行,包括路由器、多层交换机、无线路由器、防火墙等设备。并且,网关即便有代理 ARP 功能,也未必一定执行,还必须满足两个条件:
① 网关已经开启代理 ARP 功能;
② 网关有目标的路由信息。
我们来看下面这张图 =>
上面这张图中,我们假设路由器已具备全网的路由,但连接电脑的接口没有开启(或不支持)代理 ARP 功能,此时便造成一个尴尬的情况:电脑反复询问到 8.8.8.8 的 MAC 地址,路由器收到之后,处理流程跟正常 ARP 是一致的,“问自己的回复,不是问自己的丢弃”。因此,当网络通信采用代理 ARP 时,可能会 “受制于沿途网关设备”,造成网络通信故障。
进一步思考:既然代理 ARP 不是一种特别流畅的实现,会 “受限于别人”,那我们没必要一定要使用它。甚至,这里我们需要搞清一个事实:实际网络中,无论是同网段还是跨网段通信(例如访问互联网),绝大情况下都是使用正常的 ARP,而不是代理 ARP。 生活中的上网的经验也已经告诉我们,好像从来没有遇到或听到过 “XXX 设备不支持代理 ARP 功能,导致通信故障” 这样的问题。
很多小伙伴看到这里,会有大大的疑惑:
① “什么!我们才刚学习了代理 ARP 的实现原理,现在居然告诉说它没怎么用?”
② 那为什么要创造代理 ARP,它的真正使用场景在哪里??
③ 上述图解中,电脑跨网段通信时 ARP 到底是如何工作的???
接下来给大家划重点:
第一,代理 ARP 仅仅是正常 ARP 的一个拓展使用,是可选项而不是必要项;
第二:代理 ARP 有特定的应用场景,与网关 / 路由的设置有直接关系:当电脑没有网关 / 路由功能时,并且需要跨网站通信时,则会触发代理 ARP。换句话说,如果有网关 / 路由功能,则不需要代理 ARP;
第三:正常环境下,当用户接入网络时,都会通过 DHCP 协议或手工配置的方式得到 IP 和网关信息(所以不需要代理 ARP)。
三、ARP 与代理 ARP:不是互斥而是互补
在大家理解了代理 ARP 的工作原理和应用场景之后,接下来我们终于可以更加全面的分析开篇的这个经典问题:
当用户访问互联网的时候,到底用 ARP 还是代理 ARP?
跟网关 / 路由设置有什么关系?
数据封装又有什么区别?
我们通过下面两张图做个对比 =>
当电脑没有网关时,PC Ping 8.8.8.8,采用代理 ARP =>
当电脑有网关时,PC Ping 8.8.8.8,采用正常 ARP =>
通过上面的对比,我们得到以下信息:
① 电脑没有网关时,ARP 直接询问目标 IP 对应的 MAC 地址(跨网段),采用代理 ARP;
② 电脑有网关时,ARP 只需询问网关 IP 对应的 MAC 地址(同网段),采用正常 ARP;
③ 无论是正常 ARP 还是代理 ARP,电脑最终都拿到同一个目标 MAC 地址:网关 MAC。
为了让上面这个总结更加的通用性,我们将原有的网络拓扑稍微复杂化 =>
当电脑没有网关时(采用代理 ARP ),PC 依次 Ping 8.8.8.8、8.8.4.4、114.114.114.114=>
当电脑有网关时(采用正常 ARP ),PC 依次 Ping 8.8.8.8、8.8.4.4、114.114.114.114=>
通过上面的拓扑,我们可以得到更加通用性的总结,归纳如下:
① 当电脑没有网关(采用代理 ARP)时:“跨网段访问谁,就问谁的 MAC”
② 当电脑有网关(采用正常 ARP)时:“跨网段访问谁,都问网关的 MAC”
③ 无论哪种 ARP,跨网段通信时,发送方请求得到的目标 MAC 地址都是网关 MAC。
注明:网关(Gateway)、下一跳(Next-hop)、路由器(Router)都指的是离发送方最近的三层(或多层)设备,具备三层和路由转发功能。
举例:我们通过 WiFi 上网时,网关就是无线路由器,它帮忙将电脑和手机的数据转发到互联网;所以,我们访问互联网时(无论访问谁),电脑和手机采用的目的 MAC,都是无线路由器的 MAC。有兴趣的小伙伴都可以跟着我验证下(请见下面章节)。
四、ARP 与代理 ARP 实战指南
为了让大家更直观理解,真正 “亲眼所见” 上面学到的技术原理,这里我带大家 在真实网络和虚拟环境分别验证。第一个实验,主要是针对没任何命令基础的小伙伴,大家可以在家就可以实验;第二个实验,主要针对有一定网络和安全基础的小伙伴,通过构造网络虚拟实验环境来验证。
(一)真实网络下 ARP 与代理 ARP 实验
这个网络中,我的电脑地址是 192.168.199.177,连接到极路由(无线路由器),通过极路由器访问互联网。这个 WiFi 网络的主机列表情况如下,这里的 PC 就是我的 Macbook。
接下来再看看极路由 MAC 地址 =>
查看我的电脑 (Macox 系统)IP 地址和网关信息,通过命令 “ifconfig” 查看 ip 地址 =>(Windows 系统则通过 “ipconfig /all” 查看 IP 地址和网关信息)
通过命令**“netstat -rn”**查看我的电脑网关设置 =>
接下来,我的电脑连续 PING 8.8.8.8 和 114.114.114.114 或其他外网地址 =>
重点来了,在我的电脑连续访问这么多外网地址之后,我们来看看 ARP 表项是怎样的,是否有 8.8.8.8、114.114.114.114、www.pinginglab(120.24.59.68)对应的 MAC 呢?
通过命令 “arp -a” 查看电脑的 ARP 缓存信息 =>
从最终的 ARP 内容来看,我的电脑只记录着本机和网关的 MAC 地址,MAC 地址 “d4:ee-07:54:c1:9e” 就是上面给大家截图的极路由 MAC。
通过这个真实网络的实验,我们可以验证了以下内容:
① 真实网络中一般都是正常 ARP,而不是代理 ARP;
② 当电脑有网关(采用正常 ARP)时,无论跨网段访问谁,都直接问网关的 MAC;
③ 当第一次获取网关 MAC 之后,后续的通信都不再需要重新进行 ARP 请求。(这个是比较容易忽略的,而代理 ARP 每次访问新的外网地址,都需要再次请求)
(二)虚拟环境下 ARP 与代理 ARP 实验
网络拓扑采用 GNS3 搭建,采用 C3640 操作系统镜像 =>
① 首先为各个设备打开接口并配置 IP 地址:
PC (config)#int f0/0
PC (config-if)#no shutdown
PC (config-if)#ip address 192.168.1.1 255.255.255.0
Router (config)#int f0/0
Router (config-if)#no shutdown
Router (config-if)#ip address 192.168.1.254 255.255.255.0
Router (config-if)#int f1/0
Router (config-if)#no shutdown
Router (config-if)#ip address 8.8.8.1 255.255.255.0
Server (config)#int f0/0
Server (config-if)#no shutdown
Server (config-if)#ip address 8.8.8.8 255.255.255.0
② 为各个设备设置路由信息:
a. 关闭 PC 上路由功能,模拟主机并查看路由表(此时的电脑没有设置网关)
PC (config)#**no ip routing
PC#**show ip route
\# Default gateway is not set
Host Gateway Last Use Total Uses Interface
b. 设置并查看 Router 和 Server 路由表,保证联通,模拟互联网(这里 Router 已有全网的直连路由,Server 需要设置返回内网的路由;实际环境应该通过 NAT 返回,这里不再深入)
Router#show ip route
Codes: C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route
Gateway of last resort is not set
8.0.0.0/24 is subnetted, 1 subnets
C 8.8.8.0 is directly connected, FastEthernet1/0
C 192.168.1.0/24 is directly connected, FastEthernet0/0
Server (config)#**ip route 192.168.1.0 255.255.255.0 8.8.8.1
Server#**show ip route
Codes: C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route
Gateway of last resort is not set
8.0.0.0/24 is subnetted, 1 subnets
C 8.8.8.0 is directly connected, FastEthernet0/0
S 192.168.1.0/24 [1/0] via 8.8.8.1
③ 查看 PC/Router/Server 的接口 MAC 地址:
PC#show int f0/0
FastEthernet0/0 is up, line protocol is up
Hardware is AmdFE, address is**cc05.1f56.0000 (bia cc05.1f56.0000)
Internet address is 192.168.1.1/24
Router#show int f0/0
FastEthernet0/0 is up, line protocol is up
Hardware is AmdFE, address is**cc07.1f56.0000 (bia cc07.1f56.0000)
Internet address is 192.168.1.254/24
Router#show int f1/0
FastEthernet1/0 is up, line protocol is up
Hardware is AmdFE, address is**cc07.1f56.0010 (bia cc07.1f56.0010)
Internet address is 8.8.8.1/24
Server#show int f0/0
FastEthernet0/0 is up, line protocol is up
Hardware is AmdFE, address is**cc06.1f56.0000 (bia cc06.1f56.0000)
Internet address is 8.8.8.8/24
④通过 Wireshark 抓取 PC 和 Router 链路的数据包,并让 PC ping Server(8.8.8.8),查看 ARP 问答信息:
PC#ping 8.8.8.8
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 8.8.8.8, timeout is 2 seconds:
!!!! (一个 ping 来回为一个!标识,而第一个点,代表此时正在 arp)
Success rate is 80 percent (4/5), round-trip min/avg/max = 44/47/48 ms
从数据包可以看到,由于 PC 没有设置默认网关,所以直接采用代理 ARP 方式询问: 即直接询问跨网段目的 8.8.8.8 的 IP 地址。而由于路由器 Router 默认开启了代理 ARP 功能,所以直接用自己的 MAC 地址回应了。这里的 cc:07:1f:56:00:00 即路由器的 MAC 地址。这里顺便查看下 PC 的 arp 表:
PC#show arp
Protocol Address Age (min) Hardware Addr Type Interface
Internet 8.8.8.8 9 cc07.1f56.0000 ARPA FastEthernet0/0
Internet 192.168.1.1 - cc05.1f56.0000 ARPA FastEthernet0/0
因此,这里便验证了:当电脑没有设置网关信息,则采用代理 ARP。
我们接着验证另外一个点:当采用代理 ARP 时,会 "受限于沿途网关设备",例如网关设备(路由器)可能不支持代理 ARP 或关闭代理 ARP 功能,此时电脑就无法与外网 IP 实现通信。
怎么验证呢?这里我们需要关闭路由器接口的代理 ARP 功能,并且清空电脑 PC 的 arp 表=>
Router (config)#int f0/0
Router (config-if)#no ip proxy-arp
PC#clear arp
PC#ping 8.8.8.8
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 8.8.8.8, timeout is 2 seconds:
.....
Success rate is 0 percent (0/5)
查看底层数据包交互过程 =>
当路由器关闭代理 ARP 时,此时电脑 “苦苦哀求” 外网 8.8.8.8 的 MAC 地址,而路由器直接丢弃不再返回,由于电脑没有目标 IP 对应的 MAC 信息,所以通信失败,即 **…**我们来看下此时 PC 的 arp 表是怎样的 =>
PC#show arp
Protocol Address Age (min) Hardware Addr Type Interface
Internet 8.8.8.8 0 Incomplete ARPA
Internet 192.168.1.1 - cc05.1f56.0000 ARPA FastEthernet0/0
⑤ 为 PC设置默认网关,重新 ping 8.8.8.8,看看能不能通 =>
PC (config)#**ip default-gateway 192.168.1.254
PC#**ping 8.8.8.8
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 8.8.8.8, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 44/244/1040 ms
可以看到,当电脑具备网关信息之后,此时直接采用 ARP 询问网关的 MAC,即去往 8.8.8.8 的时候直接询问 192.168.1.254 的 MAC,这个时候不管 Router 有没有开启代理 ARP,也会正常回应 PC 的 ARP 询问,我们来看看底层数据包截图 =>
四、代理 ARP 总结
① 本章节我们深入学习了代理 ARP 的原理和实践,在文章的开头,我们通过一个引子,帮大家矫正一个误区:跨网段通信时,就一定要用到代理 ARP;
② 代理 ARP 是一个 “善意的欺骗”,当电脑要跨网段访问外网设备时,网关设备用自己的 MAC 返回;
③ 代理 ARP 和 ARP 的具体实现,跟电脑是否有设置网关有直接的关系;有网关通过 ARP,没网关通过代理 ARP;代理 ARP 可以看成是 ARP 的补充;
④ 代理 ARP 会 “受限于沿途网络设备”,真实网络里面一般都直接用 ARP 获取 MAC 地址。
图解 ARP 协议(五)免费 ARP:地址冲突了肿么办?
陈鑫杰 拼客院长陈鑫杰 2017 年 09 月 03 日 10:30
一、免费 ARP 概述
网络世界纷繁复杂,除了各种黑客攻击行为对网络能造成实际破坏之外,还有一类安全问题或泛安全问题,看上去问题不大,但其实仍然可以造成极大的杀伤力。今天跟大家探讨的,也是技术原理比较简单,但实际防范比较头疼的一个问题:地址冲突。
这个局域网中,大家所在 IP 网段是 192.168.1.0/24,PC1 的地址是 192.168.1.1,而 PC2 和 PC3 的地址发生冲突,都是 192.168.1.2。那么,如果 PC1 需要将数据包发送给 192.168.1.2,数据包最终到了 PC2 还是 PC3 手里?还是负载均衡?不管结果如何,这里的地址冲突肯定会对正常通信造成麻烦。
上面这个电脑 / 手机之间的地址冲突,大家可能觉得没什么太大的问题,那么接下来再看下面这个图片 =>
这里的 Server1 和 Server2 处在 [服务集群] 中,提供着企业的某种服务,例如 Web 网站、邮箱系统、FTP 文件服务器等,此时服务器的地址发生了冲突,都是 10.1.1.1。这种地址冲突则会影响大规模的用户无法访问这个服务器,若服务器承载的是核心业务,对于企业则会造成极大的影响。
所以,地址冲突问题可大可小,可能网络运维人员部署上的疏忽,也可能是普通电脑小白无意导致的,更有可能是主动的黑客行为,例如攻击者制造地址冲突场景,扰乱正常业务,导致业务服务中断。
因此,**如何在 IP 地址冲突的时候及时检测,并且做出解决方案呢?
二、免费 ARP 原理
Gratuitous ARP,被翻译为『免费 ARP』也被称为『无故 ARP』,用于检测局域网内的 IP 地址冲突,在一定程度上能够给用户和网络运维人员提供帮助。相比『免费』这个翻译,『无故』这个词其实会更加好理解:"在没有人问自己的情况下,无缘无故自问自答"。
这项技术不需要电脑和服务器安装什么安全软件或产品例如防火墙之类的,也不需要交换机和路由器购买什么 license,只要设备具备联网功能(有网卡)就内置了这项功能,由于免费 ARP 本质是 ARP 协议的实现,所以只要有 TCP/IP 协议栈的网卡,就能支持。相比其他安全防御技术,**免费 ARP 是一项轻量级的 “用户无感知” 的技术。
接下来,我们来回顾下之前的图片 =>
当用户发送数据包给 192.168.1.2 的时候,交换机会将数据包转发给谁呢?
① 根据我们之前学过的 ARP 原理,交换机会拆开这个数据包,并且根据目的 MAC 进行转发;
② 那么 PC1 在数据封装的时候,目的 MAC 是封装 PC2 还是 PC3 的 MAC?
③ 目标 MAC 则取决于电脑本地的 ARP 缓存表,所以 PC1 最终把数据包给 PC2 还是 PC3,则取决于收到的 ARP 回应,并且根据 “后到优先” 原则作出选择。
所以,若 PC2 提前回应 ARP,则 PC1 一直发给 PC3;若 PC3 提前回应 ARP,则 PC1 一直发送给 PC2。还有一种情况,PC2 和 PC3 交替回应 ARP,PC1 有可能将部分数据给 PC2,部分数据给 PC3(而 PC1 则处于懵逼状态,因为关于 192.168.1.2 的 MAC 映射一直在变动)。这个更多是理论推导,实际情况不同设备测试出来的效果有些差异,后面章节我会带大家做真实和虚拟网络的实验。
我们来看看免费 ARP 是如何工作的并介入这场冲突的?
当电脑检测到自己的 IP 地址跟其他电脑冲突时,它们会相互发送免费 ARP(“互怼”),用来提醒对方:你的 IP 地址跟我的冲突啦! 这里要注意一点:免费 ARP 是 以 ARP Request 或 Reply 广播形式发送,将 IP 和 MAC 地址信息绑定,并宣告到整个局域网。如果在宣告的过程中,其他电脑监听到,并且地址跟自己一样,也会直接参与这个 “互怼” 过程。
上面 PC2 和 PC3 一直不停地对外发送免费 ARP:我的地址是 192.168.1.2,MAC 是 xxx。与此同时,同一局域网的其他主机,则根据这两个免费 ARP 信息不断的修改本地 ARP 表,192.168.1.2 一会映射到 MAC2,一会映射到 MAC3。
那么,这个混乱的争抢过程,会不会停下来呢?
可能会持续一段时间,也可能一直持续下去(后面有实验验证)。冲突方之间可能会一直发送,直到有一边做出让步并修改 IP 地址。(不同系统解决方法不同)
很多人在这里开始有疑惑,即便免费 ARP 帮我们检测到了地址冲突,但是也是在协议底层在 “互怼”,我们作为 “主人”,如何收到地址冲突提示,并且做出修改和让步呢? 因为无论是普通用户还是专业工程师,也不可能天天挂在 wireshark 这种抓包软件,时时刻刻盯着免费 ARP 包,判断是否有人跟我们地址冲突了。所以,这又涉及到电脑(操作系统)如何根据免费 ARP 的地址冲突检测,更好的提示或帮助用户了。
目前行业的解决方案是这样的:如果是图形化操作系统,例如 Windows 或者 MacOS,是通过系统弹框的方式提示用户;而如果是命令行操作系统(交换机 / 路由器 / 防火墙),则通过日志报错信息提示用户。
也就是说,无论普通电脑还是专业的防火墙设备,通过免费 ARP 检测到地址冲突之后,设备都会弹出来跟他说:**喂,主人,你地址跟人家冲突了,该改改了!
这是 Windows 和 MacOS 的地址冲突弹框告警,引导用户修改本机 IP 地址 =>
这是思科路由器 IOS(网际操作系统)的地址冲突日志信息,引导网络运维人员修改 IP 地址 =>
% IP-4-DUPADDR: Duplicate address 192.168.1.2 on FastEthernet0/0, sourced by cc02.394f.0000
所以,当地址发生冲突时,根据免费 ARP 引起的弹框和日志告警,用户或者管理员便可以对 IP 地址进行修改,从而解决通信问题。例如,下面的 PC2 和 PC3,只要一方修改了地址即可 =>
三、免费 ARP 实战指南
免费 ARP 出现的场景非常多,例如地址冲突时、地址修改或变更时、DHCP 分发地址时、网关冗余协议交互时(例如 HSRP)、TFTP 传输数据时……
不同的场景,抓到的免费 ARP 数据包,底层结构都会有所差异,可能是基于 ARP 请求广播发送的,也可能是基于 ARP 回应广播发送的(没看错!ARP 回应这里是广播方式)
为了让大家 “亲眼所见”,同时可跟着我一起实践,更好吸收这块的知识,这里我设计了真实和虚拟网络来进行实战,并抓取免费 ARP 数据包,通过数据包解构原理。
(一)真实网络下 免费 ARP 实战
① 跟上一篇文章中代理 ARP 的真实网络一样,我的网络拓扑是这样的:
为了让这个实验更有通用性,我加入了一台 Windows 电脑。此时登录无线路由器(极路由)查看局域网主机列表:
还是原来的配方… 苹果全家桶和一台 Windows 电脑。实物图大概是这样的:
② 接下来,为了看到地址冲突时,免费 ARP 的数据包交互,我们在 Windows 和 MacOS 同时开启 Wireshark 并抓包本机电脑的数据包,设置 arp 过滤。
macbook 端截图如下:
Windows 端截图如下:**(Windows 10 跟无线路由器一直在交互)
③ 在 Mac 端,将 IP 地址设置为跟 Windows 地址一样,从 192.168.199.177 改为 192.168.199.152
点击应用之后,开始观察两边电脑弹框和 wireshark 的 ARP 包交互过程 =>
上图可以看到 macbook 的弹框告警了,接下来我们来分析下此时 Mac 和 windows 抓到的数据交互过程 =>
我的 windows 电脑很明确的回应 Mac 电脑:这个地址 199.152,已经被我用了。这个过程重复了 3 次。根据抓包,这个过程后面还在不断的持续中,不管在 win 还是 mac,都能抓到类似的问答过程。
由于 macbook 电脑此刻不能上网,所以还 “不屈不挠” 的询问着,它在想:没准 windows 下线了,没有回应了呢?(如果 win 没有回应,则说明它下线了或改为其他地址了,那么 mac 就可以使用)
④ 接下来,我们将 windows 的网络断开,然后在 macbook 这端观察 arp 交互和网络连接状态:
此时,macbook 跟往常一样发生三个 arp 请求,询问 152 这个地址是否有人使用,由于 windows 已经下线,所以三次都没有应答。紧接着有三个 gratuitous arp 数据包,跟上面三个请求包几乎是一样的,只有一个区别,就是发送者的 IP 地址此时从 0.0.0.0 修改为 192.168.199.152。这意味着mac 确认了 152 没有其他人使用,并且认为此刻自己有资格用上 152 这个地址了。
从 wireshark 抓包来看,之前的 arp 请求好像没有标记 “gratuitous” 这个关键词,那么算不是是免费 arp 或者无故 arp 呢?这个其实也是比较多讨论和争议。如果从 "自己问自己的角度" 出发,这两种 arp 都算是免费 arp,因为都是在问自己配置的这个新地址 192.168.199.152,而且目的都是一致的,都是为了检测是否地址可用是否存在冲突。
当然,更严谨的的免费 arp 包,则是需要 “发送方 ip” 和 “接收者 ip” 是一致的,就是下面这种 arp 请求包,都有 192.168.199.152 这个地址。所以,这一小知识点的话,我个人觉得不用太纠结,通过数据包结构还原整个免费 arp 工作原理才是最重要的。
从 wireshark 截图可以看到,经过了上面这些免费 ARP 的请求之后,由于一直没有其他设备回应 152 这个地址,所以 macbook 电脑再次询问网关 192.168.199.1 的物理地址,拿到网关的 ARP 回应之后,我的 macbook 便可以正常通信了。
⑤【接下来是拓展内容,涉及 dhcp 协议,新手的话可暂时忽略这一小段…】
这个实验还可以继续深挖下来,此时让 windows 电脑重新接入这个 wifi 网络,之后同样会出现免费 arp 的交互过程,只不过多了一个 dhcp 协议交互,并且最终 windows 使用了 192.168.199.153 这个地址接入 wifi 网络。先整理下流程再截核心数据包 =>
-
当 windows 重新接入网络之后,会通过 dhcp 重新获取 192.168.199.152 这个地址(由于 macbook 的 152 这个地址是由我手工静态指定的而不是路由器分配,所有路由器仍然通过 dhcp 地址池分配);
-
windows 收到这个地址之后,第一时间便发送免费 arp 包进行地址检测,但是发现这个地址已经被 macbook 占用了!因此,通过 dhcp decline 数据包向无线路由器取消这个地址;
-
windows 重新获取 192.168.199.153 这个地址,通过免费 arp 重新检测,发现没有人回应了,说明这个地址可用,后续用这个地址接入 wifi 网络。
windows 重新接入网络的 dhcp 交互包 =>
windows 获取地址后通过免费 arp 检测到 macbook=>
windows 通过 dhcp decline 放弃 152,并重新获取 153 这个地址 =>
windows 通过免费 arp 检测,发现 153 地址没其他人用,所以接入了网络 =>
总结:通过这个真实网络,我们构造了 windows 和 macbook 地址冲突的环境,通过 wireshark 抓取免费 arp 数据包,学习了免费 arp 的地址检测功能以及数据包结构。
① 当电脑(手工)修改的地址跟局域网其他主机地址一样的时候,通过免费 arp 协议,电脑会弹框提醒并无法上网;
② 当相同地址的电脑其中一台下线时,通过免费 arp 可以证明此地址可使用(没人争抢 / 回应),此时便可接入网络;
③ 当电脑通过 DHCP 获取地址时,会通过免费 arp 检测这个地址是否可用,若已经被使用,则重新通过 dhcp 获取新的地址,再接入互联网。
④ 这里抓取的免费 ARP 包是请求广播包,并且特征是 “自己问自己”。**(“自己答自己” 的回应广播包,在下面的实验有)
(二)虚拟网络下 免费 ARP 实战
网络拓扑采用 GNS3 搭建,采用 C3640 操作系统镜像 =>
① 为每个路由器配置 IP 地址,所在网段为 192.168.1.0/24=>
R1 (config)#int f0/0
R1 (config-if)#no sh
R1 (config-if)#**ip add 192.168.1.1 255.255.255.0
R2 (config)#int f0/0
R2 (config-if)#no sh
R2 (config-if)#**ip add 192.168.1.2 255.255.255.0
R3 (config)#int f0/0
R3 (config-if)#no sh
R3 (config-if)#**ip add 192.168.1.3 255.255.255.0
② 在路由器相连链路上抓包,路由器相互 PING 通,并查看 ARP 表 =>
(这里用 R1 举例,其他类似)
R1#ping 192.168.1.2
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.1.2, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 64/64/64 ms
R1#ping 192.168.1.3
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.1.3, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 64/64/68 ms
R1#show arp
Protocol Address Age (min) Hardware Addr Type Interface
Internet 192.168.1.1 - cc00.394f.0000 ARPA FastEthernet0/0
Internet 192.168.1.3 0 cc02.394f.0000 ARPA FastEthernet0/0
Internet 192.168.1.2 0 cc01.394f.0000 ARPA FastEthernet0/0
③ 让 R3 和 R2 的地址冲突,例如将 R3 的地址从 192.168.1.3 配置为 192.168.1.2,在 R2 和 R3 上面开启 arp 调试 “debug arp”,在 R1 上面查看 ARP 表,通过 wireshark 观察底层免费 ARP 包交互过程 =>
R3 (config)#int f0/0
R3 (config-if)#**ip add 192.168.1.2 255.255.255.0
一旦 R3 设置了上面的地址,跟 R2 冲突之后,此时 R2 和 R3 的命令行界面开始不停断 “刷屏”=>
核心日志信息:
R2#
*Mar 1 00:13:25.519: % IP-4-DUPADDR: Duplicate address 192.168.1.2 on FastEthernet0/0, sourced by cc02.394f.0000
R2#
*Mar 1 00:13:56.259: % IP-4-DUPADDR: Duplicate address 192.168.1.2 on FastEthernet0/0, sourced by cc02.394f.0000
R2#
*Mar 1 00:14:27.167: % IP-4-DUPADDR: Duplicate address 192.168.1.2 on FastEthernet0/0, sourced by cc02.394f.0000
虽然网络设备没法像 Windows 或者 Macos 弹框告警,但是通过日志提示同样可以达到同样的目的,让网络运维人员作出修改。
Cisco IOS 通过免费 ARP 检测到地址冲突之后,解决的方法相对 “暴力”,例如,R2 和 R3 直接会持续发送免费 ARP(reply 广播包),直到地址冲突问题被解决掉。可以通过 wireshark 数据包观察 =>
此时再观察 R1 上面的 ARP 表,关于 192.168.1.2 这个地址的映射信息:
R1#show arp
Protocol Address Age (min) Hardware Addr Type Interface
Internet 192.168.1.1 - cc00.394f.0000 ARPA FastEthernet0/0
Internet 192.168.1.3 6 cc02.394f.0000 ARPA FastEthernet0/0
Internet 192.168.1.2 0 cc02.394f.0000 ARPA FastEthernet0/0
R1#show arp
Protocol Address Age (min) Hardware Addr Type Interface
Internet 192.168.1.1 - cc00.394f.0000 ARPA FastEthernet0/0
Internet 192.168.1.3 6 cc02.394f.0000 ARPA FastEthernet0/0
Internet 192.168.1.2 0 cc01.394f.0000 ARPA FastEthernet0/0
R1#show arp
Protocol Address Age (min) Hardware Addr Type Interface
Internet 192.168.1.1 - cc00.394f.0000 ARPA FastEthernet0/0
Internet 192.168.1.3 6 cc02.394f.0000 ARPA FastEthernet0/0
Internet 192.168.1.2 0 cc02.394f.0000 ARPA FastEthernet0/0
R1#show arp
Protocol Address Age (min) Hardware Addr Type Interface
Internet 192.168.1.1 - cc00.394f.0000 ARPA FastEthernet0/0
Internet 192.168.1.3 6 cc02.394f.0000 ARPA FastEthernet0/0
Internet 192.168.1.2 0 cc01.394f.0000 ARPA FastEthernet0/0
……
可以看到,由于免费 ARP 是一种广播的形式 ,所以 R1 同处一个局域网可以收到,并且 ARP 信息被不断修改,一会将 192.168.1.2 指向 R2 的 MAC 地址,一会指向 R3 的 MAC 地址。
这个过程会一种持续下去,直到地址做了修改,这里我们将 R3 的 IP 地址重新修改为 192.168.1.3,之后网络便恢复了平静。
总结:通过这个虚拟网络,我们构造了路由器地址冲突的环境,同样验证了免费 ARP 能够检测 IP 地址冲突的功能,当然,这里跟 Windows 和 Macos 的处理方式有一些差别,例如 Cisco 路由器检测到免费 ARP 之后,会保持非常高频率的 “互怼” 过程,然后不断报出错日志,督促管理员感觉修改地址。除此之外,数据包结构也有差异,Windows 和 Macos 是 “自己问自己” 的 arp request 包,而 cisco ios 是 “自己答自己” 的 arp reply 包。
四、总结:地址冲突了怎么办?
① 对于普通用户而言,当看到电脑弹框告警说明地址有冲突时,在不懂技术的情况下,可以尝试重启家里的路由器,这样可以重新为局域网的电脑分配地址;
② 路由器不是自己的,接入的是租房网络、校园网络等第三方网络,当看到电脑弹框告警说明地址有冲突时并且无法管理路由器的时候,可以尝试手工修改本机电脑的 IP 地址,无论是 Windows 还是 Macos,直接进入网卡设置修改即可,怎么做手工修改呢?例如电脑地址是 192.168.1.1,提示冲突的话,那么可以在原有数字的基础上递增 1 或者 10,直到显示不冲突,例如修改为 192.168.1.2、192.168.1.3 或者 192.168.1.11、192.168.1.21,以此类推… (这种方法未必能保证解决,但是在管理员介入之前,至少算是一种解决方案);
③ 对于专业的网络和安全运维人员而言,当看到网络地址冲突,则需要考虑自己的 DHCP 部署、IP 地址规划有没有问题,或者找出网络中是否有 “捣蛋鬼” 自己私设 IP 之类的;
④通过本章节的学习,我们掌握了免费 ARP 不同网络环境下的实现,例如 “自己问自己” 和 “自己答自己” 两种广播包方式,也了解了电脑和网络设备的不同机制。
图解 ARP 协议(六)RARP 与 IARP:被遗忘的兄弟协议
原创 陈鑫杰 拼客院长陈鑫杰 2017 年 09 月 05 日 17:11
一、概述
在我第一次接触 ARP 协议的时候,发现这协议挺简单的,“一去一回 通过 IP 拿到 MAC 地址”,整个过程在 1s 内就搞定了。后面学到了代理 ARP,发现也不过是变了个法子,做了次 “欺骗”,本质还是一样。接下来又学到了免费 ARP,顿时觉得网络协议设计者太牛了,一个协议居然能折腾出这么多玩法,连 “地址检测” 都能实现。等学到了 ARP 嗅探和欺骗,又发现其实黑帽子更爱折腾,谁能想到这么简单的协议,居然能制造工具出来做内网探测和欺骗攻击,引发这么大的危害。
当我以为 ARP 这一知识点在我的技术旅途中应该就此翻篇了的时候,又冒出了RARP 和 IARP这两,对比其他 ARP 协议的研究,当时学这两个协议是心不甘情不愿的:
第一,无论学习还是工作,极少碰到,真正 “翻篇” 了的协议;
第二,名字记不住,“翻转”" 反转 ““逆向”” 反向 ",不同技术文档的中文翻译有时候完全相反,没法记。毕竟汉语这么博大精深,就记住英文就好了,后面发现更加糟糕,因为 reverse 和 inverse 这两个单词仅仅 2 个字母之差,老外太欺负人了,这根本没法记。
我在想,肯定也有很多朋友学到这个时候遇到了上面同样的问题和纠结,有些坚持研究通透有些中途离开。然后我又思考了一番:ARP 协议通过几个字段的细微调整,便能够适用于这么多不同场景,例如 ARP、PARP、GARP、RARP、IARP,这是不是证明了它在 TCP/IP 协议栈里面独特的位置,有哪个协议能做到这一点,有这么多花样? 所以,我的建议是:既然到了这一步了,就继续搞清楚吧,否管它是否用的上。
那么,什么是 RARP 和 IARP?中文叫法是什么?它们各自的应用场景在哪里?数据包又是怎样的?
二、RARP 原理与实践
RARP(Reverse ARP)即反向 ARP 或者翻转 ARP,顾名思义,它跟常规的 ARP 功能恰恰是相反的,ARP 是实现 IP 到 MAC 地址的映射,而 RARP 是实现 MAC 到 IP 地址的映射。
什么样的设备或者场景需要用到 RARP 呢?其实 RARP 原先在设计的时候,是适用于大部分终端设备的,不仅仅是无盘工作站,它的功能就是根据 MAC 获取 IP 地址,功能跟 DHCP 是一样的。
例如,一个电脑刚接入网络,没有 IP 地址就无法上网,此时它便会通过本地 MAC 地址,对外发送 RARP Request 广播请求,看看局域网里面是否有 RARP Server,若 Server 上面有关于此 MAC 地址的映射 IP,则会向此电脑返回 RARP Reply 回应,电脑便获取了 IP 地址 =>
RARP 通过非常精简的交互实现了 IP 地址的获取,但同时也暴露了一些问题:
① RARP Server 必须提前将 MAC 和 IP 的映射静态绑定在本地;若没有提前绑定,则电脑用自己 MAC 询问时,Server 也不会回应;
② RARP Server 只能给电脑分配 IP 地址,不包括其他信息,包括网关、DNS 等信息;
③ RARP 基于二层封装,只能运行在同一网段;每个网段分配地址,都需要一个 RARP Server。
在 RARP 的基础上,后面又有了 Bootp 协议,直译过来便是 “启动协议”,功能同 RARP,也是用于电脑接入网络时,用来获取 IP 地址的。但是毕竟做了增强,Bootp 协议能让电脑启动时,不仅仅获取 IP 地址,而且能获取到网关地址,从而让电脑实现跨网段通信。
Bootp 协议虽然让电脑能够获取到更多的信息,但是仍然没有解决最大的问题:
服务器仍然需要提前手工绑定 MAC 和 IP 地址,而对于现在的移动网络或者公共网络而言,这根本无法实现。
因为用户什么时候接入,接入的 MAC 是多少,管理员没法提前知道。这就有了后面的 DHCP,DHCP 通过动态分配的方式解决了这个诟病,并且通过 DHCP 中继技术实现了跨网段地址分配,实现了全网 IP 地址的统一管理。
小结:RARP 是一种逝去的地址分配技术,是 Bootp 和 DHCP 的鼻祖,目前我们的电脑基本不会用到这个协议,只有部分无盘工作站等情况需要用到。
为了让大家更深入理解 RARP,这里我们从数据包结构来解构它的功能。RARP 的数据包比较难抓取,不像常规的 ARP 和 DHCP 协议,这里给大家提供一个思路:对于比较难找的协议数据包,除了搭建特殊的实验环境抓取之外,也可以借助一些 [数据包生成工具] 来实现,例如 nmap 扫描器里面集成的nping 工具,可以生成非常多的协议包,包括 arp、icmp、udp、tcp 等等。
nmap 的安装以及 nping 的使用,可以到 https://nmap/nping 下查询。这里给大家演示如何用 nping 生成 rarp 数据包,下图是我们要 “人为” 构造 出来的交互场景 =>
我的 Macbook 已经安装了 nmap,自带了 nping 工具,跟 ARP/RARP 相关的帮助命令如下:
jayking:~ jaykingchen$**nping
Nping 0.7.60 ( https://nmap/nping )
Usage:**nping [Probe mode] [Options] {target specification}
TARGET SPECIFICATION:
Targets may be specified as hostnames, IP addresses, networks, etc.
Ex: scanme.nmap, microsoft/24, 192.168.0.1; 10.0.*.1-24
ARP/RARP PROBE MODE:
--arp-type <type> : Type: ARP, ARP-reply, RARP, RARP-reply.
--arp-sender-mac <mac> : Set sender MAC address.
--arp-sender-ip <addr> : Set sender IP address.
--arp-target-mac <mac> : Set target MAC address.
--arp-target-ip <addr> : Set target IP address.
为了能够抓取到 rarp 的请求和回复包,首先打开 wireshark 抓取电脑网卡流量并设置 arp 过滤,然后采用两条命令:第一条命令模拟我的电脑发起的 RARP 请求包,第二条命令模拟局域网网关设备(极路由)返回的 RARP 回复包。
jayking:~ jaykingchen$ sudo**nping --arp-type RARP --arp-sender-mac ac:bc:32:8b:56:df --arp-sender-ip 0.0.0.0 --arp-target-mac ac:bc:32:8b:56:df --arp-target-ip 0.0.0.0 192.168.199.255
Starting Nping 0.7.60 ( https://nmap/nping ) at 2017-09-04 23:57 CST
SENT (0.0077s) RARP who is AC:BC:32:8B:56:DF? Tell AC:BC:32:8B:56:DF
SENT (1.0079s) RARP who is AC:BC:32:8B:56:DF? Tell AC:BC:32:8B:56:DF
SENT (2.0084s) RARP who is AC:BC:32:8B:56:DF? Tell AC:BC:32:8B:56:DF
SENT (3.0111s) RARP who is AC:BC:32:8B:56:DF? Tell AC:BC:32:8B:56:DF
SENT (4.0159s) RARP who is AC:BC:32:8B:56:DF? Tell AC:BC:32:8B:56:DF
Max rtt: N/A | Min rtt: N/A | Avg rtt: N/A
Raw packets sent: 5 (210B) | Rcvd: 0 (0B) | Lost: 5 (100.00%)
Nping done: 1 IP address pinged in 5.02 seconds
jayking:~ jaykingchen$ sudo**nping --arp-type RARP-reply --arp-sender-mac d4:ee:07:54:c1:9e --arp-sender-ip 192.168.199.1 --arp-target-mac ac:bc:32:8b:56:df --arp-target-ip 192.168.199.153 192.168.199.153
Starting Nping 0.7.60 ( https://nmap/nping ) at 2017-09-05 00:03 CST
SENT (0.8094s) RARP reply: AC:BC:32:8B:56:DF is at 192.168.199.153
SENT (1.8107s) RARP reply: AC:BC:32:8B:56:DF is at 192.168.199.153
SENT (2.8114s) RARP reply: AC:BC:32:8B:56:DF is at 192.168.199.153
SENT (3.8138s) RARP reply: AC:BC:32:8B:56:DF is at 192.168.199.153
SENT (4.8159s) RARP reply: AC:BC:32:8B:56:DF is at 192.168.199.153
Max rtt: N/A | Min rtt: N/A | Avg rtt: N/A
Raw packets sent: 5 (210B) | Rcvd: 0 (0B) | Lost: 5 (100.00%)
Nping done: 1 IP address pinged in 5.82 seconds
此时,从 Wireshark 抓取到的 RARP 请求和回复包如下 =>
至此,关于 RARP 的原理和数据包分析便完成了。
三、IARP 原理与实践
IARP(Inverse ARP)即逆向 ARP,这个没法 “顾名思义”,因为它既不是 IP 到 MAC 的映射,也不是 MAC 到 IP 的映射,而是DLCI 到 IP 的映射。相比前面所有其他 ARP 协议,IARP 的应用场景不是在以太网(局域网)里面,而是在帧中继网络(广域网) 里面。
要真正理解 DLCI 和 IARP,需要有一些帧中继网络技术背景,这里简单说下:
DLCI(Data Link Connection Identifier)数据链接连接标识,是帧中继网络里面的二层地址,好比以太网里面的 MAC 地址,用于标记帧中继网络里面的虚拟专线**。示图如下:
图中 R1 和 R2 通过专线连接到帧中继交换机,对应的 DLCI 号分别是 102 和 201。交换机通过转发表进行数据交换:根据接口收到数据包的 DLCI,查看对应的接口,转发到匹配的线路。
所以说,帧中继网络里面,DLCI 类似 MAC,决定了数据包的去向。那么,DLCI 和 IP 的映射关系又是如何的呢?我们来看下帧中继网络里面的数据封装,以 R1 ping R2 为例:
从这里我们可以看到帧中继网络的数据封装和转发模式都不同于以太网:
① 二层封装的时候,不需要源目地址,只需要本地 DLCI;例如 10.1.1.1 ping 10.1.1.2,源目 IP 地址这个跟以太网的封装是一样的,但是链路层封装不需要目标 DLCI 201。
② 交换机会改变二层地址信息,例如这里的 DLCI 从左边的 102,变成了右边的 201。
理解了这些差异,我们才能得到这里 DLCI 和 IP 的映射关系:即目标 IP 地址与本地 DLCI 的映射。例如 R1 要访问 10.1.1.2,此时需要映射到本地的 102;而 R2 要访问 10.1.1.1,则需要映射到本地的 201。
更完整的说明:逆向 ARP 解决帧中继网络里目标 IP 地址与本地 DLCI 的映射,并且让通信双方生成帧中继映射表(frame-relay map)。好比 ARP 解决了以太网里面目的 IP 与目标 MAC 的映射,并且让通信方生成 ARP 映射表。
接下来,我们通过实验环境来验证,这里可以通过 GNS3 模拟器搭建以上环境,并且抓包验证 =>
①为 R1 和 R2 打开接口,封装帧中继,并配置 IP 地址:
R1 (config)#int s0/0
R1 (config-if)#no shutdown
R1 (config-if)#**encapsulation frame-relay
R1 (config-if)#ip address 10.1.1.1 255.255.255.0
R2 (config)#int s0/0
R2 (config-if)#no shutdown
R2 (config-if)#**encapsulation frame-relay
R2 (config-if)#ip address 10.1.1.2 255.255.255.0
② 开启 wireshark 抓包,抓取 IARP 请求和回复包:
③ 查看 R1 和 R2 本地生成的 IARP 映射表:
R1#**show frame-relay map
Serial0/0 (up):**ip 10.1.1.2 dlci 102 (0x66,0x1860)**, dynamic,
broadcast,, status defined, active
R2#**show frame-relay map
Serial0/0 (up):**ip 10.1.1.1 dlci 201 (0xC9,0x3090),**dynamic,broadcast,, status defined, active
④ 测试 R1 和 R2 之间的联通并抓取 ICMP 包:
R1#ping 10.1.1.2
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 10.1.1.2, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 68/75/88 ms
至此,IARP 的原理与实践并完成了。那么,既然 IARP 能够实现帧中继的通信,为什么在文章开头,我们提到说 IARP 跟 RARP 一样,在工作中已经不常见了呢?
① 帧中继作为一种广域网远程连接技术,正在慢慢**被其他技术代替;
② IARP 不像 ARP 协议可以实时交互,它是周期性运行的,通信双方若丢失 IARP 映射表,则需要等待到固定的时间交互才能重新生成并通信。另外不同厂商不同型号对 IARP 的兼容性也可能不同。基于这些原因,一般建议直接关闭 IARP 协议,采用静态绑定的方式生成映射表,这里不再深入。(有兴趣的小伙伴可以观看我之前的技术视频教程,有深入讲解了如何关闭 IARP 和静态绑定的做法。)
四、RARP 与 IARP 协议总结
① RARP 用于实现 MAC 到 IP 的映射,本质就是为了获取 IP 地址,是 Bootp 和 DHCP 协议的鼻祖;
② IARP 用于实现帧中继网络中 DLCI 到 IP 地址的映射,生成帧中继映射表(类似 ARP 表),实现数据封装与通信;
③ 相比 ARP、免费 ARP、代理 ARP、ARP 攻防等技术,RARP 和 IARP 随着技术的更新迭代正在退出历史舞台,成为**“被遗忘的兄弟协议”**。(对于初学者来说,也算是个好事,因为终于不用 “翻转”" 反向 "“逆向” 各种分不清了)
ARP 协议大总结及下一阶段预告
到这里,我们通过六篇文章终于搞定了 ARP 协议的方方面面,包括它们的应用场景、设计思想、数据包结构、实验验证等等。
另外,为什么这次图解系列的开头是从 ARP 协议开始写,而不是从 Ethernet、IP、TCP、HTTP 或其他呢?
主要是因为 “ARP 太简单了”,简单到大家在学网络和安全的时候,都容易去忽略协议背后的很多细节,例如很多人认为 [ARP 的请求就一定是广播的,回复就一定是单播的],但 “常识” 背后也有另外一些特殊的情况。所以,通过这一个足够简单的协议,为大家解构背后相对复杂的机制,为后续深入研究开个好头。
另外一个原因就是 “ARP 很有趣”,例如协议设计者通过不同的操作代码 (opcode),做了非常多的变种(arp 是 1 和 2,rarp 是 3 和 4,iarp 是 8 和 9),做一个模型便可以多处应用;而且通过精巧的构造,就可以在内网造成极大的杀伤力。
anyway,图解 ARP 协议只是整个系列的开篇,下一阶段,我们将进入 IP 协议,探讨 IP 协议原理、数据包结构、优缺点、地址结构、IP 攻击与防御(分片攻击、欺骗攻击)……
via:
-
图解 ARP 协议(一)
https://mp.weixin.qq/s/njogTKMwLurT5UBjW1f4xA
-
图解 ARP 协议(二)ARP 攻击篇
https://mp.weixin.qq/s/niDCGUJeBA2H_D7fiuhTPg
-
图解 ARP 协议(三)ARP 防御篇:如何揪出 “内鬼” 并 “优雅的还手”?
https://mp.weixin.qq/s/EcimmL--wYGse4wuGvMjkA
-
图解 ARP 协议(四)代理 ARP:善意的欺骗
https://mp.weixin.qq/s/62XPaBvI7Ah7UYITtOCCdg
-
图解 ARP 协议(五)免费 ARP:地址冲突了肿么办?
https://mp.weixin.qq/s/4REsTEbVeOH3y9UVaK-uxQ
-
图解 ARP 协议(六)RARP 与 IARP:被遗忘的兄弟协议
https://mp.weixin.qq/s/sHs96aPkokXzKeEC20DM3Q
版权声明:本文标题:图解 ARP 协议 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1732174711h1525065.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论