Exaustão da porta de rede Linux

10

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.

AB Carroll
fonte
Atualizei minha resposta com mais informações. Sinta-se livre para responder com qualquer pergunta.
você precisa saber é o seguinte

Respostas:

8

Você tem duas perguntas principais aqui:

1

Estritamente falando em IPv4, a exaustão de portas é realmente possível?

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 IPs se conectando ao gargalo 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 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 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."

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 netstatsaída?

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 locais para o servidor. Se outro processo contiver a porta 80 antes do meu nginxservidor iniciar, nginxnã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.

89c3b1b8-b1ae-11e6-b842-48d705
fonte
0

Eu poderia ter conexões de 65k de 127.0.0.1:(x) a 127.0.0.1:80 Eu poderia ter conexões de 65k de 127.0.0.1:(x) a 127.0.0.1:555

a: sim, se a porta local for 1-65535, a contagem de conexões será de 65k-1 (uma porta será escutada)

Basicamente, mais uma vez, a questão é (srcip, srcport, dstip, dstport) deve ser único, correto? a: sim

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 ao meu servidor da web em xxxx: 80, no entanto, eu poderia suportar muito mais de 65k no total, desde que sejam de IPs de origem diferentes?

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

uau qing
fonte