Ancla y timónAdaptación texto web: Nina, 02-2004

Todo lo que Vd. quiso saber sobre los puertos y nunca se atrevio a preguntar.
Goleta José Antonio MerinoColaboración de Jose Antonio Merino

Bueno, como veo que el tema de los puertos es un tema recurrente, voy a intentar dedicar unos minutitos a explicar qué son los puertos y dar una pequeña charla sobre el tema para que luego pueda ser incluida en las futuras FAQs.

Bien, como todos sabeis, en TCP/IP todos los ordenadores tienen una única dirección IP que los identifica. Así pues, si un ordenador se quiere comunicar con otro, mediante la dirección IP conoce cuál es el ordenador con el que se quiere conectar. Lo que no todo el mundo sepa es que cuando se habla de TCP/IP, se está hablando en realidad de 2 protocolos: el TCP y el IP donde el protocolo IP es un protocolo que sirve únicamente de transporte, y el protocolo TCP sirve para comunicar aplicaciones.

Si no existiese protocolo IP, supongamos que estamos navegando por Internet con 2 sesiones del navegador abiertas donde en una estamos viendo las cotizaciones de bolsa y en otra nos estamos informando del tiempo. Si sólo existiese IP, cuando los datos de la cotización de BBVAllegasen a nuestro ordenador ¿cómo sabría que tienen que llegar a laventana del navegador que está viendo las cotizaciones y no del tiempo? Pues gracias a TCP.

Por convenio, las aplicaciones cuando tienen que enviar/recibir datos a través de la red se identifican con un número que va del 0 al 65535. Dicho número se llama puerto. Asi pues, se ha elegido por convenio que los servidores Web usan el puerto 80, que el servidor SMTP (donde se envían los correos) use el puerto 25 y que el servidor POP (donde se conecta el Outlook para descargar los correos) use el puerto 110.

Así pues el puerto identifica a la aplicación que está detrás. ¿Significa eso que los servidores Web sólo pueden tener el puerto 80 asignado? Pues no, un servidor Web puede ponerse a la escucha en cualquier puerto libre del ordenador (por ejemplo en el 10000), pero por defecto, cuando yo pongo www.google.es, el navegador mandará la petición de la página web a la dirección IP de google en el puerto 80.

Así que imaginemos que tenemos un servidor en el que está ejecutándose un servidor Web y un servidor de correo saliente (SMTP) en la dirección 10.0.0.1. Si abro el navegador y escribo http://10.0.0.1, éste mandará la petición de una página Web a la dirección 10.0.0.1 y en el puerto 80. Cuando llege la petición al servidor, este verá que la petición es para el puerto 80 y la mandará a la aplicación que está escuchando en ese puerto. Y si yo envío un correo electrónico con el Outlook, éste lo enviará a la dirección 10.0.0.1 y al puerto 25, donde está escuchando el servidor SMPT.

¿Y qué ocurreo cuando se devuelve la información? Volvamos al ejemplo de tener 2 navegadores abiertos, uno consultando las cotizaciones y otro el tiempo. Cuando yo abro un navegador, éste también elige un puerto para escuchar las peticiones. Lo que pasa que no es fijo, sino que se elije al azar. Así pues, cuando yo abro el primer navegador me ha elegido al azar el puerto 42001 y cuando abro el segundo navegador me ha elegido al azar el puerto 35000. Imaginad que quiero contactar con el ordenador cuya IP es 62.81.25.8 que es el que tiene la información bursatil y que mi ordenador tiene la IP 10.0.0.20. Cuando envío una petición al servidor Web de la 62.81.25.8, digo "Mi ordenador que es la 10.0.0.20 y mi aplicación que está en el puerto 42001, solicita una página Web al ordenador 62.81.25.8 y a la aplicación que está en el puerto 80". Obviamente, la aplicación que está en el puerto 80 (que es el servidor Web) responde con la página solicitada por el camino de vuelta (hacia mi IP y el puerto 42001). De esta forma es únicamente el primer navegador el que recibe la información solicitada.

Como veis, los puertos nos permiten tener varias aplicaciones que envien/reciben datos ejecutándose en el ordenador. He querido explicar esto para que entendais un poco mejor el porqué de los puertos.

Bien, deciros que los puertos prácticamente ya están asignados de antemano.

En esta página Web:http://www.iana.org/assignments/port-numbers, podreis encontrar información de los puertos asignados oficialmente. Pero ¡ojo! El que sean oficiales, no quiere decir que sean exclusivos. Es decir, yo puedo poner un servidor Web a funcionar en el puerto 110 (que es el puerto asignado oficialmente para bajar el correo). Nadie tiene la patente de que "este puerto es mío y ninguna otra aplicación en el mundo lo puede usar". Imaginad que habeis desarrollado una aplicación de mensajería instantánea al estilo del Messenger. Obviamente, necesitareis para compartir mensajes el establecer un puerto de escucha para que vuestra aplicación pueda recibir mensajes. ¿Cuál escogeríais? Pues yo que vosotros, me iría a la lista de puertos y eligiría uno que no estuviese ocupado. Y si vuestra aplicación tiene éxito, pues con el tiempo os acabarían reconociendo oficialmente ese puerto como un puerto de vuestra aplicación.

