esgotamento de porta de rede Linux

10

Eu fiz o máximo de pesquisa possível sem investigar na fonte do kernel. Parece haver uma grande quantidade de desinformação / informações incorretas sobre o assunto, então espero que isso responda a pergunta para mim e para os outros de uma vez por todas.

Estritamente falando 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 o esgotamento da porta requer que a tupla (src ip, porta src, dst ip, dst port) seja única.
  • Para ficar claro e supondo que eu possa usar 100% de portas efêmeras via sysctl net.ipv4.ip_local_port_range setting

E esta é a questão: é 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 pergunta é (srcip, srcport, dstip, dstport) deve ser única, correta?
  • Eu não consegui abrir mais de 65k conexões de ip "A" para IP "B", Porta "N"
  • Da mesma forma, um IP único não pôde abrir mais de 65k conexões com meu servidor na xxxx: 80, mas eu poderia suportar muito mais de 65k, contanto que eles sejam de fonte diferente IPs ?

Finalmente, estou um pouco confuso sobre as portas efêmeras (de saída) e as portas de entrada que estão ouvindo. Eu percebo que uma vez que a conexão é estabelecida, cada lado da conexão é um par e igual, mas antes disso acontece:

Por exemplo, se de fato a tupla (srcip, srcport, dstip, dstport) deve ser única, por que é se eu ativar, por exemplo

net.ipv4.ip_local_port_range = 1024 65535

O qual permite o uso de portas efêmeras de 1024-65535, que se eu tiver serviços que ligam na porta 3306 (mySQL, por exemplo), eles algumas vezes falharão ao iniciar porque a porta está em uso.

Relaciona-se o 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 de 1-65535 (não prestando atenção ao uso de portas efêmeras pelo sistema operacional)
  • No entanto, para um soquete ligar, ele pode ser visto como (srcip, srcport, *, *). Ou outra maneira de colocar isso, é o IP não deve estar usando essa porta por algum motivo para vincular a?

Eu posso verificar o comportamento acima, ou seja, eu uso a linha sysctl exata acima, e por causa disso eu movi mySQL para uma porta menor que 1024 porque ocasionalmente e muito aleatoriamente falharia ao reiniciar porque assumindo que o sistema operacional estava usando essa porta (3306) para um porto efêmero.

    
por A.B. Carroll 24.04.2013 / 18:20

2 respostas

8

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.

    
por 24.04.2013 / 18:31
0

I could have 65k connections from 127.0.0.1:(x) to 127.0.0.1:80 I could have 65k connections from 127.0.0.1:(x) to 127.0.0.1:555

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

Basically once again, the question is (srcip,srcport,dstip,dstport) must be unique, correct? a: yes

I could not open any more than 65k connections from ip "A" to IP "B", Port "N" Likewise, a single IP could not open more than 65k connections to my webserver at x.x.x.x:80, however I could support much more than 65k overall as long as they are from different source IPs?

a: Um único IP não pôde abrir mais de 65k conexões para meu servidor da Web em x.x.x.x: 80, porque srcip, srcport, dstip, dstport é exclusivo. sim você poderia suportar muito mais que 65k, se soruce ip for diferente

    
por 01.12.2018 / 15:03