MAC地址大家都很熟悉,是网络接口卡地全球唯一标识符,保证了各个接口卡在网络环境中的唯一可识别性。随着HA应用和虚拟化的发展,虚拟MAC也越来越多的被应用到生产环境之中。下面浅要谈一下负载均衡产品netscaler和bigip中的虚拟MAC的应用。

    物理MAC为什么是全球唯一的?

    我们知道MAC的形式类似00:01:02:03:04:05。这个地址之所以在全球是唯一的,不存在重复MAC,是因为各硬件厂商都遵照了同一个协定。具体来说,MAC地址的前三个字节也就是00:01:02这部分,是IEEE组织分配给各硬件厂商的唯一标识符,03:04:05这3个字节,是每个厂商对自己的产品分配的唯一标示符。

    load balancer为什么要使用虚拟MAC?

    在负载均衡产品的HA模式中,不论两个节点中哪个设备成为Active/Primary节点,它对外服务的IP地址都是相同的。也就是说,在客户机看来,HA模式的load balancer的IP从来不会变化,上面的应用VIP的地址也一样不变。这就保证了应用的连续性。

    这个切换(fail over)的机理就跟MAC密切相关。在引入虚拟MAC之前,load balancer做切换时,会发送一个GARP(无故ARP/无需回复的ARP)包给vlan中广播,让所有设备更新ARP缓存。这中间会存在一些问题:

    1. 同vlan中的某些网络设备有可能不支持此类GARP,导致流经此设备的流量不会流向新节点

    2. 由于需要vlan中所有设备更新其ARP缓存,带来了一定的风险和不确定性

    虚拟MAC正好可以解决这个问题。由于新老节点的MAC地址保持一致,网络设备无需更新ARP缓存,实现了更好的无缝切换。唯一要更新的是交换机的port-MAC表,将此MAC映射到新节点在交换机上的接口。这个动作的影响就几乎为零了。

    怎样保证虚拟MAC的唯一性?

    显然,虚拟MAC没有物理MAC那样的严格协定,很容易导致重复冲突。不过这个问题看起来复杂,其实比较容易解决。有两条路线可以走:

    1. 保证虚拟MAC在vlan中唯一即可

    MAC的概念位于7层模型的第二层,到了三层及以上就被解包后丢弃或更新了,所以只要保证在这个MAC所在的vlan中没有重复就行。vlan的作用之一是隔开广播(包括ARP广播),相同的MAC地址只要位于不同的vlan,就可以避免产生冲突。

   2.  利用MAC协定中的“locally administered MAC address”

   这个方法要比前一种麻烦一些。IEEE规定了什么是locally administered MAC。第一个字节的倒数第二位设置为1的话,就表明这是一个本地MAC(表示其是网络管理员分配的,在组织中是唯一的)。利用这一点,可以将一个物理MAC转化为虚拟MAC,保证了这个MAC不会与任何其他的物理MAC产生冲突。举个例子,一个物理MAC第一个字节的十六进制值是01,转化为2进制就是0000,0001, 然后对倒数第二位加1,成为0000,0011,也就是03。

    netscaler和bigip怎么生成和配置虚拟MAC?

    说到这里就很简单了。netscaler用了上面说的第一种办法,bigip推荐用第二种。

    netscaler的具体做法是前5个字节由设备自动生成,第六个字节由客户自己设置。要求是它必须是vlan中唯一的。我对比了一下,netscaler自动生成的前5个字节好像都是一样的,至少跟citrix网站文章里的数值一样。

http://support.citrix.com/proddocs/topic/access-gateway-92/agee-ha-config-virtual-mac-address-tsk.html

    bigip推荐使用第二种方法生成虚拟MAC,然后在配置界面中配置为MAC masquerade即可。同时建议这个操作在维护时间内完成,因为可能对网络连接造成一定影响。

http://support.f5.com/kb/en-us/solutions/public/3000/500/sol3523.html

    虚拟MAC是HA中2个节点共享的,也就是必须在primary/Active和Secondary/Standby的网卡上都绑定相同的虚拟MAC,否则无法完成配置虚拟MAC的目的。