Agotamiento del puerto de red Linux

10

He investigado todo lo que pude sobre esto sin excavar en la fuente del núcleo. Parece que hay una gran cantidad de desinformación / información incorrecta sobre el tema, así que espero que esto responda la pregunta para mí y para los demás de una vez por todas.

Estrictamente hablando IPv4, ¿es realmente posible el agotamiento de puertos? Dejame explicar:

  • Aparentemente hay 65535 puertos disponibles para su uso. 0 no está disponible.
  • He leído que el agotamiento del puerto requiere que la tupla (src ip, src port, dst ip, dst port) sea única.
  • Para ser claro y asumir que puedo usar el 100% de los puertos efímeros a través de la configuración sysctl net.ipv4.ip_local_port_range

Y esta es la pregunta: ¿es así como funciona?

  • Podría tener 65k conexiones de 127.0.0.1:(x) a 127.0.0.1:80
  • Podría tener 65k conexiones de 127.0.0.1:(x) a 127.0.0.1:555
  • Básicamente, una vez más, la pregunta es (srcip, srcport, dstip, dstport) debe ser único, ¿correcto?
  • No pude abrir más de 65k conexiones de ip "A" a IP "B", puerto "N"
  • Del mismo modo, una sola IP no podría abrir más de 65k conexiones a mi servidor web en xxxx: 80, sin embargo, ¿podría soportar mucho más de 65k en general, siempre que sean de diferentes IP de origen ?

Finalmente, estoy un poco confundido acerca de los puertos efímeros (salientes) y los puertos entrantes que están escuchando. Me doy cuenta de que una vez que se establece la conexión, cada lado de la conexión es igual e igual, pero antes de que eso suceda:

Por ejemplo, si de hecho la tupla (srcip, srcport, dstip, dstport) debe ser única, ¿por qué si habilito, por ejemplo?

net.ipv4.ip_local_port_range = 1024 65535

Lo que permite el uso de puertos efímeros desde 1024-65535, que si tengo servicios que se unen en el puerto 3306 (mySQL, por ejemplo), a veces no se iniciarán porque el puerto está en uso.

¿Relaciona esto el hecho de que: (Y esta es una declaración que solicito que se valide):

  • (srcip, srcport, dstip, dstport) son necesarios para ser únicos para cada conexión con el rango de puertos 1-65535 (sin prestar atención al uso de puertos efímeros por parte del sistema operativo)
  • Sin embargo, para que un socket se vincule, podría verse como (srcip, srcport, *, *). O otra forma de decir esto, ¿la IP no debe estar usando ese puerto por ningún motivo?

Puedo verificar el comportamiento anterior, es decir, utilizo la línea sysctl exacta anterior, y debido a ello moví mySQL a un puerto inferior a 1024 porque ocasionalmente y muy aleatoriamente no se reinicia porque suponiendo que el sistema operativo estaba usando ese puerto (3306) para un puerto efímero

AB Carroll
fuente
Actualicé mi respuesta con más información. Siéntase libre de responder con cualquier pregunta.
89c3b1b8-b1ae-11e6-b842-48d705

Respuestas:

8

Tienes dos preguntas principales aquí:

1)

Estrictamente hablando IPv4, ¿es realmente posible el agotamiento de puertos?

Si. Tomemos, por ejemplo, un enrutador de equilibrio de carga que envía todas las conexiones a una dirección IP NAT. Es probable que esto suceda cuando tiene muchos SRC IPs conectados al cuello de botella de uno solo DST IP.

Esto significa que su servidor web podría tener un montón de conexiones 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 

Y eso está perfectamente bien. Sin embargo, si todas las 'Direcciones extranjeras' fueran iguales, esto puede causar un problema (por ejemplo, 'gran enrutador que realiza un servidor NAT <---> con una dirección IP').

Si tuviera que postular sobre por qué el agotamiento efímero del puerto no es un problema común, sugeriría que se debe a que cada puerto requiere un servicio de escucha y suficientes recursos para responder: otro recurso (memoria, CPU) normalmente es un cuello de botella primero.

Sin embargo, personalmente me encontré con algunos problemas de agotamiento de puertos al trabajar en una empresa de equilibrio de carga.

2. ¿Por qué un puerto usado puede presentar un problema para un servicio de escucha?

"Lo que permite el uso de puertos efímeros desde 1024-65535, que si tengo servicios que se unen en el puerto 3306 (mySQL, por ejemplo), a veces no se iniciarán porque el puerto está en uso".

El servidor mySQL no puede vincularse a ese puerto si está en uso, digamos por localhost: 3306 o en todas las interfaces. Por ejemplo, ¿ve la línea 0.0.0.0:80 en la siguiente netstatsalida?

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     

Eso significa que el puerto 80 está escuchando en todas las interfaces locales del servidor. Si otro proceso retiene el puerto 80 antes de que se nginxinicie mi servidor, nginxno podrá tomar el control de ese puerto y es probable que falle su procedimiento de inicio.

Normalmente, el puerto 3306 está bien porque los servicios de escucha tienen puertos (o rangos) predefinidos que se solicitan desde la máquina host, por ejemplo, los puertos 80 y 443 para servidores web.

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

Podría tener 65k conexiones de 127.0.0.1:(x) a 127.0.0.1:80 Podría tener 65k conexiones de 127.0.0.1:(x) a 127.0.0.1:555

a: sí, si su puerto local es 1-65535, el recuento de conexiones es 65k-1 (un puerto es escuchar)

Básicamente, una vez más, la pregunta es (srcip, srcport, dstip, dstport) debe ser único, ¿correcto? a: si

No podía abrir más de 65k conexiones de ip "A" a IP "B", Puerto "N" Del mismo modo, una sola IP no podía abrir más de 65k conexiones a mi servidor web en xxxx: 80, sin embargo, podría soportar mucho más de 65k en general, siempre que sean de diferentes IP de origen?

a: Una sola IP no pudo abrir más de 65k conexiones a mi servidor web en xxxx: 80, porque srcip, srcport, dstip, dstport es único. sí, podría soportar mucho más de 65k, si soruce ip es diferente

wow qing
fuente