Publi

Lanzando servidores TCP/IP en puertos libres aleatorios haciendo bind al puerto 0

Servidores TCP en el puerto 0
¿Cómo? ¡Que los puertos TCP empiezan en el 1! Aunque algo sospechaba, porque en informática, el cero siempre ha valido para algo. Por eso se dice que los humanos empiezan a contar desde el uno y los informáticos desde el cero. Con esta cara me quedé cuando vi que puedes lanzar un servidor y que éste escuche en el puerto 0. Pero si el 0 no es un puerto válido, ¿para qué vale?

Cuando lanzamos un servidor y lo asociamos al puerto 0, el sistema escogerá un puerto aleatorio y libre con permiso para crear un servidor (por ejemplo los puertos menores al 1024 requieren de privilegios de administración o root). Así que nuestro servidor escuchará donde primero pille. Además, esto funciona tanto en sistemas Unix como en Windows, no tiene pérdida.
¿Y qué sentido tiene escuchar en un puerto aleatorio?¿Cómo sabrán nuestros usuarios en qué puerto acceder a los servicios? De primeras a mí se me ocurren ciertas cosas:

  • Para las prácticas de redes, o más bien para cuando estás programando un servidor. Si alguno de vosotros está haciendo prácticas de redes, éste es un buen consejo. Yo recuerdo hace muchos años que tenía que crear un servidor TCP con unas ciertas características y, claro, creas un programa, compilas, ejecutas, y… algo no va bien, lo cierras, cambias algo muy rápidamente, compilas, ejecutas y… ¡el puerto está en uso! Tenía que esperar al sistema operativo para que se diera cuenta de que el puerto no lo iba a utilizar más y lo cerrara. Entonces, si cada vez que lanzo el servidor lo lanzo en un puerto diferente… ¡problema solucionado! Que el SO cierre puertos cuando tenga tiempo. Otra forma de hacerlo sería poder especificar el puerto en el que asociamos el servidor cada vez que lo ejecutamos.
  • Lanzamiento de servidores de prueba. Por ejemplo, voy a abrir un servidor web temporal para que un compañero de piso/de trabajo/amigo o yo mismo desde otro ordenador me pueda descargar un fichero o enviarme un mensaje. Podemos acordar un puerto, por ejemplo el 40563, pero seguro que si tienes muchas cosas en el ordenador tirando de Internet, está en uso.
  • Como en el punto anterior… en lugar de un servidor web, puede ser un servicio de backup, un FTP, un servicio de correo…
  • Lanzar servicios experimentales en las máquinas de producción pruebas. Y así evitamos visitantes no deseados, y calentamientos de cabeza por puertos bloqueados.
  • Tener un servidor en un puerto localizado para la conexión de control, y crear un servidor por un puerto aleatorio para enviar o recibir datos (o cualquier cosa), por la conexión de control comunicar el puerto del otro servidor y empezar a transmitir por el otro lado. Algo parecido al FTP…
  • Más sugerencias en los comentarios!!

Aquí traigo un pequeño programa hecho en Python que nos devuelve un puerto libre y aleatorio, extraído de: The port 0 trick..

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import socket;

def findFreePorts(howMany=1):
    """Return a list of n free port numbers on localhost"""
    results = []
    sockets = []
    for x in range(howMany):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.bind(('localhost', 0))
        # work out what the actual port number it's bound to is
        addr, port = s.getsockname()
        results.append(port)
        sockets.append(s)

    for s in sockets:
        s.close()

    return results

print (findFreePorts(10));

Y podemos montar una prueba rápida con netcat.

nc -l 0

Luego desde otro terminal podemos hacer:

netstat -tanp | grep nc
tcp        0      0 0.0.0.0:38321       0.0.0.0:*        ESCUCHAR    9042/nc

De todas formas, hay programas a los que no les gusta que le des el puerto 0, como Apache, que se niega a encenderse en ese puerto. Otros servidores como MySQL, te dejan especificar el puerto 0 y de hecho escuchan en un puerto aleatorio, aunque podrían decirte aunque sea en logs en qué puerto están escuchando (podemos averiguarlo con la línea de antes del netstat). Y servidores como redis que si les das el puerto 0, no escuchan en ningún puerto TCP.

Foto principal: Scott Walsh

También podría interesarte....

There are 8 comments left Ir a comentario

  1. Pingback: Lanzando servidores TCP/IP en puertos libres aleatorios haciendo bind al puerto 0 | PlanetaLibre /

  2. 안전메이저사이트 /
    Usando Google Chrome Google Chrome 116.0.0.0 en Windows Windows NT

    Great work! Thiss is the қind of info thɑt should be shared around thee web. Disgrace ᧐n Google for now not positioning tһis post upper! Come on over and talk oѵer wіtһ mʏ website . 안전메이저사이트

  3. 메이저사이트추천 /
    Usando Google Chrome Google Chrome 116.0.0.0 en Windows Windows NT

    This really answered my problem, thank you! 메이저사이트추천

  4. 먹튀검증사이트추천 /
    Usando Google Chrome Google Chrome 116.0.0.0 en Windows Windows NT

    I’m going to read this. I’ll be sure to come back. thanks for sharing. 먹튀검증사이트추천

  5. sam /
    Usando Google Chrome Google Chrome 116.0.0.0 en Windows Windows NT

    such a great post.
    لعبة بادل

  6. 안전놀이터추천 /
    Usando Google Chrome Google Chrome 116.0.0.0 en Windows Windows NT

    It’s very informative and you are obviously very knowledgeable in this area. You have opened my eyes to varying views on this topic with interesting and solid content. 안전놀이터추천

  7. 메이저토토사이트 /
    Usando Google Chrome Google Chrome 116.0.0.0 en Windows Windows NT

    While looking for articles on these topics, I came across this article on the site here. 메이저토토사이트

  8. LIVE CASINO /
    Usando Google Chrome Google Chrome 118.0.0.0 en Windows Windows NT

    nice blog! its interesting. thank you for sharing.
    live casino games

Leave a Reply