@@ -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
@@ -97,6 +98,10 @@ func (eip *egressIPWatcher) findEgressLink() error {
97
98
98
99
for _ , addr := range addrs {
99
100
if addr .IP .String () == eip .localIP {
101
+ _ , eip .localEgressNet , err = net .ParseCIDR (addr .IPNet .String ())
102
+ if err != nil {
103
+ return fmt .Errorf ("could not parse CIDR network from address %q: %v" , addr .IP .String (), err )
104
+ }
100
105
eip .localEgressLink = link
101
106
eip .localEgressIPMaskLen , _ = addr .Mask .Size ()
102
107
return nil
@@ -287,6 +292,9 @@ func (eip *egressIPWatcher) claimEgressIP(egressIP, egressHex string) error {
287
292
if err != nil {
288
293
return fmt .Errorf ("could not parse egress IP %q: %v" , egressIPNet , err )
289
294
}
295
+ if ! eip .localEgressNet .Contains (addr .IP ) {
296
+ return fmt .Errorf ("egress IP %q is not in local network %s of interface %s" , egressIP , eip .localEgressNet .String (), eip .localEgressLink .Attrs ().Name )
297
+ }
290
298
err = netlink .AddrAdd (eip .localEgressLink , addr )
291
299
if err != nil {
292
300
return fmt .Errorf ("could not add egress IP %q to %s: %v" , egressIPNet , eip .localEgressLink .Attrs ().Name , err )
0 commit comments