• Publicidad

Problema con localhost

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Problema con localhost

Notapor vematom » 2010-09-02 16:14 @718

Mi problema no es exactamente con Perl aunque tiene relación.

Pretendo aprender (por hobby) a usar Perl, principalmente para programar aplicaciones de Internet: robots para automatizar mi uso de Internet, comunicación entre ordenadores, sockets... etc. Una de las primeras cosas que se me han ocurrido es programar una especie de Tcpdump en Perl.

Para aprender, he descargado varios programas de ejemplo en Perl y los he ejecutado y resulta que todos los que conectan fuera de mi ordenador funcionan bien, pero en cuanto uso localhost me rechaza la conexión. telnet localhost me responde con connection refused para cualquier puerto. Y he llegado a la conclusión de que el problema es que tengo todos los puertos cerrados. Tanto en Windows como en Ubuntu me pasa lo mismo: connection refused. En casa tengo una LAN con varios ordenadores y en todos me pasa lo mismo. No tengo firewall activados ni en Windows ni en Ubuntu. Probé a abrir puertos en el router (NAT) hacia mi IP... nada. En el router tampoco tengo configurado ningún firewall ni filtro de contenido...

Sin embargo, el tcpdump sí parece funcionar. Copié una pequeña aplicación que usa NET::DNS para obtener la dirección dns de una pagina web y cuando la lanzo y en otra terminal ejecuto tcpdump udp dst port 53 -c 1 me captura el paquete UDP.

En resumen, que me quiero conectar a puertos de mi propio ordenador y no hay manera ¿alguna idea? ¿qué sentido tiene que mi propio ordenador no me permita conectar a sus puertos?

Una última pregunta ¿cuando hago telnet localhost, la petición va primero al router y del router a mi ordenador? Porque si es así tiendo a pensar que mi problema está en el router.

¿Me puede ayudar alguien?
vematom
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2010-09-02 15:40 @694

Publicidad

Re: Problema con localhost

Notapor explorer » 2010-09-02 16:39 @735

Bienvenido a los foros de Perl en Español, vematom.

Por regla general, en todos los ordenadores se define el término 'localhost' con la dirección 127.0.0.1, que el protocolo IP sabe que se refiere a la propia máquina. Entonces, cuando haces un telnet localhost, la conexión es directamente con tu propia máquina. No pasa por el enrutador.

Pero... no puedes conectarte de forma directa por el puerto que te de la gana.

En concreto, los 1024 primeros puertos están reservados para servicios especiales, por lo que el sistema no dejará que un usuario normal acceda a ellos.

Sí que puedes acceder con el tcpdump porque en ese momento estás adoptando la personalidad del Administrador (root) del sistema.

En cambio, si pasas de ser un usuario normal a root, podrás acceder a todos ellos.

Y, naturalmente, solo puedes conectarte a un puerto en el que exista un servidor escuchando. Si haces un telnet localhost estás iniciando una conexión al puerto 23 de tu propio ordenador. Si tu ordenador tiene un servidor de telnet, responderá. Si no, se cortará la conexión.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema con localhost

Notapor vematom » 2010-09-03 16:08 @714

Gracias por la bienvenida pero sobretodo gracias por contestar tan rápido y tan acertadamente. Tu respuesta me ha aclarado varias dudas a la vez.

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".

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.

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..."

Perdón por la extensión del mensaje y gracias de nuevo.
vematom
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2010-09-02 15:40 @694

Re: Problema con localhost

Notapor explorer » 2010-09-03 19:58 @873

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 escribiste: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 escribiste: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 escribiste: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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema con localhost

Notapor vematom » 2010-09-04 09:34 @440

Muchas gracias explorer, estoy más que satisfecho con tu respuesta.

Me ha quedado claro lo de los puertos y lo de la librería pcap es justo lo que busco. Bueno, realmente dado que mi intención es la de aprender, prefiero algo a un nivel más bajo que el pcap. Me refiero a que la librería es como una caja negra que te hace lo que quieres pero no aprendes nada con ella. Pero en cualquier caso me has apuntado en la dirección adecuada y ahora me toca investigar un poco a mí. Me has ahorrado muchos días de búsquedas infructuosas por la web.

Muchas gracias nuevamente y puedes marcar este asunto como hiperresuelto.
vematom
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2010-09-02 15:40 @694

Re: Problema con localhost

Notapor explorer » 2010-09-04 13:24 @600

He encontrado un artículo en PDF (en inglés) muy interesante, que explica con mucho más detalle el trabajo de captura de paquetes con Perl. Eso sí, sigue haciendo uso de la librería pcap, pero da mucha más información del contenido de los propios paquetes.

Ten en cuenta que, a medida de que profundizas en los detalles más cercanos al sistema operativo, la dificultad aumenta de forma exponencial. Por eso, si existe una librería que te aísla de muchas dificultades de acceso al sistema, la mayor parte de los programadores (que no sean de la parte de sistemas operativos), preferirán usarla.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 19 invitados