Mejor rango de número de puerto TCP para aplicaciones internas [cerrado]

95

Trabajo en un lugar donde cada una de nuestras aplicaciones internas se ejecuta en una instancia individual de Tomcat y usa un puerto TCP específico. ¿Cuál sería el mejor rango de puertos de IANA para estas aplicaciones a fin de evitar colisiones de números de puerto con cualquier otro proceso en el servidor?

Basado en http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xml , estas son las opciones como las veo actualmente:

  1. Puertos del sistema (0-1023): no quiero usar ninguno de estos puertos porque el servidor puede estar ejecutando servicios en puertos estándar en este rango
  2. Puertos de usuario (1024-49151): Dado que las aplicaciones son internas, no pretendo solicitar a IANA que reserve un número para ninguna de nuestras aplicaciones. Sin embargo, me gustaría reducir la probabilidad de que otro proceso utilice el mismo puerto, por ejemplo, Oracle Net Listener en 1521.
  3. Puertos dinámicos y / o privados (49152-65535): este rango es ideal para números de puerto personalizados. Mi única preocupación es si esto sucediera:

    a. Configuro una de mis aplicaciones para usar el puerto X
    b. La aplicación está inactiva por unos minutos u horas (dependiendo de la naturaleza de la aplicación), dejando el puerto sin usar por un tiempo,
    c. El sistema operativo asigna el número de puerto X a otro proceso, por ejemplo, cuando ese proceso actúa como un cliente que requiere una conexión TCP a otro servidor. Esto tiene éxito dado que se encuentra dentro del rango dinámico y X no se utiliza actualmente en lo que respecta al sistema operativo, y
    d. La aplicación no se inicia porque el puerto X ya está en uso

Juanal
fuente
2
Respondí una pregunta similar aquí stackoverflow.com/a/38141340/3333759 que puede resultarle útil.
adrianwadey

Respuestas:

34

No veo por qué te importaría. Aparte de la regla de privilegio "no usar puertos por debajo de 1024", debería poder utilizar cualquier puerto porque sus clientes deberían ser configurables para comunicarse con cualquier dirección IP y puerto.

Si no es así, no se ha hecho muy bien. Vuelve y hazlos correctamente :-)

En otras palabras, ejecute el servidor en la dirección IP Xy el puerto y Yluego configure los clientes con esa información. Luego, si encuentra que debe ejecutar un servidor diferente Xque entre en conflicto con el suyo Y, simplemente vuelva a configurar su servidor y sus clientes para usar un nuevo puerto. Esto es cierto ya sea que sus clientes sean código o personas que ingresen URL en un navegador.

Yo, como usted, no trataría de que IANA me asignara números, ya que se supone que es para servicios tan comunes que muchos, muchos entornos los usarán (piense en SSH, FTP o TELNET).

Su red es su red y, si desea que sus servidores estén en el puerto 1234 (o incluso en los puertos TELNET o FTP), eso es asunto suyo. Por ejemplo, en nuestra área de desarrollo de mainframe, el puerto 23 se usa para el servidor de terminal 3270, que es una bestia muy diferente a telnet. Si desea hacer telnet al lado UNIX del mainframe, use el puerto 1023. A veces es molesto si usa clientes telnet sin especificar el puerto 1023, ya que lo conecta a un servidor que no sabe nada del protocolo telnet; tenemos que romper fuera del cliente telnet y hágalo correctamente:

telnet big_honking_mainframe_box.com 1023

Si realmente no puede hacer que el lado del cliente sea configurable, elija uno en el segundo rango, como 48042, y utilícelo, declarando que cualquier otro software en esas cajas (incluido cualquier agregado en el futuro) debe mantenerse fuera de su camino .

paxdiablo
fuente
Gracias. Después de leer su respuesta y pensarlo un poco más, decidí optar por la opción de usar un puerto dentro del segundo rango. Elegimos 46xxx ya que IANA actualmente tiene muy pocos puertos asignados en este enlace de subrango . No elegimos el tercer rango debido al escenario teóricamente posible (aunque muy poco probable) que describí.
Juanal
119

