TCP/IP详解(4,5)ARP和RARP,第四,五章笔记整理
1 ARP协议概述
2 ARP工作机制
2.1 ARP运行流程
首先,在ARP缓存中建立一个ARP表单来记录IP地址与MAC地址之间的对应关系。该表单中的每一项记录会随着时间逐渐消失以确保数据的有效性。
当主机接收到一个数据包 destined for a target host and its IP address is known, the sender will first check its ARP table for an existing MAC address corresponding to the given IP. If found, it will use this MAC address to transmit the packet; otherwise, it will broadcast an ARP request containing both the sender's IP and MAC addresses to query the target host's MAC address.
当广播封包被发送出去后,所有接入网络的主机都会接收到该封包。每个主机会检查接收到的封包中的IP字段是否与自身的IP地址匹配。如果IP不匹配,则主机会忽略该封包。当IP匹配时,相关主机会更新自身ARP表中的发送端MAC地址及相关IP信息。如果ARP表中已经存在该IP的信息,则会用最新的数据覆盖原有的记录。然后会向发送方发送一个ARP响应报文,通知发送方自身的MAC地址信息。
当接收端接收到ARP响应之后, 该设备也会更新自己的ARP缓存表; 然后就可以利用这些记录来进行数据传输。
- 如果发送端没有得到 ARP Reply ﹐则宣告查询失败。
如图1所示,描述了ARP广播过程。

2.2 ARP****的查询过程
ARP表格仅在TCP/IP协议被内核加载后才会建立。如果该协议未被卸载并 machines 未完全重启,则该表会在下次重新加载该协议后重建;同时网络层会发送一个ARP广播告知其他 machine 当前地址信息以确保所有设备都能保持最准确的信息
然而,在ARP缓存的空间存在一定的限制情况下,则必须在一定时间内清理过时资料以腾出空间存储新数据
可以说而言,ARP系统有相应的机制应对当ARP表项与真实地址不符的情况(例如,在当前连接尚未结束时接收目的端发送来的地址信息更新)。此外,在以下情况下也会触发该机制:一是主机过于繁忙无法响应请求;二是……
2.3节 ARP报文格式
以太网帧头部采用了将ARP报文进行封装的技术,在发送过程中完成传输。如图2所示,则属于其相应的ARP协议报文头部格式。

