@@ -258,3 +258,41 @@ func MachinesAsString(machines []*clusterv1.Machine) string {
258
258
}
259
259
return message
260
260
}
261
+
262
+ // IsInternalIP checks if the IP is private/internal
263
+ func IsInternalIP (ip string ) bool {
264
+ netIP := net .ParseIP (ip )
265
+ if netIP == nil {
266
+ return false
267
+ }
268
+
269
+ privateBlocks := []* net.IPNet {
270
+ {IP : net .IPv4 (10 , 0 , 0 , 0 ), Mask : net .CIDRMask (8 , 32 )}, // 10.0.0.0/8
271
+ {IP : net .IPv4 (172 , 16 , 0 , 0 ), Mask : net .CIDRMask (12 , 32 )}, // 172.16.0.0/12
272
+ {IP : net .IPv4 (192 , 168 , 0 , 0 ), Mask : net .CIDRMask (16 , 32 )}, // 192.168.0.0/16
273
+ {IP : net .IPv4 (127 , 0 , 0 , 1 ), Mask : net .CIDRMask (8 , 32 )}, // 127.0.0.0/8 (loopback)
274
+ {IP : net .IPv4 (169 , 254 , 0 , 0 ), Mask : net .CIDRMask (16 , 32 )}, // 169.254.0.0/16 (link-local)
275
+ }
276
+
277
+ // Check IPv4 private ranges
278
+ for _ , block := range privateBlocks {
279
+ if block .Contains (netIP ) {
280
+ return true
281
+ }
282
+ }
283
+
284
+ // Check IPv6 private ranges
285
+ privateIPv6Blocks := []* net.IPNet {
286
+ {IP : net .ParseIP ("::1" ), Mask : net .CIDRMask (128 , 128 )}, // Loopback
287
+ {IP : net .ParseIP ("fc00::" ), Mask : net .CIDRMask (7 , 128 )}, // Unique Local Addresses (ULA)
288
+ {IP : net .ParseIP ("fe80::" ), Mask : net .CIDRMask (10 , 128 )}, // Link-local
289
+ }
290
+
291
+ for _ , block := range privateIPv6Blocks {
292
+ if block .Contains (netIP ) {
293
+ return true
294
+ }
295
+ }
296
+
297
+ return false
298
+ }
0 commit comments