虚拟IP与ARP协议

1. 虚拟IP

虚拟IP(Virtual IP Address),是一种不与特定计算机或者特定计算机网卡相对应的IP地址。所有发往这个IP地址的数据包最后都会经过真实的网卡到达目的主机的目的进程。

引用维基上面的定义:

A virtual IP address (VIP or VIPA) is an IP address that doesn’t correspond to an actual physical network interface (port). Uses for VIPs include network address translation (especially, one-to-many NAT), fault-tolerance, and mobility.

虚拟IP主要是用来网络地址转换,网络容错和可移动性。

虚拟IP比较常见的一个用例就是在系统高可用性(High Availability HA)方面的应用,通常一个系统会因为日常维护或者非计划外的情况而发生宕机,为了提高系统对外服务的高可用性,就会采用主备模式进行高可用性的配置。

当提供服务的主机M宕机后,服务会切换到备用主机S继续对外提供服务。而这一切用户是感觉不到的,在这种情况下系统对客户端提供服务的IP地址就会是一个虚拟IP,当主机M宕机后,虚拟IP便会漂浮到备机上,继续提供服务。

在这种情况下,虚拟IP就不是与特定计算主机或者特定某个物理网卡对应,而是一种逻辑的概念。它是可以自由移动(自由漂浮)的,这样既对外屏蔽了系统内部的细节,又为系统内部的可维护性和扩展性提供了方便。

2. ARP协议

2.1 ARP协议

ARP协议属于TCP/IP协议族里一种将IP地址解析为MAC地址的协议,位于TCP/IP五层模型中的网络层。该协议是用来在局域网内解析IP地址对应的物理地址

这里写图片描述

通常一个主机A给另一个主机B通过网络发送一个IP数据报的时候,首先会发送到主机A所在网络的的路由器上面,然后路由器会判断目的地址是否在本网络内,是则直接转发到本网络内的目的主机;否则会继续传递到下一个路由,直到到达指定的网络的路由器,指定网络的路由器会将此数据报发送到目的主机

整个过程最后都会涉及到由某一个网络的路由器(或者网关)将数据发送到网内某一主机的过程。这个过程通常是由路由器发送一个ARP广播请求,请求IP地址和数据包目的IP地址一致的主机将它自己的MAC地址返回给路由器,因为数据链路层的数据传输是通过物理地址传输的

ARP请求会广播到所有局域网内的主机,网内其他主机收到这个ARP请求

  1. 检查发送ARP请求的主机的IP地址

  2. 将该IP地址和其对应的MAC地址存放在ARP缓存

  3. 检查这个ARP请求中请求的IP地址是否为自己的IP地址,是则发送一个ARP应答,应答包含自己的IP地址和对应的MAC地址。

当网络内的路由器得到了MAC地址后,便可以通过数据链路层将数据包正确传输到目的主机上了。

2.2 ARP缓存

ARP协议中比较重要的内容之一就是ARP缓存,主机操作系统会将IP地址MAC地址的映射关系存放在主机的一片高速缓存中。

  • 缓存失效:该缓存会在一定时间内失效,失效后,请求该IP地址时需要广播arp请求重新获取IP地址对应的MAC地址

  • 缓存更新:当收到ARP请求时,会将发送ARP请求的主机IP地址与MAC地址记录下来,然后去更新本机ARP缓存中对应的记录

3. 虚拟IP与ARP协议

虚拟IP常用于系统高可用性的场景,那么虚拟IP实现的原理是什么?虚拟能够自由漂浮的原理是什么?

从前文介绍arp协议里面来看,主机与主机的通信过程都会涉及到一个ip地址转换mac地址的过程,那么虚拟IP的通信也不会例外。因此,IP地址在主机通信的过程中其实就是一个逻辑地址。

我们知道,每一个主机都存放着网络内一些主机的逻辑地址与物理地址(MAC地址)的映射,那么问题来了:

当虚拟IP(简称VIP)在主机A上时,主机AMAC地址为MAC_A,某主机Marp缓存中存放着一个映射关系:VIP <–> MAC_A;当主机A宕机后, VIP漂浮到了主机B,主机BMAC地址为MAC_B,那么此时主机M想与虚拟IP通信时,是做不到的;因为它的arp高速缓存中的VIP的映射还指向主机AMAC地址。这个问题解决的思路就是当虚拟IP漂浮后,刷新所有其他主机的arp缓存

那么虚拟IP是如何实现漂浮后,是如何刷新所有其他主机的ARP缓存的呢?

这里就会引入另一个概念,GARP(简称无端ARP或者免费ARP),主要是用来当某一个主机C开机时,用来确认自己的IP地址没有被人占用而做的一个检测。广播发送这个arp,请求得到本机IP地址的MAC地址,主机C并不希望此次arp请求会有arp应答,因为应答意味着IP地址冲突了当其他主机收到这个arp请求后,会刷新关于这个arp请求源的主机IP地址的映射。

GARP的作用主要有两个:

  1. 检测IP地址是否有冲突
  2. 刷新其他主机关于本次IP地址的映射关系

集群管理软件Pacemaker里面的资源代理ocf:heartbeat:IPaddr2中,在虚拟IP漂浮后,会向网络内广播发送garp请求,以此来刷新其他主机的arp缓存。

在配置OpenStack控制节点高可用性的时候,出现过虚拟IP切换时,某一个主机不能通信的问题,后来发现是arp缓存没有刷新,有时候由于网络的原因,某些主机没有接收到此garp请求,因此ocf:heartbeat:IPaddr2资源代理中可以配置发送garp的次数,这里建议次数配置得多一点,这样可以保证其他主机成功刷新arp缓存。