Saltar al contenido

¿Cómo se determinan los puertos de origen y cómo puedo forzarlo a usar un puerto específico?

Nuestro equipo de expertos luego de días de investigación y recopilar de información, obtuvieron los datos necesarios, nuestro deseo es que te sea de utilidad para tu plan.

Solución:

¿Cómo se determinan los puertos locales?

El software de implementación de TCP elige el número de puerto de un rango de números de puerto llamados puertos efímeros.

El mecanismo exacto para elegir el número de puerto y el rango que se utilizará depende del sistema operativo.


¿Hay alguna forma de obligarlo a ser 63999.

Esto se puede hacer cambiando la configuración del software de implementación de TCP.

Las instrucciones sobre cómo configurar el rango de puertos efímeros para una variedad de sistemas operativos diferentes se pueden encontrar en Cambiar el rango de puertos efímeros.

  • Las instrucciones para Linux y Windows se incluyen en esta respuesta a continuación como referencia.

Sin embargo, no es una buena idea restringir el rango a un solo puerto, por ejemplo 63999.

  • De hecho, en Windows esto no es posible ya que:

    El rango mínimo de puertos que se puede configurar es 255.


La gama de puertos efímeros

Una conexión TCP / IPv4 consta de dos puntos finales, y cada punto final consta de una dirección IP y un número de puerto. Por lo tanto, cuando un usuario cliente se conecta a una computadora servidor, una conexión establecida puede considerarse como la tupla de 4 (IP del servidor, puerto del servidor, IP del cliente, puerto del cliente).

Por lo general, tres de los cuatro se conocen fácilmente: la máquina cliente usa su propia dirección IP y cuando se conecta a un servicio remoto, se requieren la dirección IP y el número de puerto de servicio de la máquina servidor.

Lo que no es inmediatamente evidente es que cuando se establece una conexión, el lado del cliente de la conexión utiliza un número de puerto. A menos que un programa cliente solicite explícitamente un número de puerto específico, el número de puerto utilizado es un número de puerto efímero.

Los puertos efímeros son puertos temporales asignados por la pila de IP de una máquina y se asignan desde un rango designado de puertos para este propósito. Cuando finaliza la conexión, el puerto efímero está disponible para su reutilización, aunque la mayoría de las pilas de IP no reutilizarán ese número de puerto hasta que se haya utilizado todo el grupo de puertos efímeros.

Entonces, si el programa cliente se vuelve a conectar, se le asignará un número de puerto efímero diferente para su lado de la nueva conexión.

Fuente El rango de puertos efímeros


Cambio del rango de puertos efímeros

Linux:

Linux le permite ver y cambiar el rango de puertos efímeros simplemente usando el archivo /proc/sys/net/ipv4/ip_local_port_range. Por ejemplo, esto muestra la configuración predeterminada en un sistema kernel 2.2:

$ cat /proc/sys/net/ipv4/ip_local_port_range 
1024 4999

Para cambiar esto al rango preferido, puede hacer (como superusuario):

# echo "49152 65535" > /proc/sys/net/ipv4/ip_local_port_range 

Tenga en cuenta que deberá hacer esto cada vez que se inicie el sistema, así que asegúrese de agregar una línea a una secuencia de comandos de inicio del sistema, como /etc/rc.local
por lo que su rango siempre se usa.

También tenga en cuenta que el kernel de Linux 2.4 establecerá por defecto el rango de 32768 a 61000 si la memoria del kernel adecuada está disponible, por lo que es posible que no sea necesario cambiar el rango en los sistemas Linux más nuevos.

Por último, también tenga en cuenta que es posible que pueda utilizar el sysctl interfaz para cambiar la configuración en lugar de utilizar la /proc sistema de archivos. El nombre de sysctl el parámetro es “net.ipv4.ip_local_port_range”. Edite el /etc/sysctl.conf archivo si lo tiene, o tiene un script de inicio que ejecute el sysctl comando manualmente si desea cambiar este parámetro usando sysctl.

Windows Vista / Windows Server 2008 y más reciente:

A partir de Windows Vista y Windows Server 2008, Windows ahora usa un rango grande (49152-65535) de forma predeterminada, de acuerdo con el artículo 929851 de la base de conocimiento de Microsoft. Ese mismo artículo también muestra cómo puede cambiar el rango si lo desea, pero el rango predeterminado es ahora suficiente para la mayoría de los servidores.

Fuente que cambia el rango de puertos efímeros

Puede ver el rango de puertos dinámicos en un equipo que ejecuta Windows Vista o Windows Server 2008 mediante el siguiente
netsh comandos:

netsh int ipv4 show dynamicport tcp
netsh int ipv4 show dynamicport udp
netsh int ipv6 show dynamicport tcp
netsh int ipv6 show dynamicport udp 

