He investigado todo lo que pude sobre esto sin excavar en la fuente del núcleo. Parece que hay una gran cantidad de desinformación / información incorrecta sobre el tema, así que espero que esto responda la pregunta para mí y para los demás de una vez por todas.
Estrictamente hablando IPv4, ¿es realmente posible el agotamiento de puertos? Dejame explicar:
- Aparentemente hay 65535 puertos disponibles para su uso. 0 no está disponible.
- He leído que el agotamiento del puerto requiere que la tupla (src ip, src port, dst ip, dst port) sea única.
- Para ser claro y asumir que puedo usar el 100% de los puertos efímeros a través de la configuración sysctl net.ipv4.ip_local_port_range
Y esta es la pregunta: ¿es así como funciona?
- Podría tener 65k conexiones de 127.0.0.1:(x) a 127.0.0.1:80
- Podría tener 65k conexiones de 127.0.0.1:(x) a 127.0.0.1:555
- Básicamente, una vez más, la pregunta es (srcip, srcport, dstip, dstport) debe ser único, ¿correcto?
- No pude abrir más de 65k conexiones de ip "A" a IP "B", puerto "N"
- Del mismo modo, una sola IP no podría abrir más de 65k conexiones a mi servidor web en xxxx: 80, sin embargo, ¿podría soportar mucho más de 65k en general, siempre que sean de diferentes IP de origen ?
Finalmente, estoy un poco confundido acerca de los puertos efímeros (salientes) y los puertos entrantes que están escuchando. Me doy cuenta de que una vez que se establece la conexión, cada lado de la conexión es igual e igual, pero antes de que eso suceda:
Por ejemplo, si de hecho la tupla (srcip, srcport, dstip, dstport) debe ser única, ¿por qué si habilito, por ejemplo?
net.ipv4.ip_local_port_range = 1024 65535
Lo que permite el uso de puertos efímeros desde 1024-65535, que si tengo servicios que se unen en el puerto 3306 (mySQL, por ejemplo), a veces no se iniciarán porque el puerto está en uso.
¿Relaciona esto el hecho de que: (Y esta es una declaración que solicito que se valide):
- (srcip, srcport, dstip, dstport) son necesarios para ser únicos para cada conexión con el rango de puertos 1-65535 (sin prestar atención al uso de puertos efímeros por parte del sistema operativo)
- Sin embargo, para que un socket se vincule, podría verse como (srcip, srcport, *, *). O otra forma de decir esto, ¿la IP no debe estar usando ese puerto por ningún motivo?
Puedo verificar el comportamiento anterior, es decir, utilizo la línea sysctl exacta anterior, y debido a ello moví mySQL a un puerto inferior a 1024 porque ocasionalmente y muy aleatoriamente no se reinicia porque suponiendo que el sistema operativo estaba usando ese puerto (3306) para un puerto efímero