From 63b46c885adb90ca94c18ac9f68e65fe09fd4329 Mon Sep 17 00:00:00 2001 From: Tamilmani Manoharan Date: Mon, 14 Dec 2020 20:28:54 -0800 Subject: [PATCH] updated routes and added static arp for virtual gw ip --- network/endpoint_linux.go | 4 ++ network/transparent_endpointclient_linux.go | 44 +++++++++++++++++++-- 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/network/endpoint_linux.go b/network/endpoint_linux.go index 5ea6d9345d..25e34d04f0 100644 --- a/network/endpoint_linux.go +++ b/network/endpoint_linux.go @@ -269,6 +269,8 @@ func addRoutes(interfaceName string, routes []RouteInfo) error { Gw: route.Gw, LinkIndex: ifIndex, Priority: route.Priority, + Protocol: route.Protocol, + Scope: route.Scope, } if err := netlink.AddIpRoute(nlRoute); err != nil { @@ -312,6 +314,8 @@ func deleteRoutes(interfaceName string, routes []RouteInfo) error { Dst: &route.Dst, Gw: route.Gw, LinkIndex: ifIndex, + Protocol: route.Protocol, + Scope: route.Scope, } if err := netlink.DeleteIpRoute(nlRoute); err != nil { diff --git a/network/transparent_endpointclient_linux.go b/network/transparent_endpointclient_linux.go index f0a48099bd..f6aee21a50 100644 --- a/network/transparent_endpointclient_linux.go +++ b/network/transparent_endpointclient_linux.go @@ -11,8 +11,9 @@ import ( ) const ( - FAKE_GW_IP = "169.254.1.1/32" - DEFAULT_GW = "0.0.0.0/0" + virtualGwIPString = "169.254.1.1/32" + defaultGwCidr = "0.0.0.0/0" + defaultGw = "0.0.0.0" ) type TransparentEndpointClient struct { @@ -147,7 +148,44 @@ func (client *TransparentEndpointClient) ConfigureContainerInterfacesAndRoutes(e return err } - return addRoutes(client.containerVethName, epInfo.Routes) + //ip route del 10.240.0.0/12 dev eth0 (removing kernel subnet route added by above call) + for _, ipAddr := range epInfo.IPAddresses { + _, ipnet, _ := net.ParseCIDR(ipAddr.String()) + routeInfo := RouteInfo{ + Dst: *ipnet, + Scope: netlink.RT_SCOPE_LINK, + Protocol: netlink.RTPROT_KERNEL, + } + if err := deleteRoutes(client.containerVethName, []RouteInfo{routeInfo}); err != nil { + return err + } + } + + //add route for virtualgwip + //ip route add 169.254.1.1/32 dev eth0 + virtualGwIP, virtualGwNet, _ := net.ParseCIDR(virtualGwIPString) + routeInfo := RouteInfo{ + Dst: *virtualGwNet, + Scope: netlink.RT_SCOPE_LINK, + } + if err := addRoutes(client.containerVethName, []RouteInfo{routeInfo}); err != nil { + return err + } + + //ip route add default via 169.254.1.1 dev eth0 + _, defaultIPNet, _ := net.ParseCIDR(defaultGwCidr) + dstIP := net.IPNet{IP: net.ParseIP(defaultGw), Mask: defaultIPNet.Mask} + routeInfo = RouteInfo{ + Dst: dstIP, + Gw: virtualGwIP, + } + if err := addRoutes(client.containerVethName, []RouteInfo{routeInfo}); err != nil { + return err + } + + //arp -s 169.254.1.1 e3:45:f4:ac:34:12 - add static arp entry for virtualgwip to hostveth interface mac + log.Printf("[net] Adding static arp for IP address %v and MAC %v in Container namespace", virtualGwNet.String(), client.hostVethMac) + return netlink.AddOrRemoveStaticArp(netlink.ADD, client.containerVethName, virtualGwNet.IP, client.hostVethMac, false) } func (client *TransparentEndpointClient) DeleteEndpoints(ep *endpoint) error {