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 13 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

  9. Kunal Tomar /
    Usando Google Chrome Google Chrome 120.0.0.0 en Windows Windows NT

    The female escorts employed by our call girl agency in Delhi are attractive and hilarious call girls. Delhi Escort Agency are available for hiring close to me, and Delhi escort agencies are well-known internationally. Age-appropriate and suited to our devoted clients’ wants, our assortment of young females. Offering our clients a real call girl Delhi number and a young lady companion who understands deeds and brotherhood feels fantastic.

  10. American Sports League /
    Usando Google Chrome Google Chrome 120.0.0.0 en Windows Windows NT

    Your article is a perfect article without a hitch. Thank you. My site: National Football League (NFL)

  11. duck life /
    Usando Google Chrome Google Chrome 120.0.0.0 en Windows Windows NT

    Entiendo que algunos programas pueden presentar dificultades para detenerse en el puerto 0, como es el caso de Apache. Es posible que en los registros (logs) te indiquen en qué puerto están escuchando, pero otros servidores, como MySQL, permiten la desespecificación del puerto y escuchan en un puerto aleatorio.

  12. redactle /
    Usando Google Chrome Google Chrome 121.0.0.0 en Windows Windows NT

    Thank you for your generous contribution. Excellent article. I discovered your blog and wanted to express how much I like reading your postings. In any case, I’ll subscribe to your feed and hope to hear from you soon. Thank you very much for the excellent information. This redactle game will be entertaining to play while you are bored at work or home.

    1. Marbella /
      Usando Google Chrome Google Chrome 122.0.0.0 en Windows Windows NT

      marbella https://wopi.es/jardines-de-las-golondrinas-alojamiento-turistico/

Leave a Reply