虚拟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请求后
-
检查发送ARP请求的主机的IP地址
-
将该IP地址和其对应的MAC地址存放在ARP缓存中
-
检查这个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上时,主机A
的MAC
地址为MAC_A
,某主机M
的arp缓存
中存放着一个映射关系:VIP <–> MAC_A;当主机A
宕机后, VIP
漂浮到了主机B
,主机B
的MAC
地址为MAC_B
,那么此时主机M
想与虚拟IP
通信时,是做不到的;因为它的arp
高速缓存中的VIP
的映射还指向主机A
的MAC
地址。这个问题解决的思路就是当虚拟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
缓存。