¿Cómo ver qué aplicaciones tenemos escuchando en qué puertos? Es fácil simplemente abrimos una ventana en modo de comandos (también llamado modo MS-DOS) y escribimos (sin comillas) "netstat -a". Vereis que os van apareciendo algo como esto:

Conexiones activas

Proto Dirección local Dirección remota Estado
TCP filemon:http filemon:0 LISTENING
TCP filemon:epmap filemon:0 LISTENING
TCP filemon:microsoft-ds filemon:0 LISTENING
TCP filemon:1025 filemon:0 LISTENING
TCP filemon:1026 filemon:0 LISTENING
TCP filemon:4662 filemon:0 LISTENING
TCP filemon:6995 filemon:0 LISTENING
TCP filemon:netbios-ssn filemon:0 LISTENING
TCP filemon:1128 ACB11064.ipt.aol.com:4662 ESTABLISHED
TCP filemon:1385 80.172.4.160:4662 ESTABLISHED
TCP filemon:2349 eu183-18.clientes.euskaltel.es:4662 ESTABLISHED
TCP filemon:2580 210.123.34.206:6661 TIME_WAIT
TCP filemon:2640 p509118C7.dip.t-dialin.net:4242 TIME_WAIT
TCP filemon:2662 218.0.203.237:4662 TIME_WAIT
TCP filemon:2664 218-163-146-112.HINET-IP.hinet.net:http TIME_WAIT
TCP filemon:2666 cmr-81-9-140-230.telecable.es:4662 TIME_WAIT
TCP filemon:2670 p213.54.84.37.tisdip.tiscali.de:4662 TIME_WAIT
TCP filemon:2672 pD9E93D64.dip.t-dialin.net:4662 TIME_WAIT
TCP filemon:4646 212.80.177.160:http TIME_WAIT
TCP filemon:4651 213.86.246.154:http ESTABLISHED
TCP filemon:4652 213.86.246.154:http ESTABLISHED
TCP filemon:4653 212.80.177.160:http ESTABLISHED

Como podreis ver, mi máquina se llama 'Filemón' y como podeis ver, tengo aplicaciones escuchando (estado LISTENING) en los puertos http (que es el 80), epmap (que es el 135), microsoft-ds (que es el 445), 1025, 1026, 4662, 6995 y netbios-ssn (139). Cuando Windows reconoce un número de puerto, lo sustituye por un texto. Si quereis saber qué texto se corresponde con cada puerto, windows sustituye el número de puerto por una tabla de correspondencia que se encuentra en fichero:

C:\WINDOWS\system32\drivers\etc\services. Si abrís ese fichero con el block de notas, vereis las correspondencias entre el número de puerto y el texto que aparece.

Y luego también tengo conexiones establecidas o en espera con otras máquinas en otros puertos (esto es debido a que tengo el e-donkey funcionando).

Si miramos a qué coresponde el puerto 4662, en la página Web oficial que os he dado, veremos que no está asignado a ninguna aplicación. Si en Google ponemos "puerto 4662", veremos que hay mucha información del e-donkey. Asi pues se trata de un puerto usado por ese programa para aceptar peticiones de descarga. Eso explica el porqué estoy escuchando en ese puerto y conectando también en ese puerto.

Las peticiones en las que fice que estoy conectado a Ips en el puerto http, son páginas Web que he estado visitando. Así pues, tengo varias sesiones de mi navegador conectadas en los puertos 4646, 4651, 4652 y 4653 a diversas páginas Web en varias direcciones IPs.

Como podeis ver, los puertos pueden ser nuestros amigos.

Por norma general, los puertos asignados por debajo del 1024 están reservados a servicios, y los que están asignados por encima del 1024 están reservador a aplicaciones que se conectan a esos servicios. Pero no es una norma general, puesto que las modernas aplicaciones están eligiendo puertos por encima del 1024 (por ejemplo, los puertos del servicio de chat (IRC) son el 6666, 6667, 6668).

Ahora una vez que conocemos qué son los puertos y cómo ver tanto los que tenemos escuchando en nuestra máquina como a los que estamos conectados, surge otra pregunta ¿cómo conocer qué aplicaciones están detrás de los puertos?

Imaginemos que tenemos una aplicación que está escuchando en el puerto
3127. ¿Qué aplicación es? Pues si nos veamos a la lista oficial de puertos, nos dice que el puerto 3127 está asignado a ctx-bridge. Realmente desconozco qué es ctx-bridge, así pues, dudo que lo tenga funcionando en mi máquina. Si me voy al google y escribo (con las comillas) "port 3127", me aparecen constantes referencias al virus MyDoom. Y efectivamente, indagando más veo que el virus MyDoom utiliza este puerto para recibir ejecutables en mi ordenador y ejecutarlos. Así pues, el que tengamos puertos abiertos en mi máquina "raros" pueden también significar que tengamos troyanos o virus metidos en nuestra máquina.

Para poder consultar una lista de los puertos que utilizan los troyanos, podemos visitar http://www.simovits.com/nyheter9902.html.

Y bueno, espero que haya aclarado alguna luz sobre el asunto. Por favor, preguntadme todas las dudas que os hayan surgido. Y si creeis que me olvido de algo, por favor comunicádmelo (y si he metido la pata en algo, también). Los comentarios y dudas son vitales para poder depurar este texto y que pueda servir en las FAQs de Grumetes.

Prometo otro día escribir sobre firewalls personales.


Divisor horizontal largoNina: Webmaster Taberna del Grumete
..