// //
//

Loading

数据包的通信过程

这篇文章主要是对数据包在同网段和不同网段的转发流程梳理,使用 ping 命令进行实际抓包测试。

网关的概念:

对于像 PC 等终端设备来说,通过交换机可以实现同网段的通信。但如果想要给其他网段发生数据,就不行了,因为本身没有路由的功能,不知道该发给谁。这时就提出了一个网关的概念,为这些终端设备配置上,当想要实现跨网段的通信时,就把数据发送到配置的网关地址上。一般来说,默认配置的网关地址都是路由的接口地址。

ARP

什么是 ARP?

ARP - Address Resolution Protocol. 在封装数据帧-链路层的数据包时,由于上层已经有了目的 IP 地址。而在链路层需要封装 SMAC 和 DMAC,但目的 MAC 如何获取呢?就是通过 ARP 协议,完成 IP 地址到物理地址的映射。但需要注意的是,ARP 不能穿越路由器,也就是跨网段传输。

ARP 原理

假设这里出现的设备均是第一次启动。把路由器的路由功能关闭,这里的 R1 代表的就是 PC 了,否则是 Ping 不通.

这里 R1 想要给 PC 发送 IP 数据包,只有按照要求封装成 2 层数据帧的格式才可以,步骤如下:

  1. 发现目前有源 MAC 地址,却没有目的 MAC 地址,那么封包不成功,暂时将包缓存。

  2. 接着发送 ARP 广播(将 ARP 广播添加帧头部发送),交换机转发该广播到该网络的每一个主机,

  3. 每个主机收到后开始解封装,进而查看到 ARP 报文中的目的 IP,如果该 IP 和自己的 IP 一致,那么做出 ARP 响应报文(单播),否则丢弃。

  4. R1 收到 PC 的响应报文后,开始解封装,并查看 ARP 报文中的目的 IP,添加到缺少的目的 MAC,最后再发送到数据到 PC。

ARP 分类

标准 ARP:用于获取 MAC 的 ARP 协议。

Proxy (代理) ARP:
正常来说,如果网络设备上的某个接口收到并不是自己的 IP ,会把包丢掉。

但如果在路由器的上接口配置了代理 ARP,路由器在收到数据包后,会先查看自己的路由表,看能不能到达,能到达的话。

就将自己接口的 MAC 地址回复给请求方。注意真的 MAC 可能是另一网段的设备。其实这里就是一种欺骗行为,欺骗发送者自己的 IP 和 MAC.

Gratuitous(无故/免费) ARP:

无故 ARP 并不期待网络中设备给自己回复 ARP 响应报文,因为其 Source/Destination IP 为本 IP,Source MAC 为本 MAC,Destination MAC 为 0:0:0:0:0:0. 也就是说,无故 ARP 以广播的形式,自己给自己发送 ARP 消息。

这样做的目的有两个:

  • 在新设备加入到一个已经存在的网络中时,会自动发送一个无故 ARP 报文,用于告知本网络的其他设备自己的 MAC 地址和 IP.

  • 用于检测 IP 地址是否冲突,正常来说并不会收到 ARP 响应报文,但如果收到,证明该 IP 已经被其他接口使用.

同网段的数据通信

这里出现的设备均是第一次启动,把路由器的路由功能关闭,这里的 R1 代表的就是 PC 了,否则是 Ping 不通的

这里 R1 想要给 PC 发送 IP 数据包,只有按照要求封装成 2 层数据帧的格式才可以。这时发现目前有源 MAC 地址,却没有目的 MAC 地址,那么封包不成功,暂时将包搁置。接着发送 ARP 广播(将 ARP 广播添加帧头部发送,帧结构如下图)

交换机收到该数据包后发现目的 MAC 为 ffff:ffff:ffff, 根据交换机的转发规则,先将 R1 的源 MAC 和自己端口号(e0/0)存入 MAC 表,然后进行泛洪操作,广播到该网络的每一个主机。

每个主机收到后开始解封装,进而查看到 ARP 报文中的目的 IP,PC 发现目的 IP 和自己的 IP 一致,接着发送 ARP 响应报文(如下图)

交换机收到 PC 的 ARP 应答报文后,由于目的 MAC 地址在本身的 MAC 表里已经存在,进而直接转发给 R1。

R1 收到 PC 的响应报文后,开始解封装,并查看 ARP 报文中的目的 MAC,添加到搁置的缺少目的 MAC 的数据包,接着将封装好的数据帧发送到 PC (ping 命令 在传输层是 ICMP 协议)

不同网段之间的通信

这里注意一下,两台 PC 机要配置网关,否则 ARP 包内的内容可能不一样
不管终端的目的是哪里,首先都要将数据包发送到网关

