Creo que debería responderte alguien con más conocimientos de red que yo. O mandar la pregunta a un foro especializado en esto... Yo solo te puedo contestar algunas cosas.
vematom escribió:
Por favor, corrígeme si me equivoco: si me conecto con un puerto en el que no corre un servicio, el "sistema" me devolverá un "connection refused".
Bueno, en el mío, sí que sale ese mensaje.
vematom escribió:
Los 1024 puertos que están reservados son para correr "servidores" en ellos y no "clientes" por tanto si me conecto al puerto 110 de mi ordenador obtendré un error porque mi ordenador no es un servidor de correo. Me tendría que conectar al puerto 110 del ordenador servidor de correo (normalmente pop3.telefonica.net). Por eso, al abrir una página web, si hago un netstat -an, veré que hay una conexión desde el puerto X de mi ordenador al puerto 80 del servidor en el que se aloja la página web.
No exactamente...
Un programa servidor puede crear servicios en
cualquier puerto. En cualquier puerto que no esté ocupado por otro programa servidor, y que además no necesite privilegios (o los tenga, y el puerto es de los 1024 primeros). Lo
normal es que los servicios "normales" estén en puertos conocidos. Pero si son servicios especiales, pueden estar en cualquier otro. Por ejemplo, un servicio web normalmente estará escuchando en el 80, pero podríamos tenerlo en 84, 85, etc. Y un proxy, en el 8800, 8080, 8100, etc, etc.
Si te conectas al 110 y te da un error de conexión, no es porque tu ordenador no sea un servidor de correo (protocolo POP), sino porque NO hay ningún programa servidor escuchando en ese puerto (no necesariamente un servidor de correo POP).
El comando
netstat da un listado de las conexiones actuales. Y con
-a, agrega al listado los puertos que permanecen a la escucha (es decir, que hay un programa servidor esperando para dar servicio).
vematom escribió:
Ahora bien, supongamos que quiero hacer un programa en Perl que me permita ver todos los paquetes que salen de mi ordenador con destino a puertos concretos de otros ordenadores. Por ejemplo, peticiones DNS (puerto 53), conexión a páginas web (80). Esto con tcpdump se hace "tcpdump udp src port 53" pero yo quiero hacerlo en Perl. Supongo que consistirá en conectarme con la interfaz de red eth0 porque el tcpdump dice "listening on eth0..."
Depende del sistema operativo. En Linux, se suele usar la librería
pcap, para poder acceder a las facilidades de captura de los paquetes. En Windows, está la Winpcap.
Si entras en CPAN, puedes buscar por pcap, y encontrarás
algunos módulos al respecto, como por ejemplo,
Net::Pcap::Easy.
No sé si será posible hacerlo de otra manera.