From dbeb5f02b57de3b00b50a06fa75c1531245459ce Mon Sep 17 00:00:00 2001 From: Fabio Rapposelli Date: Mon, 4 Feb 2019 23:41:35 +0100 Subject: [PATCH] fix mac filtering in vsphere cloud provider --- .../providers/vsphere/vsphere.go | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/pkg/cloudprovider/providers/vsphere/vsphere.go b/pkg/cloudprovider/providers/vsphere/vsphere.go index 7acbb48bc1c..d0ae21247bb 100644 --- a/pkg/cloudprovider/providers/vsphere/vsphere.go +++ b/pkg/cloudprovider/providers/vsphere/vsphere.go @@ -53,8 +53,6 @@ const ( VolDir = "kubevols" RoundTripperDefaultCount = 3 DummyVMPrefixName = "vsphere-k8s" - MacOuiVC = "00:50:56" - MacOuiEsx = "00:0c:29" CleanUpDummyVMRoutineInterval = 5 ) @@ -533,6 +531,15 @@ func (vs *VSphere) Instances() (cloudprovider.Instances, bool) { } func getLocalIP() ([]v1.NodeAddress, error) { + // hashtable with VMware-allocated OUIs for MAC filtering + // List of official OUIs: http://standards-oui.ieee.org/oui.txt + vmwareOUI := map[string]bool{ + "00:05:69": true, + "00:0c:29": true, + "00:1c:14": true, + "00:50:56": true, + } + addrs := []v1.NodeAddress{} ifaces, err := net.Interfaces() if err != nil { @@ -548,9 +555,12 @@ func getLocalIP() ([]v1.NodeAddress, error) { if ipnet, ok := addr.(*net.IPNet); ok && !ipnet.IP.IsLoopback() { if ipnet.IP.To4() != nil { // Filter external IP by MAC address OUIs from vCenter and from ESX - var addressType v1.NodeAddressType - if strings.HasPrefix(i.HardwareAddr.String(), MacOuiVC) || - strings.HasPrefix(i.HardwareAddr.String(), MacOuiEsx) { + vmMACAddr := strings.ToLower(i.HardwareAddr.String()) + // Making sure that the MAC address is long enough + if len(vmMACAddr) < 17 { + return addrs, fmt.Errorf("MAC address %q is invalid", vmMACAddr) + } + if vmwareOUI[vmMACAddr[:8]] { nodehelpers.AddToNodeAddresses(&addrs, v1.NodeAddress{ Type: v1.NodeExternalIP, @@ -561,8 +571,10 @@ func getLocalIP() ([]v1.NodeAddress, error) { Address: ipnet.IP.String(), }, ) + klog.V(4).Infof("Detected local IP address as %q", ipnet.IP.String()) + } else { + klog.Warningf("Failed to patch IP as MAC address %q does not belong to a VMware platform", vmMACAddr) } - klog.V(4).Infof("Find local IP address %v and set type to %v", ipnet.IP.String(), addressType) } } }