Eu fiz o máximo de pesquisa possível sobre isso, sem me aprofundar na fonte do kernel. Parece haver uma grande quantidade de desinformação / informações incorretas sobre o assunto, então espero que isso responda à pergunta para mim e para os outros de uma vez por todas.
Estritamente falando em IPv4, a exaustão de portas é realmente possível? Deixe-me explicar:
- Aparentemente, existem 65535 portas disponíveis para uso. 0 não está disponível.
- Eu li que a exaustão da porta requer que a tupla (src ip, src port, dst ip, dst port) seja única.
- Para ser claro e supondo que eu possa usar 100% das portas efêmeras através da configuração sysctl net.ipv4.ip_local_port_range
E esta é a pergunta: é assim que funciona?
- Eu poderia ter 65k conexões de 127.0.0.1:(x) a 127.0.0.1:80
- Eu poderia ter 65k conexões de 127.0.0.1:(x) a 127.0.0.1:555
- Basicamente, mais uma vez, a questão é (srcip, srcport, dstip, dstport) deve ser único, correto?
- Não consegui abrir mais de 65k conexões do ip "A" ao IP "B", porta "N"
- Da mesma forma, um único IP não pôde abrir mais de 65k conexões com meu servidor da Web em xxxx: 80, no entanto, eu poderia suportar muito mais que 65k no geral, desde que sejam de IPs de origem diferentes ?
Finalmente, estou um pouco confuso sobre portas efêmeras (de saída) e portas de entrada que estão ouvindo. Sei que uma vez que a conexão é estabelecida, cada lado da conexão é igual e igual, mas antes que isso aconteça:
Por exemplo, se de fato a tupla (srcip, srcport, dstip, dstport) deve ser única, por que isso acontece se eu ativar, por exemplo
net.ipv4.ip_local_port_range = 1024 65535
O que permite o uso de portas efêmeras de 1024-65535, que se eu tiver serviços que se ligam à porta 3306 (mySQL, por exemplo), às vezes eles falham ao iniciar porque a porta está em uso.
Isso está relacionado ao fato de que: (E esta é uma declaração que estou pedindo para ser validada):
- (srcip, srcport, dstip, dstport) são necessários para serem exclusivos para cada conexão com o intervalo de portas 1-65535 (não prestando atenção ao uso de portas efêmeras do sistema operacional)
- No entanto, para um soquete vincular, ele pode ser visto como (srcip, srcport, *, *). Ou de outra maneira, o IP não deve estar usando essa porta por qualquer motivo para vincular?
Posso verificar o comportamento acima, ou seja, uso a linha sysctl exata acima e, por causa disso, mudei o mySQL para uma porta menor que 1024, porque ocasionalmente e muito aleatoriamente falhava ao reiniciar porque assumindo que o sistema operacional estava usando essa porta (3306) para uma porta efêmera.