PC1 要给 PC2 发送 ICMP 包,首先要发送到网关,我们先模拟下封包过程:

封装 4 层 ICMP 头
封装 3 层 IPV4 头,源 IP 为 12.1.1.1 目的 IP 为 23.1.1.2
封装 2 层 头,源 MAC 为 aabb.cc00.1000 目的 MAC(也就是网关的 MAC) 不清楚
封装暂停。

PC1 开始发送 ARP 报文,获取网关 MAC,报文如下:

路由器 R2 收到 ARP 请求报文,开始解封装,发现报文中的 Sender IP 是自己,那么进行 ARP 报文回复,并将 PC1 的源 MAC 和源 IP 记录在自己 ARP 缓存表中,报文如下:

PC1 收到 ARP 应答报文,进行解封装,取出报文中缺少的 MAC 地址,添加到搁置的 ICMP 的包中,PC1 顺利的将数据包发送至网关

R2 收到发来的 ICMP 包后,进行解封装,进行到第三层时,发送目的 IP 是自己可达网段中的 IP。因此进行转发,开始封装新的 ICMP 数据包

封包过程如下:

  1. 三层不变
  2. 封装二层,封装源 MAC:aabb.cc00.2010 ,目的 MAC (PC2 终端 MAC)不清楚
  3. 封包暂停

R2 开始发送 ARP 报文,请求 PC2 的 MAC 地址,报文如下:

交换机收到 ARP 请求报文,将 R2 的 e0/1 的 MAC 地址和自己的端口号(e0/0) 记录在 MAC 地址表内,然后根据规则进行泛洪.

PC2 收到 ARP 解析包后,发送 ARP 包中的目的 IP 是自己,因此进行 ARP 应答,并将 ARP 请求中的源 MAC (aa:bb:cc:00:20:10) 和 源 IP(23.1.1.1) 记录在自己的 ARP 缓存表中,应答报文如下:

交换机收到 PC 的 ARP 应答报文后,先将 PC2 的 e0/0 MAC 地址和自己的端口号(e0/1) 记录字 MAC 地址表内,接着发现要去数据包要去的 MAC 地址在自己的 MAC 表内,因此直接转发。

R2 收到 ARP 应答报文,取出 PC2 的 MAC 地址,并添加到搁置的 ICMP 包中,封包成功。接着将 ICMP 包发给 PC2,同时也将 PC2 的 MAC 地址和 IP 记录在自己的 ARP 缓存表中。

PC2 收到 ICMP 包发现,三层包中目的 IP 是自己,接着进行 ICMP 应答,我们再来模拟一下封包的过程:
封装 4 层 ICMP 头
封装 3 层,源 IP:23.1.11 目的 IP:12.1.1.1
封装 2 层,源 MAC:aabb.cc00.4000 目的MAC:网关 MAC(aabb.cc00.2010)(在 ARP 缓存表中取得)
然后进行发包。

交换机收到数据包后,发送目的 MAC 在自己的 MAC 表中有,直接转发给 R2,R2 收到数据包后,解 封 2 层,发现 3 层中要去的网段自己能到达,因此开始封装包:
3 层不变
2 层的源 MAC 为自己的 MAC 地址(e 0/0),目的 MAC 为 aabb.cc00.1000 (从 ARP 缓存表中取得),

报文如下:

最后我们可以发现,数据包在跨网段传输时,网络层的 IP 是固定不变的,但是 MAC 地址是在不断发生变化的。

ARP 欺骗

物理环境:

物理环境 节点 IP 节点 mac 地址
vm-eve 192.168.20.128 cisco eve 模拟器,用于模拟网络设备
vm-attacker 192.168.20.129 unbuntu 充当攻击者
vmware-vm8 192.168.20.2 Vmware 自带网关

网络环境,两台 vm 均通过 vm8 (vmware nat) 模式下通信。通过 DHCP 分配 IP. 所以两台 vm 所处同一个网段。

拓扑环境:

节点名称 节点 IP 节点描述 Mac 地址
Net Vmware 网络环境,攻击者通过 Net 对拓扑内的网络进行攻击。
SW 用于保证同一局域网下通信,也就是 R1 和 R2 通信
R1 192.168.20.134 充当 PC 机 aabb.cc00.2000
R2 192.168.20.135 充当 PC 机 aabb.cc00.3000

实验过程:

这里打开 SW,R1,R2 后,为 R1 和 R2 配置 192.169.20.0/24 网段下的 IP,由于所属同一个网段所以可以和 Vmware 下同一网段下的主机进行通信。

首先使用 R1 ping R2, 可以正常通信。并在 R1 上查看,ARP 表的结果。然后通过攻击者,对 R1 进行 ARP 欺骗,模拟 R2 。接着用 R1 ping R2,发现网络不通,并查看 ARP 表,发现已经替换为攻击者 mac. 从而达到了 ARP 欺骗的效果。

