我正在尝试建立两个冗余的前向负载均衡器(使用 IPVS 或 NGINX),但首先我尝试让浮动 VRRP 虚拟 ip/mac 正常工作,然后再继续该过程。
我在 VMware vSphere 6 上安装了带有最新更新的 Ubuntu 16.04 VM。VM 位于 DvSwitch 端口组上,启用了混杂模式、mac 地址更改和伪造传输。VM 使用 VMXNET3 作为 NIC。我在 repo 中使用标准 keepalived。
keepalived/xenial-updates,now 1:1.2.19-1ubuntu0.1 amd64 [installed]
我正在尝试对 keepalived 使用以下配置...
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 是使用父接口 MAC 的 ARP 回复(出于多种原因,这很糟糕)。我尝试使用在线列出的多种不同的 net.ipv4.conf 设置组合,所有这些组合似乎都完全破坏了 macvlan 接口的 ARP。据我所知,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 请求确实到达了正确的接口。我尝试在物理接口上使用混杂模式,但没有任何效果(而且 ARP 请求无论如何都会到达那里)。
如何让 keepalived 虚拟 macvlan 接口使用虚拟 MAC 地址正确响应 ARP,以便转发流量?我试图在转换期间让 MASTER > BACKUP 之间遵循相同的虚拟 IP/MAC 组合,以便 ARP 表不受任何上游防火墙的影响(GARP 不可靠/不可信,故障转移必须快速且尽可能无缝)。
答案1
我已经解决了我自己的问题...对于好奇的人,这里是详细的信息。
首先,确保仔细检查您的 sysctl,因为 Ubuntu 默认启用了一些您不会想到会默认启用的功能,即 RP 检查。
sysctl -a | grep net.ipv4.conf.*
您也许会对在这里发现的东西感到惊讶。
在 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 相同。 这有助于您保持其他虚拟机的最大安全性,同时仅向绝对需要的虚拟机公开额外的流量。
如果它们位于同一台主机上,即使它们位于 DvSwitch 上的不同 VM 端口组中,该流量也将在主机内的 vSwitch 上本地切换,永远不会传出上行链路端口。
对于真正偏执的人来说,您可以启动一个完全不同的 DvSwitch,它具有不同的上行链路(如果您有许多上行链路要烧录),并为它们分配一个单独的 VLAN(在物理交换机上修剪)。这确保它们完全容器化,并且除了它们应该看到的流量之外,不会看到任何其他流量。
如果您使用 keepalived 的默认多播,并且在分配到的 DvSwitch 上有多个上行链路端口(这是最佳做法),请确保设置...
Advanced Settings > Net > Net.ReversePathFwdCheckPromisc to 1 on each host
防止多播流量循环回到主机(类似于https://doc.pfsense.org/index.php/CARP_Configuration_Troubleshooting)。
unicast_peer
如果在你的 keepalived 配置中使用,则可以省略这一点。