@@ -258,3 +258,41 @@ func MachinesAsString(machines []*clusterv1.Machine) string {
258258 }
259259 return message
260260}
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