Notas:

  • El rango se establece por separado para cada transporte y para cada versión de IP.
  • El rango de puertos es ahora verdaderamente un rango con un punto de partida y con un punto final.
  • Los clientes de Microsoft que implementan servidores que ejecutan Windows Server 2008 pueden tener problemas con la comunicación RPC entre servidores si se utilizan firewalls en la red interna.
  • En estos casos, recomendamos que reconfigure los firewalls para permitir el tráfico entre servidores en el rango de puertos dinámicos de 49152
    mediante 65535.
  • Esta gama se suma a los puertos conocidos que utilizan los servicios y las aplicaciones.
  • O bien, el rango de puertos que utilizan los servidores se puede modificar en cada servidor.

Puede ajustar este rango utilizando el netsh comando, de la siguiente manera:

netsh int  set dynamic  start=number num=range

Este comando establece el rango de puerto dinámico para TCP. El puerto de inicio es el número y el número total de puertos es el rango. Los siguientes son comandos de muestra:

netsh int ipv4 set dynamicport tcp start=10000 num=1000
netsh int ipv4 set dynamicport udp start=10000 num=1000
netsh int ipv6 set dynamicport tcp start=10000 num=1000
netsh int ipv6 set dynamicport udp start=10000 num=1000

Estos comandos de muestra establecen el rango de puerto dinámico para comenzar en el puerto 10000 y terminar en el puerto 10999 (1000 puertos).

Notas:

  • El rango mínimo de puertos que se puede configurar es 255.
  • El puerto de inicio mínimo que se puede configurar es 1025.
  • El puerto final máximo (basado en el rango que se está configurando) no puede exceder 65535.
  • Para duplicar el comportamiento predeterminado de Windows Server 2003, utilice 1025 como el puerto de inicio, y luego use 3976 como el rango para TCP y UDP. Esto da como resultado un puerto de inicio de 1025 y un puerto final de 5000.

Fuente del artículo 929851 de la base de conocimientos de Microsoft:

Windows XP y versiones anteriores:

Para los sistemas operativos Windows más antiguos (Windows XP y más antiguos), Windows usa el rango BSD tradicional de 1024 a 4999 para su rango de puertos efímeros. Desafortunadamente, parece que solo puede establecer el límite superior del rango de puertos efímeros. A continuación, se incluye información extraída del artículo 196271 de la base de conocimientos de Microsoft:

  • Inicie el Editor del registro (Regedt32.exe).
  • Busque lo siguiente key en el registro:

    HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParameters

  • En el menú “Editar”, haga clic en “Agregar valor” y luego agregue el siguiente valor de registro:

    Nombre del valor: MaxUserPort Tipo de datos: REG_DWORD Valor: 65534 (por ejemplo)

    Rango válido: 5000-65534 (decimal) Predeterminado: 0x1388 (5000 decimal)

    Descripción: este parámetro controla el número máximo de puerto utilizado cuando una aplicación solicita cualquier puerto de usuario disponible del sistema. Normalmente, los puertos efímeros (es decir, de corta duración) se asignan entre los valores de 1024 y 5000 inclusivo.

  • Salga del Editor del Registro.

Nota: hay otro artículo de KB relevante (812873) que afirma permitirle establecer un rango de exclusión, lo que podría significar que podría excluir puertos 1024-9999 (por ejemplo) para que el rango de puertos efímeros sea 10000-65534. Sin embargo, no hemos podido hacer que esto funcione (a octubre de 2004).

Fuente que cambia el rango de puertos efímeros

La respuesta de David Postill es perfectamente correcta. Solo me gustaría agregar algo más, haciendo hincapié en que cambiar el rango de puertos efímeros en Linux es tan simple, que el OP tiene una respuesta afirmativa.

Cambia el EPR de la siguiente manera:

echo "40000 60000" > /proc/sys/net/ipv4/ip_local_port_range 

y puede seleccionar el puerto 50000 (como ejemplo) con el siguiente script:

OLD_RANGE=$(cat /proc/sys/net/ipv4/ip_local_port_range)
MY_PORT=50000
echo "$MY_PORT $MY_PORT" > /proc/sys/net/ipv4/ip_local_port_range
sudo -u SomeUser SomeApplication  & 
echo $OLD_RANGE" > /proc/sys/net/ipv4/ip_local_port_range 

Una advertencia aquí: dado que hay un solo puerto en el rango, otra aplicación podría arrebatárselo entre la ejecución de la tercera y la cuarta línea de arriba; Además, incluso si no hay condición de carrera, paralizará todas las demás aplicaciones hasta que restaure un EPR grande, por lo que restauré el rango original lo antes posible.

Por lo tanto, si El sistema operativo de los OP había sido Linux, la respuesta habría sido que podría hacerse fácilmente.

Sorprendentemente, esto no es tan sencillo en BSD, algunos de los cuales ni siquiera tienen una configuración de kernel en tiempo de ejecución para EPR. MacOS X, FreeBSD y OpenBSD requieren modificar el archivo /etc/sysctl.conf, pero tienen diferentes opciones para el EPR.

Independientemente de lo anterior y del sistema operativo, el hecho de que algo pueden estar hecho no lo significa debería por hacer: ¿por qué demonios necesitas esto? No puedo pensar en un solo caso de uso.

Recuerda que tienes la opción de reseñar si diste con la solución.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *