@@ -52,6 +52,7 @@ type egressIPWatcher struct {
52
52
namespacesByEgressIP map [string ]* namespaceEgress
53
53
54
54
localEgressLink netlink.Link
55
+ localEgressNet * net.IPNet
55
56
localEgressIPMaskLen int
56
57
57
58
testModeChan chan string
@@ -269,6 +270,12 @@ func (eip *egressIPWatcher) claimEgressIP(egressIP, egressHex string) error {
269
270
270
271
for _ , addr := range addrs {
271
272
if addr .IP .String () == eip .localIP {
273
+ _ , eip .localEgressNet , err = net .ParseCIDR (addr .IPNet .String ())
274
+ if err != nil {
275
+ glog .Warningf ("Could not parse CIDR network from address %q: %v" , addr .IP .String (), err )
276
+ break linkLoop
277
+ }
278
+
272
279
eip .localEgressLink = link
273
280
eip .localEgressIPMaskLen , _ = addr .Mask .Size ()
274
281
break linkLoop
@@ -286,6 +293,9 @@ func (eip *egressIPWatcher) claimEgressIP(egressIP, egressHex string) error {
286
293
if err != nil {
287
294
return fmt .Errorf ("could not parse egress IP %q: %v" , egressIPNet , err )
288
295
}
296
+ if ! eip .localEgressNet .Contains (addr .IP ) {
297
+ return fmt .Errorf ("egress IP %q is not in local network %s of interface %s" , egressIP , eip .localEgressNet .String (), eip .localEgressLink .Attrs ().Name )
298
+ }
289
299
err = netlink .AddrAdd (eip .localEgressLink , addr )
290
300
if err != nil {
291
301
return fmt .Errorf ("could not add egress IP %q to %s: %v" , egressIPNet , eip .localEgressLink .Attrs ().Name , err )
0 commit comments