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.
fonte
Respostas:
Você tem duas perguntas principais aqui:
1
Sim. Pegue, por exemplo, um roteador de balanceamento de carga que envie 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 gargalo de um únicoDST IP
.Isso significa que seu servidor da web pode ter várias conexões como:
e isso está perfeitamente bem. No entanto, se todos os 'Endereços estrangeiros' forem iguais, isso pode causar um problema (por exemplo, 'grande roteador que executa o servidor NAT <---> com um endereço IP').
Se eu tivesse que postular por que o esgotamento efêmero de portas não é um problema comum, sugiro que cada porta exija um serviço de escuta e recursos suficientes para responder - outro recurso (memória, CPU) normalmente é primeiro um gargalo.
No entanto, eu pessoalmente me deparei com alguns problemas de exaustão de portas ao trabalhar em uma empresa de balanceamento de carga.
2. Por que uma porta usada apresenta um problema para um serviço de escuta?
O servidor mySQL não pode se conectar a essa porta se estiver em uso - digamos por localhost: 3306 ou em todas as interfaces. Por exemplo, consulte a linha 0.0.0.0:80 na seguinte
netstat
saída?Isso significa que a porta 80 está escutando em todas as interfaces locais para o servidor. Se outro processo contiver a porta 80 antes do meu
nginx
servidor iniciar,nginx
não será possível assumir o controle dessa porta e provavelmente falhará no procedimento de inicialização.Normalmente, a porta 3306 é adequada porque os serviços de atendimento têm portas (ou faixas) predefinidas solicitadas da máquina host - por exemplo, as portas 80 e 443 para servidores da web.
fonte
a: sim, se a porta local for 1-65535, a contagem de conexões será de 65k-1 (uma porta será escutada)
a: Um único IP não pôde abrir mais de 65k conexões com meu servidor da Web em xxxx: 80, porque srcip, srcport, dstip, dstport é único. sim, você poderia suportar muito mais que 65k, se o soruce ip for diferente
fonte