domingo, 3 de marzo de 2013

Netstat, ¿Quién está conectado a mi ordenador?

Buenas, en muchas ocasiones queremos saber si algún programa de nuestro ordenador se está conectando con otro programa en otro ordenador a través de la red, o dicho de otra manera, queremos saber si algún programa está haciendo uso de la red (conectándose a internet o a otro ordenador de nuestra propia red).

En esta entrada os enseñaré como ver las conexiones de red que tiene establecidas vuestro ordenador usando netstat. Gracias a esto podréis saber que programas están haciendo uso de la red, lo cual os puede servir además de para saber que programas en cuestión están haciendo uso de la red también para detectar posibles programas no autorizados que estén haciendo uso de la red en vuestro ordenador.

Bien, para saber que programas tienen alguna conexión establecida usaremos netstat, este programa viene en todos los sistemas linux (no necesitáis instalar nada), el programa lo ejecutaremos desde la línea de comandos.

Nota: Usando este método solo veremos los programas que usen una transmisión TCP, ya que UDP no está orientado a conexión (por lo tanto no existe ninguna conexión), de todos modos la gran mayoría de los programas usan TCP y no UDP.

El programa lo podemos ejecutar sin mas, osea, simplemente abrimos una shell y tecleamos netstat pero este método no es muy eficiente, ya que la salida de datos que nos dará el programa es demasiado grande y será demasiado liosa como para sacar conclusiones, así que os daré un par de opciones para usar con el programa para que produzca una salida mas limpia y fácil de interpretar.

Algunas de las opciones que podemos incluir son las siguientes:

-n: muestra la dirección y el puerto de manera numérica, esta opción en ocasiones puede interesarnos quitarla, para que se nos muestre el nombre de dominio y el nombre del puerto.

-t: muestra las conexiones TCP.

-p: muestra el nombre del proceso (programa) relacionado con la conexión.

Ejecutamos netstat con estas opciones:


netstat -ntp


y obtenemos una salida tal que así:





Nota: La salida ha sido truncada con el fin de que no rompa la estructura del blog, de todos modos la salida real es prácticamente la misma, solo he dejado los campos que me interesa comentar.

Los datos que nos muestra netstat son los siguientes:

Local Address: dirección de origen, con el formato IP:PUERTO.

Foreign Address: dirección de destino, con el formato IP:PUERTO.

State: Existen varios estados para las conexiones, pero principalmente los que veremos mas comúnmente son ESTABLISHED que indica que hay una conexión establecida, TIME_WAIT que indica que hay una comunicación en proceso de ser cerrada y CLOSE_WAIT que indica que hay una comunicacion cerrada por el extremo remoto y esperando a que el extremo local la finalice.

PID/Program name: indica el PID (identificador de proceso) y el nombre del proceso que esta participando en esa conexión.

En esta ocasión podemos observar que hay dos programas que tienen alguna conexión establecida, uno de ellos es telnet, y el otro es ftp, en este caso podemos ver que telnet esta conectado a través del puerto 23 con la dirección 192.168.120.30, osea que esta conectado a un dispositivo que esta en mi red, y el ftp esta conectado a través del puerto 21 con la dirección 208.118.235.20 que se corresponde con la dirección ip de ftp.gnu.org, en esta ocasión podría habernos beneficiado el quitar la opción -n para poder ver el nombre de dominio.

En el ejemplo anterior la salida se ve muy clara, ya que los programas solo establecen una conexión cada uno, pero por otra parte tendremos que tener cuidado con otros programas, como por ejemplo navegadores web o programas P2P, ya que estos programas suelen establecer varias conexiones y a la hora de hacer una consulta con netstat puede resultar un poco confuso y extraño, pero en realidad es algo normal, ya que por ejemplo cuando un navegador solicita una pagina web tiene que realizar varias conexiones a distintos sitios para poder obtener algunos elementos de la pagina web, como pueden ser imágenes o vídeos por ejemplo.

Si tenemos un navegador web abierto podríamos obtener una salida tal que así:





Como podemos ver en este caso el navegador tiene 3 conexiones establecidas, dos de ella son a través de https (puerto 443) y otra a través de http (puerto 80).

En caso de que queramos detectar algún programa no autorizado haciendo uso de la red podemos cerrar todos los programas que nosotros sabemos que realmente están haciendo uso de la red, como pueden ser el navegador web, un cliente ftp, programas p2p, cliente de correo...etc. una vez cerrados todos los programas, al ejecutar netstat nos debería de mostrar una salida vacía tal que así:





Si se nos mostrase algo, tendríamos que analizar exactamente de que programa se trata.

Nota: OJO! si acabáis de cerrar programas quizás se sigan mostrando con el netstat, probablemente con el estado TIME_WAIT o CLOSE_WAIT, en este caso solo tendríais que esperar a que las conexiones finalizasen del todo.

Quizá podría tratarse simplemente de algo inofensivo, como un programa del sistema buscando actualizaciones o algo parecido, de todos modos en caso de que se muestre algo y no sepáis exactamente de que programa se trata os recomiendo que primero busquéis información en Google sobre el nombre del proceso, si aun así no conseguís resolver las dudas os recomiendo matar el proceso, podéis hacerlo usando el comando kill y el numero identificador de proceso (PID) que muestra el netstat, de manera que si por ejemplo el proceso tuviese el PID 5430 lo mataríamos usando:


kill -s 9 5430


la opción -s 9 se usa para matar directamente el proceso.


y hasta aquí por ahora, espero que os haya gustado

Saludos :D


Número áureo (cálculo alternativo)

Holas, hace unas semanas publiqué una entrada en la que explicaba lo que era el número áureo y como se calculaba a partir de la secuencia de Fibonacci.

En esta entrada os mostraré una manera alternativa de calcular el número áureo, lo cierto es que esta manera de calcularlo me parece super curiosa, mas que nada por las operaciones que se realizan...

El cálculo en cuestión es el siguiente:


1+(1/1+(1/1+(1/1+(1/1+(1/1+(1/1))))))


La operación a simple vista puede parecer un poco engorrosa, pero realmente es una operación muy sencilla, lo único que estamos haciendo es sumar uno mas uno, y después dividir el segundo operando de la suma (el segundo uno) entre uno mas uno, y así seguido, la operación se puede repetir hasta el infinito, de manera que cuantos mas bucles realicemos mas preciso será el número áureo que obtengamos.

Y al igual que con el otro método, en esta ocasión también he diseñado un código para calcular el número áureo usando este método, os lo dejo a continuación:



#include <stdio.h>

int main(int argc, char *argv[])
{

 if(argc<2)
 {
  printf("\nSe necesita un argumento\n\n");
 
  return -1;
 }

 if(!(atoi(argv[1]) > 0 && atoi(argv[1]) <=37))
 {
  printf("\nEl argumento debe estar entre 0 y 37\n\n");

  return -1; 
 }

 int max, i=0;

 double inc = 1;

 max = atoi(argv[1]);

 for(i=0; i < max; i++)
 {
  inc=(double)1/((double)1+inc);

 }

printf("\nNumero Aureo: %.50lf\n\n", (double)1+inc);


}


Para usar el programa solo hay que indicarle como argumento el número de bucles que realizará el programa para calcular el número áureo.

y esto es todo por ahora.

Saludos =)