Você tem duas perguntas principais aqui:
1.
Strictly IPv4 speaking, is port exhaustion actually possible?
Sim. Tomemos, por exemplo, um roteador de balanceamento de carga enviando todas as conexões para um endereço IP NAT. É provável que isso aconteça quando você tiver muitos SRC IP
s se conectando ao afunilamento de um único DST IP
.
Isso significa que seu servidor da Web pode ter várias conexões, como:
root@buglab:~# 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
e isso está perfeitamente bem. No entanto, se todos os "endereços estrangeiros" forem os mesmos, isso pode causar um problema (por exemplo, "grande roteador que realiza NAT < --- > servidor com um endereço IP").
Se eu tivesse que postular por que a exaustão de portas efêmeras não é um problema comum, sugiro que seja porque cada porta requer um serviço de escuta e recursos suficientes para responder - outro recurso (memória, cpu) é normalmente um gargalo em primeiro lugar.
No entanto, eu pessoalmente me deparei com alguns problemas de exaustão de porta ao trabalhar em uma empresa de balanceamento de carga.
2. Por que uma porta usada pode apresentar um problema para um serviço de escuta?
"Which allows the use of ephemeral ports from 1024-65535, that if I have services that bind on port 3306 (mySQL, for example), they will sometimes fail to start because the port is in use."
O servidor mySQL não pode ligar a essa porta se estiver em uso - digamos por localhost: 3306 ou em todas as interfaces. Por exemplo, veja a linha 0.0.0.0:80 na seguinte netstat
output?
root@buglab:~# 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
Isso significa que a porta 80 está escutando em todas as interfaces todas locais do servidor. Se outro processo contiver a porta 80 antes do início do meu nginx
server, nginx
não poderá assumir o controle dessa porta e provavelmente falhará em seu procedimento de inicialização.
Normalmente, a porta 3306 é adequada porque os serviços de escuta têm portas (ou intervalos) predefinidas que são solicitadas da máquina host - por exemplo, porta 80 e 443 para servidores web.