Linux-Networking

Ubuntu 16.04,Keepalived VMAC

  • October 3, 2018

我正在嘗試建立兩個冗餘的前向負載平衡器(使用 IPVS 或 NGINX),但首先我試圖讓浮動 VRRP 虛擬 ip/mac 在繼續整個過程之前正常工作。

我在 VMware vSphere 6 上有一個帶有最新更新的 Ubuntu 16.04 VM。虛擬機位於混雜模式、mac 地址更改和啟用偽造傳輸的 DvSwitch 埠組上。VM 正在為 NIC 使用 VMXNET3。我在回購中使用標準的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 不可靠/不尊重,並且故障轉移必須快速且盡可能無縫) .

我已經解決了我自己的問題…對於好奇的人,這裡是逐個介紹。

首先,請務必仔細檢查您的 sysctls,因為 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

由於在 sysctl 中設置了 RP 預設值,您需要在“所有”級別以及每個介面上執行此操作(如此處所示)。

執行以下操作以實時啟動它(或只是重新啟動)。

sysctl -p

第二件事是確保您的 DvSwitch 設置正確(同樣,如上所述,埠組需要具有混雜模式、更改 MAC 地址並啟用偽造傳輸)。 它不必與其他 VM 的埠組相同,即使它們所在的 VLAN 相同。 這有助於您在其他 VM 上保持最大的安全性,同時僅將額外流量暴露給絕對需要它的 VM。

如果它們在同一主機上,即使它們在 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 配置中使用,則可以省略。

引用自:https://serverfault.com/questions/825631