先打开两台路由器,路由器配置,由于没有打开交换机,arp 表中仅有自己。

R1:

interface Ethernet0/0
 ip address 192.168.20.133 255.255.255.0
 no shutdown

r1#show arp
Protocol  Address          Age (min)  Hardware Addr   Type   Interface
Internet  192.168.20.133          -   aabb.cc00.2000  ARPA   Ethernet0/0


R2:
interface Ethernet0/0
 ip address 192.168.20.134 255.255.255.0
 no shutdown

r2#show arp
Protocol  Address          Age (min)  Hardware Addr   Type   Interface
Internet  192.168.20.134          -   aabb.cc00.3000  ARPA   Ethernet0/0

打开交换机:

R1 arp 查询:
# R1 ping R2,更新 arp 表
r1#ping 192.168.20.134
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.20.134, timeout is 2 seconds:
.!!!!
Success rate is 80 percent (4/5), round-trip min/avg/max = 1/1/1 ms
r1#show arp
Protocol  Address          Age (min)  Hardware Addr   Type   Interface
Internet  192.168.20.133          -   aabb.cc00.2000  ARPA   Ethernet0/0
Internet  192.168.20.134          0   aabb.cc00.3000  ARPA   Ethernet0/0

R2查询:
r2#show arp
Protocol  Address          Age (min)  Hardware Addr   Type   Interface
Internet  192.168.20.133          0   aabb.cc00.2000  ARPA   Ethernet0/0
Internet  192.168.20.134          -   aabb.cc00.3000  ARPA   Ethernet0/0

交换机 mac 地址表查询:
Switch#show mac address-table
          Mac Address Table
-------------------------------------------

Vlan    Mac Address       Type        Ports
----    -----------       --------    -----
   1    0050.56c0.0008    DYNAMIC     Et0/2
   1    aabb.cc00.2000    DYNAMIC     Et0/0
   1    aabb.cc00.3000    DYNAMIC     Et0/1
Total Mac Addresses for this criterion: 3

可以看到 R1 和 R2 通信正常,对应各自的 ARP 表对应的 mac 地址也是正确的。

接着使用攻击者对 R1 发起 ARP 欺骗,欺骗自己是 R2.

sudo arpspoof -i ens33 -t 192.168.20.133 192.168.20.134

查询 R1 的 arp, 已经变成了攻击者的 mac:

r1#show arp
Protocol  Address          Age (min)  Hardware Addr   Type   Interface
Internet  192.168.20.133          -   aabb.cc00.2000  ARPA   Ethernet0/0
Internet  192.168.20.134          0   000c.2915.790b  ARPA   Ethernet0/0

抓包后,查看大量 arp 攻击报文, 说 192.168.20.234 的 mac 是 79:0b:

此时通过 R1 ping R2 发现根本不同,原因就在于 mac 地址改变,数据包已经发给攻击者。

ARP 防御

为了解决 ARP 欺骗的问题,我们通常有两种思路:

  • 一个是入口交换机上打开 ARP 检查策略,建立一张我们信任的 ip 和 mac 的对应关系,仅允许我们配置的放行。
  • 第二种是在终端配置静态 arp 表,保证 arp 不会被更新。

对于第一种来说:

# 配置 ARP 过滤策略:
arp access-list ARP
 permit ip host 192.168.20.133 mac host aabb.cc00.2000
 permit ip host 192.168.20.134 mac host aabb.cc00.3000

# 打开 ARP 策略
ip arp inspection vlan 1
ip arp inspection filter ARP vlan  1
mac address-table aging-time 10

此时关闭攻击者,使用 R1 ping R2:

# R1 清除攻击 mac 地址
clear arp

r1#show arp
Protocol  Address          Age (min)  Hardware Addr   Type   Interface
Internet  192.168.20.133          -   aabb.cc00.2000  ARPA   Ethernet0/0

# 查看已经通了
r1#ping 192.168.20.134
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.20.134, timeout is 2 seconds:
.!!!!
Success rate is 80 percent (4/5), round-trip min/avg/max = 1/1/2 ms
r1#

再使用攻击者进行攻击,发现 switch 出现大量告警,通过抓包,R2 已经收不到任何的工具报文了,说明已经被交换机过滤掉了.

第二种,直接在 R1 上配置静态 arp 表的关系,即使收到 ARP 欺骗的报文,也不会更新:

arp 192.168.20.134aabb.cc00.3000 arpa

参考

ARP 介绍

posted @ 2020-07-20 16:42  来份锅包肉  阅读(2058)  评论(0编辑  收藏  举报