2.4 ARP高速缓存
有效运行的关键在于每个主机都配备了一个高效的ARP缓存机制。该缓存系统负责将最近的Internet地址映射到对应的硬件地址,并持续记录这些映射关系。其中每一个条目(项)的有效存活时间通常维持20分钟,并自创建那一刻起计算。通过执行arp -a命令或使用show arp命令可以查看完整的缓存内容
注意:无法通过IP路由器发送广播的机制存在于ARP协议中;因此无法确定远程网络设备的MAC地址。当目标主机部署于远程网络环境中时,在IP环境中,默认网关(如路由器)可以通过ARP协议获取其MAC地址;并将其数据包转发至默认网关以便完成通信流程。
3 反向ARP
反向ARP(Reverse ARP,RARP)用于把物理地址(MAC地址)转换到对应的 IP 地址。例如,在无盘工作站启动的时候,因为无法从自身的操作系统获得自己的IP地址配置信息。这时,无盘工作站可发送广播请求获得自己的IP地址信息,而RARP服务器则响应IP请求消息-为无盘工作站分配1个未用的IP地址(通过发送RARP应答包)。
RARP在很大程度上已被BOOTP、DHCP所替代,后面这两种协议对RARP的改进是可以提供除了IP地址外的其它更多的信息,如默认网关、DNS服务器的IP地址等信息。
RARP 的查询过程
然后由发送型的主机向网络发送一个广播型的RARP请求报文,并询问其他主机自身的IP地址。当发生时,网络中的RARP服务器会通过响应报文将发送端的IP地址返回给发起询问的主机.这样接收方就能确定自身的网络接口IP地址.
不过与 traditional ARP 不同,在此情形下当 R ARP 请求包被发送到网络中时, 可能会收到多个相应的 ARP 响应报文. 这是因为网络架构设计中通常会部署有多台 ARP 服务器(为了冗余配置和负载分担),因此每个接收到 R ARP 请求的服务器都会主动向目标主机发送响应. 如果这种情况持续存在, 这将会导致网络负载急剧上升, 这就需要采取相应的措施来缓解 R ARP 响应带来的负担.
第一种方法给每个执行RARP请求的主机指定一个主服务器。通常情况下,只有主服务器能够作出RARP响应,而其他主机仅起到记录接收到RARP请求的时间作用。当主服务器无法及时作出回应时,查询型主机会在等待时间超限时,通过广播重新发送RARP请求。如果接收到第一个请求后,在短时间内又收到了相同的请求,非主型主机才会作出回应。
第二种方法也十分相似:通常情况下,在接收RARP请求后,主服务器会立即做出回应;为了避免所有非主服务器在同一时间段内发送多个RARP响应消息导致冲突的情况发生,在此情况下每台非主服务器都会随机选择一个时间段进行响应。如果在规定时间内未获得来自任何一台非主服务器的确认性回答,则查询主机将会延迟一段合理的时间后再尝试一次同样的操作以确保能够及时获取到所需的响应信息。当然,在这种情况下设计者可以通过计算网络时延并将其设置在一个合理的范围内来实现这一目标
4 代理ARP
代理ARP(PROXY ARP)也被称作混杂ARP(Promiscuous ARP)(RFC 925、1027),通常用于路由器等设备上--充当位于另一网段主机响应本网段主机ARP请求的角色。
其中一个应用领域是,在这种情况下(如图5所示),主机PC1(IP地址192.168.20.66/24)试图发送报文给同一主网络内的目标主机PC2(IP地址192.168.20.20/24)。由于PC1缺乏子网信息且与目标主机位于同一主网络中,在发送ARP请求广播报文请求目标MAC地址时会遇到障碍。这时路由器会识别出目标地址属于其他子网(需注意的是:路由器的接口IP配置为28位掩码),并将其回复为自己的硬件地址(如00:04:dd:9e:cc:a0)。随后PC1将向PC2发送的数据包都发往MAC地址00:04:dd:9e:cc:a0(对应于路由器通过其E0/0接口传出的数据包)。路由器则会将这些数据包转发至目标主机PC2。(接下来,在完成对PC2角色的设置后,路由器会继续执行相同的操作以实现数据包传递功能)。这种机制使得子网化网络架构对于各主机而言显得完全透明。(即通过模拟真实MAC地址的行为来完成间接通信)。

5 无付费ARP(免费ARP)
无需付费的ARP(Gratuitous ARP)也称为GARP(Garuption)。当主机发送自己的IP地址作为目标地址进行ARP请求时会引发这种情况称为无需付费的ARP请求或者GARP请求主要有两个作用:
(1)确认是否存在重复IP地址;
(2)用于通知新的数据链路端口信息。当设备接收到一个arp请求并发现arp缓存中已有发送者的IP地址时它会更新该IP对应的MAC地址条目以实现链路状态的正确更新。
6. 应用举例
该操作是在Linux系统环境下完成的,在Windows环境下与Linux环境大体一致。通过在命令窗口中输入arp来进行相应的查询。
基本命令
该命令通过指定IP地址参数调用arp子进程来展示对应的ARP映射表信息。
当arp -a命令未提供IP地址参数时,默认会列出所有的ARP映射表信息。
arp -d ip-address : 表示删除ARP映射项。
通过使用 arp -s 命令指定 ip 和 ether 参数可以创建或更新 ARP 映射表中的条目。其中 ip 表示目标主机的 IP 地址。eth 偏移量用于标识对应的网络接口。该 ARP 条目具有临时性质,在 20 毫秒的时间段内被保留。若未指定 temp 参数,则该 ARP 映射将永久生效。
必须明确区分ARP静态项与动态项的区别。不同系统下手动配置的ARP静态项存在差异,在Linux及Windows 2000环境中,默认情况下这些静态项不会因虚假的ARP应答包的存在而发生变动;相反地,在这些系统中的动态项则会发生变化。值得注意的是,在Windows 98系统中,默认情况下手动配置的ARP静态项可能会被修改。
通常情况下,默认 ARP 映射表由动态 ARP 协议负责维护;但在少数情况下,则需手动进行配置设置以完成相关功能。此外该工具仅限于局域网络范围内使用;而广域网中的 IP 地址解析则可采用其他方式完成包括帧中继反向 ARP 等技术手段
清除ARP缓存项用于清空ARP映射表。在特定情况下(如网络重置或系统更新),需要清空并更新ARP映射表以维护网络状态的一致性。为此可采用arp -d命令逐条删除 ARP 映射项或者通过执行 clear arp-cache 一次清除所有 ARP 映射项以提高效率。
show arp :显示ARP映射表。
7. ARP 欺骗
基于TCP/IP协议构建的网络环境中
了解这些常识后,现在就可以谈在以太网络中如何实现ARP欺骗了.
7.1 同一网段的ARP欺骗

