Estaba ejecutando un servicio que asignaba una IPv6 de la dirección native (ULA) a mi en0
interfaz. Inicialmente, pude agregar múltiples direcciones IPv6 sin ningún problema. Sin embargo, después de agregar 18 direcciones IPv6, encontré el siguiente error:
ifconfig: ioctl (SIOCAIFADDR): Can't allocate reminiscence
Incluso cuando traté manualmente de asignar otra dirección IPv6 usando:
sudo ifconfig en0 inet6 fc00:45bd::81aa:15c6 prefixlen 64 alias
Continué recibiendo el mismo error. Este error persistió hasta que eliminé algunas de las direcciones IPv6 asignadas previamente. Esencialmente, la 17ª dirección IPv6 se agregó sin ningún problema, pero el error comenzó a aparecer al intentar agregar la 18.
Al principio, sospeché que la detección de direcciones duplicadas (DAD) podría estar causando el problema. Revisé la configuración de mi papá cuando ya se asignaron 18 direcciones IPv6 usando:
sysctl -a | grep dad
Los valores iniciales fueron:
web.inet6.ip6.dad_count: 1
web.inet6.ip6.dad_enhanced: 1
web.inet6.ip6.nd6_dad_nonce_max_count: 3
web.inet6.icmp6.nd6_optimistic_dad: 63
Para investigar más a fondo, ejecuté el siguiente comando:
/usr/bin/sudo ifconfig en0 inet6 add fc00:2703::53eb:6d0a; whereas sleep 0.001; do ifconfig en0 | grep net6 | cat -n | grep fc00:2703::53eb:6d0a; carried out
Inicialmente, regresó:
ifconfig: ioctl (SIOCAIFADDR): Can't allocate reminiscence
1302 inet6 fc00:2703::53eb:6d0a prefixlen 64 tentative
1302 inet6 fc00:2703::53eb:6d0a prefixlen 64 tentative
.....
1302 inet6 fc00:2703::53eb:6d0a prefixlen 64 tentative
1302 inet6 fc00:2703::53eb:6d0a prefixlen 64
1302 inet6 fc00:2703::53eb:6d0a prefixlen 64
.....
1302 inet6 fc00:2703::53eb:6d0a prefixlen 64
1302 inet6 fc00:2703::53eb:6d0a prefixlen 64
Después de un tiempo, la dirección se asignó completamente sin el estado “tentativo”.
Luego discapacé a papá configurando:
web.inet6.ip6.dad_count: 0
web.inet6.ip6.dad_enhanced: 0
web.inet6.ip6.nd6_dad_nonce_max_count: 0
web.inet6.icmp6.nd6_optimistic_dad: 0
A pesar de deshabilitar a papá, todavía me encontré con el error de “no puedo asignar memoria” al intentar agregar otra dirección IPv6:
/usr/bin/sudo ifconfig en0 inet6 add fc00:3940::7013:336d; whereas sleep 0.001; do ifconfig en0 | grep net6 | cat -n | grep fc00:3940::7013:336d; carried out
La salida fue:
ifconfig: ioctl (SIOCAIFADDR): Can't allocate reminiscence
1303 inet6 fc00:3940::7013:336d prefixlen 64
1303 inet6 fc00:3940::7013:336d prefixlen 64
....
1303 inet6 fc00:3940::7013:336d prefixlen 64
La dirección se enumeró en la configuración de la interfaz, pero aún así resultó en el mismo error.
Para probar aún más este comportamiento, ejecuté el siguiente programa mínimo de Go que intenta agregar múltiples direcciones IPv6 a mi en0
interfaz:
bundle important
import (
"crypto/sha256"
"fmt"
"math/massive"
"math/rand"
"web/netip"
"os/exec"
)
func important() {
i := 0
for {
i++
//command := exec.Command("sudo", "ifconfig", "en0", "inet6", GenerateIPv6Address().String(), "prefixlen", "64", "alias")
command := exec.Command("sudo", "ifconfig", "en0", "inet6", "add", GenerateIPv6Address().String())
out, err := command.CombinedOutput()
if err != nil {
fmt.Println("u001B[33m", i, command.String(), "u001B[0m")
fmt.Println(fmt.Errorf(err.Error()))
fmt.Println("u001B[31m" + string(out) + "u001B[0m")
break
} else {
fmt.Println("u001B[32m", i, command.String()+"u001B[0m")
fmt.Println(string(out))
}
}
}
func GenerateIPv6Address() netip.Addr {
seedBytes := make([]byte, 8)
_, err := rand.Learn(seedBytes)
if err != nil {
return netip.Addr{}
}
hash := sha256.Sum256(seedBytes)
seedValue := new(massive.Int).SetBytes(hash[:8])
randInt := seedValue.Uint64()
group2 := randInt % 65534
group3 := (randInt >> 16) % 65534
group4 := (randInt >> 32) % 65534
ipStr := fmt.Sprintf("fc00:%x::%x:%x", group2, group3, group4)
if ip, err := netip.ParseAddr(ipStr); err == nil {
return ip
}
return netip.Addr{}
}
Estoy tratando de entender qué podría estar causando este problema y si hay un límite en el número de direcciones IPv6 que se pueden asignar a mi en0
interfaz.
¿Podría esto deberse a un núcleo interno o límite del sistema en el número de direcciones IPv6 por interfaz?
¿Hay alguna forma de aumentar este límite, o está codificado dentro de MacOS?
¿Hay registros o herramientas de diagnóstico que puedan proporcionar más información sobre por qué el sistema se niega a asignar más direcciones?