Ubuntu 16.04,Keepalived VMAC

我试图构build两个冗余的前向负载均衡器(使用IPVS或NGINX),但首先我想让浮动VRRP虚拟ip / mac正常工作,然后再继续前进。

在VMware vSphere 6上有最新更新的Ubuntu 16.04虚拟机。 虚拟机在DvSwitch端口组上,混合模式,MAC地址改变,并且伪造的传输被启用。 VM正在使用VMXNET3用于NIC。 我在回购中使用标准keepalived

keepalived/xenial-updates,now 1:1.2.19-1ubuntu0.1 amd64 [installed] 

我正在尝试使用以下configurationkeepalived …

 root@lb1:~# cat /etc/keepalived/keepalived.conf vrrp_instance VI_1 { state MASTER interface ens192 virtual_router_id 150 priority 150 use_vmac vrrp150 vmac_xmit_base advert_int 1 virtual_ipaddress { 10.0.4.55 } } 

当初始设置时,朝着macvlan接口(vrrp150)的ping与ARP接口MAC(由于若干原因而不好)进行ARP应答。 我试图使用net.ipv4.conf设置的许多不同组合,在网上设置,他们似乎完全破坏ARP的macvlan接口。 iptables和ufw完全禁用了我的知识,和tcpdump显示以下…

 root@lb1:~# tcpdump -s0 -i vrrp150 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on vrrp150, link-type EN10MB (Ethernet), capture size 262144 bytes 10:05:19.271979 ARP, Request who-has 10.0.4.55 tell 10.0.4.31, length 46 10:05:20.215301 ARP, Request who-has 10.0.4.55 tell 10.0.4.31, length 46 10:05:21.215474 ARP, Request who-has 10.0.4.55 tell 10.0.4.31, length 46 10:05:22.219300 ARP, Request who-has 10.0.4.55 tell 10.0.4.31, length 46 10:05:23.215514 ARP, Request who-has 10.0.4.55 tell 10.0.4.31, length 46 10:05:24.223971 ARP, Request who-has 10.0.4.55 tell 10.0.4.31, length 46 10:05:25.224262 ARP, Request who-has 10.0.4.55 tell 10.0.4.31, length 46 

所以ARP请求确实到达正确的接口。 我试图在物理接口上使用混杂模式,但没有什么区别(不pipe怎么说,ARP请求都会到达那里)。

如何让keepalived虚拟macvlan接口使用虚拟MAC地址正确响应ARP,以便stream量可以被转发? 我正在尝试在转换期间获得MASTER> BACKUP之间的相同虚拟IP / MAC组合,以便ARP表不受任何上游防火墙影响(GARP不可靠/不可信,故障转移必须尽快且尽可能无缝) 。

我已经解决了我自己的问题…好奇,这是一击一击。

首先,请确保仔细检查你的sysctl,因为默认启用了Ubuntu,所以默认情况下不会启用,即RP检查。

 sysctl -a | grep net.ipv4.conf.* 

你可能会惊讶于你在这里find的东西。

在Ubuntu 16.04上,在/etc/sysctl.conf中设置以下内容…

 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 net.ipv4.conf.all.rp_filter = 0 net.ipv4.conf.ens192.rp_filter = 0 net.ipv4.conf.vrrp150.rp_filter = 0 

由于RP默认是在sysctl中设置的,所以你需要在“全部”级别以及每个接口上进行(如下所示)。

执行以下操作来激活它(或重新启动)。

 sysctl -p 

第二件事是确保你的DvSwitch设置是正确的(再次,如上所述,端口组需要混杂模式,MAC地址改变,并且伪造的传输使能)。 即使它们所在的VLAN相同,它也不需要与其他虚拟机相同的端口组。 这样可以帮助您在其他虚拟机上保持最高的安全性,同时只将额外的stream量暴露给绝对需要的虚拟机。

如果它们位于同一主机上,即使它们位于DvSwitch上的不同VM端口组上,该stream量也将在主机内的vSwitch上进行本地交换,而不会从上行链路端口出口。

对于真正的偏执狂来说,你可以使用不同的上行链路(如果你有很多要烧录的)和一个单独的VLAN(在物理交换机上修剪)来启动一个完全不同的DvSwitch。 这确保了他们完全集装箱化,除了他们打算看到的交通外,没有其他交通。

如果您使用默认多播与keepalived和有多个上行链路端口的DvSwitch他们被分配(这是最佳实践),请务必设置…

 Advanced Settings > Net > Net.ReversePathFwdCheckPromisc to 1 on each host 

防止组播stream量循环回主机(类似于https://doc.pfsense.org/index.php/CARP_Configuration_Troubleshooting )。

如果在keepalivedconfiguration中使用unicast_peer ,这可以省略。