如图所示,三台主机
A: 该网络设备的IP地址为192.168.0.1, 其硬件ID标识为AA:AA:AA:AA:AA:A
B: 该网络设备的IP地址为192.168.0.2, 其硬件ID标识为BB:BB:B.B.B:B.B.B
C: 该网络设备的IP地址为192.168.0.3, 其硬件ID标识为CC:C.C.C:C.C.C
一个驻守在主机B的入侵者试图非法侵入主机A。然而这台主机上部署了防火墙。经过调查后发现,这台主机A的防火墙仅与主机C建立信任关系(开放23端口即telnet通道)。因此他必须依靠telnet通道来进行访问。那么在这种情况下,他该如何采取措施呢?
我们有这样的考虑:认为入侵者必须使主机A将主机B视为主机C。这种信任关系若建立于IP地址基础之上,则若想让主机制定自身IP地址与宿主相同(如192.168.0.3),则仅构成一种纯粹的竞争关系,并不能真正解决问题。因此我们需要采取另一种策略:即先研究并破坏主机制动(machine C),从而解除竞争关系;这一策略是可行且可操作性的
这种方法在这种特定情况下无法奏效。因为主机A和主机C之间的信任关系基于硬件地址的基础。因此,在这种配置下仍需通过ARP欺骗技术使主机A将自身ARP缓存中针对192.168.0.3节点所记录的真实硬件地址更新为主机B的实际设备编号。
我们可以人工生成一个arp\_reply响应包,并将其发送至试图欺骗的目标主机。其实现是可行的,因为该协议并未规定必须在接收arp\_echo之后才能发送响应包。这类工具多种多样,在实际应用中我们可以直接利用如snifferpro等工具捕获并修改arp响应包的内容。另外一种方法是通过人工生成相应的ARP报文来完成这一任务,在操作过程中需要指定ARP报文中的源IP、目标IP以及源MAC地址和目标MAC地址等关键参数。
通过这种方式,你可以通过伪造的ARP响应包来修改主机A上的动态ARP缓存以实现欺骗目的
下面是具体的步骤:
他先研究192.0.0.3这台主机,发现这台主机的漏洞。
-
根据发现的漏洞使主机C当掉,暂时停止工作。
-
这段时间里,入侵者把自己的ip改成192.0.0.3
他借助工具发送了一个来自IP地址192.168.0.3、带有MAC地址BB:BB:BB:BB:BB:BB的包至主机A,并按照指示让主机A更新其ARP转换表。
-
主机更新了arp表中关于主机C的ip-->mac对应关系
-
防火墙失效了,入侵的ip变成合法的mac地址,可以telnet了
这是一个ARP欺骗过程的具体描述,在同一个网络环境中发生了这种情况需要注意的是,在B和C位于不同网络环境时上面的方法就不再适用
7.2 不同网段的ARP欺骗

