Tienes dos preguntas principales aquí:
1.
Hablando estrictamente de IPv4, ¿es realmente posible el agotamiento de puertos?
Sí. Tomemos, por ejemplo, un enrutador de equilibrio de carga que envía todas las conexiones a una dirección IP NAT. Es probable que esto suceda cuando tienes muchos SRC IP
s conectándose al cuello de botella de un único DST IP
.
Esto significa que su servidor web podría tener un montón de conexiones como:
[email protected]:~# netstat -pnt
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 173.200.1.18:80 10.100.1.100:49923 ESTABLISHED 13939/nginx: worker
tcp 0 0 173.200.1.18:80 10.200.1.200:10155 ESTABLISHED 13939/nginx: worker
tcp 0 0 173.200.1.18:80 10.10.1.10:14400 ESTABLISHED 13939/nginx: worker
tcp 0 0 173.200.1.18:80 10.10.1.10:50652 ESTABLISHED 13939/nginx: worker
tcp 0 0 173.200.1.18:80 10.20.1.20:57554 ESTABLISHED 13939/nginx: worker
y eso está perfectamente bien. Sin embargo, si todas las 'Direcciones extranjeras' fueran iguales, esto puede causar un problema (por ejemplo, 'gran enrutador que realiza NAT <---> servidor con una dirección IP').
Si tuviera que postular por qué el agotamiento efímero de puertos no es un problema común, sugeriría que es porque cada puerto requiere un servicio de escucha y suficientes recursos para responder:otro recurso (memoria, CPU) es normalmente un cuello de botella primero.
Sin embargo, personalmente me he encontrado con algunos problemas de agotamiento de puertos cuando trabajo en una empresa de equilibrio de carga.
2. ¿Por qué un puerto usado puede presentar un problema para un servicio de escucha?
"Lo que permite el uso de puertos efímeros desde 1024-65535, que si tengo servicios que se vinculan en el puerto 3306 (mySQL, por ejemplo), a veces no se iniciarán porque el puerto está en uso".
El servidor mySQL no puede vincularse a ese puerto si está en uso, digamos por localhost:3306 o en todas las interfaces. Por ejemplo, vea la línea 0.0.0.0:80 en el siguiente netstat
salida?
[email protected]:~# netstat -lnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 964/php-fpm.conf)
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 1660/mysqld
tcp 0 0 0.0.0.0:842 0.0.0.0:* LISTEN 1317/inetd
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 13938/nginx
Eso significa que el puerto 80 está escuchando en todos interfaces locales al servidor. Si otro proceso tiene el puerto 80 antes que mi nginx
el servidor comienza, nginx
no podrá tomar el control de ese puerto y probablemente fallará su procedimiento de inicio.
Normalmente, el puerto 3306 está bien porque los servicios de escucha tienen puertos (o rangos) predefinidos que se solicitan desde la máquina host, p. puerto 80 y 443 para servidores web.