Decidí descargar los números de puerto asignados de IANA, filtrar los puertos usados ​​y ordenar cada rango "No asignado" en el orden de la mayoría de los puertos disponibles, en orden descendente. Esto no funcionó, ya que el archivo csv tiene rangos marcados como "Sin asignar" que se superponen con otras reservas de números de puerto. Expandí manualmente los rangos de números de puerto asignados , dejándome con una lista de todos los números de puerto asignados. Luego ordené esa lista y generé mi propia lista de rangos no asignados.

Dado que esta página de stackoverflow.com ocupó un lugar muy alto en mi búsqueda sobre el tema, pensé que publicaría los rangos más grandes aquí para cualquier otra persona que esté interesada. Estos son para TCP y UDP donde la cantidad de puertos en el rango es al menos 500.

Total   Start   End
829     29170   29998
815     38866   39680
710     41798   42507
681     43442   44122
661     46337   46997
643     35358   36000
609     36866   37474
596     38204   38799
592     33657   34248
571     30261   30831
563     41231   41793
542     21011   21552
528     28590   29117
521     14415   14935
510     26490   26999

Fuente (a través del botón de descarga de CSV):

http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml

David Vereb
fuente
"Es tcp y udp" como en: puedo abrir todos esos puertos, digamos que 44100-44199parece fácil de recordar porque el muestreo de audio 44100 tanto en udp como en tcp es seguro. ¿Tanto el udp 44100-44199 como el tcp 44100-44199 son gratuitos?
Lapsio
1
Lamentablemente no. Ha habido reservas adicionales desde que publiqué. Hay un puerto en su rango ahora. "z-wave-tunnel 44123 tcp Z-Wave Secure Tunnel"
David Vereb
bueno, afortunadamente, no creo que vaya a instalar los sistemas de seguridad domésticos inteligentes Z-Wave en el servidor de desarrollo. Los rangos de puertos utilizados anteriormente cubrían muchas cosas importantes, incluidas algunas herramientas de VMWare, por lo que era mucho peor. Si esa es la única colisión por ahora, estoy bien con eso, gracias :)
Lapsio
3
Así que decidí volver a ejecutar la lista para crear un nuevo conjunto de rangos basados ​​en datos más recientes. Resulta que los rangos "No asignados" no parecen estar numerados correctamente. Por ejemplo, 43124-44320 está marcado como no asignado, pero 44123, que está en ese rango, aparece justo encima de él como asignado. Parece que tendré que crear manualmente los rangos no asignados, ya que parecen calculados incorrectamente.
David Vereb
6

Respuesta corta: use un puerto de usuario no asignado

La respuesta del triunfador: seleccione e implemente una solución de descubrimiento de recursos. Haga que el servidor seleccione un puerto privado de forma dinámica. Haga que los clientes utilicen el descubrimiento de recursos.

El riesgo de que un servidor falle porque el puerto en el que quiere escuchar no está disponible es real; al menos me ha pasado. Otro servicio o un cliente pueden llegar primero.

Puede reducir casi por completo el riesgo de un cliente evitando los puertos privados, que se entregan dinámicamente a los clientes.

El riesgo de que provenga de otro servicio es mínimo si utiliza un puerto de usuario. El riesgo de un puerto no asignado es solo que otro servicio esté configurado (o dinámicamente) use ese puerto. Pero al menos eso probablemente esté bajo tu control.

El enorme documento con todas las asignaciones de puertos, incluidos los puertos de usuario, está aquí: http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.txt busque el token Sin asignar .

Ben Hyde
fuente
4
¿No es mejor usar un puerto asignado para un protocolo que nunca se usará en su red? Un puerto no asignado podría asignarse en cualquier momento y causarle problemas.
adrianwadey