图中显示,A和C处于同一个网络段中,而主机B则位于另一个网络段内.具体数值如下:
A:IP地址为 192.168.0.l 硬件标识 AA:AA:AA:AA:AA:AA
B:IP 地址为 192.168.l-2 硬件标识 BB:BB:BB:BB:BB:BB
C:IP 地址为 192.l-3..h Hardy 标识 CC CC CC CC CC
当处于该网络段时(例如192.168.1网段),位于其中的主机B如何通过模仿(即假装)成为另一个实体来欺骗(即误导)宿主A呢?然而使用上述方法后,则即使这种欺骗成功实施,则由宿主B与宿主A之间的通信将无法建立telnet会话。这是因为路由器会发现这些包来自同一个私有地址空间(即同一个网段),从而不会将其转发给外部网络。
现在就涉及到了另一种欺骗手段——ICMP重定向。通过整合ARP欺骗技术和ICMP重定向技术可以基本上实现跨网段的欺骗效果。
ICMP重定向报文属于ICMP控制报文的一种类型。在特定条件下,在 router 检测到一台主机采用非最短路径协议(OSPF)路由时,它会向该主机发送一个ICMP 重定向报告,请主机更改其路由设置。 router 也会将原始数据包转发给其目标地址。
我们可以利用ICMP重定向报文达到欺骗的目的.
下面是结合ARP欺骗和ICMP重定向进行攻击的步骤:
为了使自己发送出去的非法IP包在网络中能够长时间存活,
在调整ip包生存时间ttl之前要做相应的准备工作。
将ttl设置为255.0。
(TTL定义为一个IP包在网络中无法到达目标主机时,
在network中能存活的时间长度。
延长这个 TTL 在本例中有助于进行更充分的大规模广播)
-
下载一个可以自由制作各种包的工具(例如hping2)
-
然后和上面一样,寻找主机C的漏洞按照这个漏洞当掉主机C。
当该网络中的主机无法找到原有的192.0.0.3时,它会更新自身的ARP对应表。随后,在这种情况下他会发送一个原始IP地址为192.168.0.3、MAC地址为BB:BB:BB:BB:BB:BB的ARP响应包。
当前所有主机均已获取该主机分配了一个新的MAC地址192.0.0.3,在完成了一次有效的ARP欺骗操作后,这些主机仅会在此私有网络内搜索该外部IP地址对应的MAC地址,而不会将发送至该外部IP地址192.0.0.3的IP包直接丢给默认路由系统,因此还需生成一个ICMP重定向广播报文以完成相应转换
生成一个ICMP redirect packet并将其发送至网络中的各个主机,请它们将所有到达目标地址192.0.0.3的数据包丢弃,并将这些流量重新导向外部网络以确保绕过内部网络区域。
主机A接收了一个合理的ICMP redirect请求后, 重新规划了自己的路由路径, 并将所有与192.0.0.3相关的通信转移至路由器。
入侵者已经实现了从外部获取来自内部网络发送来的数据包,并且现在能够通过telnet协议远程访问该主机。
其实在这一设想仅限于一种理想化的场景。该主机接受ICMPredirect包时会面临诸多限制条件,这些约束使得ICMPredirect过程变得极为复杂。
TCP/IP协议实现中关于主机接收ICMP重定向报文主要有下面几条限制:
-
新路由必须直达
-
重定向包必须来自屈枉目标的当前路由
-
重定向包不能通知主机用自己作路由
-
被改变的路由必须是一条间接路由
由于有这些限制,所以ICMP欺骗实际上很难实现。
7.3 ARP 欺骗的防御
知道了ARP欺骗的方法和危害,我们给出一些初步的防御方法:
不要将安全信任关注建立在IP地址或MAC地址的基础上(如RARP同样存在漏洞),最佳实践是将IP与MAC结合使用。
- 设置静态的mac->ip映射,不要让主机刷新设置好的arp转换表.
不再依赖ARP,将其永久记录于相关表格中.在Linux系统中,通过执行ifconfig –arp命令可以使网络接口的驱动失效.
-
使用代理网关发送上行数据.
-
修改系统配置拒收ICMP重定向报文.
通过在Linux环境下阻止接收ICMP流量的转发或是通过修改内核选项重新编译内核来实现网络流量的安全过滤。
在win2000下可以通过防火墙和IP策略拒绝接收ICMP报文.
