26 feb. 2012

Geolocalización de direcciones IP y dominios de Internet con GeoIP en python

A nivel mundial se crearon varios grupos de direcciones IP de IPv4 (Clases A,B o C) la cual permiten definir redes y rango de equipos para dichas redes.

Claro actualmente se está migrando a IPv6 ya que las direcciones IPv4 se agotaron hace un par de años aproximadamente (aunque existan soluciones como NAT, Subnetting o Supernetting que permiten utilizar más eficientemente las IPs).

Con GeoIP para python se puede averiguar de cual País proviene una IP, también se puede conocer un dominio o sitio en específico donde se encuentra alojado, conocer el rango de IPs de una clase de IPv4.

Para instalar python-geoip a lo Debian (Debian, Canaima, Ubuntu, LinuxMint), se convierte el usuario en superusuario y ejecuta:
#apt-get install python-geoip

Se ejecuta el interprete de comandos de python:
ecrespo@jewel:~$ python
Python 2.7.2+ (default, Dec  1 2011, 01:55:02)
[GCC 4.6.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 

Se importa el módulo geoip:
>>> import GeoIP

Se crea el objeto de la Instancia de GeoIP, asociandole la información de GeoIP de la memoria Cache:
>>> gi = GeoIP.new(GeoIP.GEOIP_MEMORY_CACHE)

Se busca en cual País se encuentra alojado yahoo.com:
>>> print gi.country_code_by_name("yahoo.com")
US
>>> print gi.country_name_by_name("yahoo.com")
United States


En el primer caso se devuelve el código del País, en el segundo se devuelve el nombre del País.

Ahora se probará con yahoo.es:
>>> print gi.country_code_by_name("www.yahoo.es")
IE
>>> print gi.country_name_by_name("www.yahoo.es")
Ireland


Se nota que yahoo.com está alojado en Estados Unidos y yahoo.es se encuentra alojado en Irlanda.

Ahora se buscará en cual País se encuentra alojado www.cantv.net (es obvio):
>>> print gi.country_code_by_name("www.cantv.net")
VE
>>> print gi.country_name_by_name("www.cantv.net")
Venezuela


Aunque es posible que dominios de Venezuela se encuentren alojados en otros Países, un ejemplo sería www.crespo.org.ve:
>>> print gi.country_name_by_name("www.crespo.org.ve")
Sweden


Para terminar se probará averiguar el País según la IP que se le pase:
>>> print gi.country_name_by_addr("24.24.24.24")
United States
>>> print gi.country_name_by_addr("150.186.32.0")
Venezuela

La primera IP se encuentra en Estados Unidos y la segunda en Venezuela.

Para averiguar el rango de IPs de la IP de Venezuela se ejecuta geoip solicitando que devuelva el rango de IPs:
>>> print gi.range_by_ip("150.186.32.0")
('150.185.0.0', '150.189.255.255'

Está Ip por el rango de direcciones que maneja es una clase B.

Con esta herramienta se puede usar para aplicaciones Web con Django por ejemplo y dicha aplicaciones puede mostrar información del País donde se conectan los usuarios.



20 feb. 2012

Cifrar el tráfico de DNS en Linux con DNSCrypt y OpenDNS

DNSCrypt permite cifrar las consultas de DNS entre el Computador y los servidores de DNS de OpenDNS, de esa forma se puede proteger al equipo de los ataques de Hombre en el Medio.

El artículo donde se basa este tutorial se encuentra en el siguiente enlace.
Para instalar dnscrypt para Debian se baja el paquete desde el repositorio de Github.

 Se ejecuta dpkg:

#dpkg -i dnscrypt-proxy_0.9_i386.deb

Se inicia el proxy dns como demonio:
#dnscrypt-proxy --daemonize

Se edita las conexiones inalámbricas en este caso en la red que se conecta el equipo es inalámbrica:


Se selecciona la red inalámbrica y se edita su configuración:

Se selecciona la pestaña de Ajuste de IPv4, en el método se selecciona Sólo direcciones automáticas (DHCP) y se coloca la IP 127.0.0.1 en Servidor de DNS:

Para verificar que se esté usando los servidores de DNS de OpenDNS se abre el navegador a la URL http://www.opendns.com/welcome :


Ya se tiene cifrado la comunicación a los servidores de OpenDNS.

19 feb. 2012

Conectarse al repositorio de bitbucket desde python

Para tener un proyecto con control de versiones mercurial sólo veo 2 opciones usar Google Code o Bitbucket.  Para el caso de Google Code se puede acceder vía el api para usar mercurial con python como se explico en artículo anterior.

Para Bitbucket se tiene un API para acceder a la información del repositorio que en python se llama python-bitbucket.
Para instalarlo se sigue los siguientes pasos:
A lo Debian/Canaima/Ubuntu/LinuxMint:
#apt-get install python-bitbucket

Con la herramienta easy_install:
#easy_install bitbucket

Con la herramienta pip:
#pip install bitbucket

Usar el API de bitbucket:
Desde la consola de python, se importa el módulo bitbucket
$python

>>> import bitbucket

Se crea la instancia de bitbucket.

>>> bb = bitbucket.BitBucket()

Se establece conexión a la cuenta de bitbucket :
>>> bb = bitbucket.BitBucket('ecrespo', 'clave')

Se verifica que se autentico en el servicio:
>>> bb
<BitBucket API (auth: ecrespo)>

Se asocia la cuenta:
>>> ecrespo = bb.user('ecrespo')
>>> ecrespo
<User: ecrespo>

Se lista los repositorios del usuario (se devuelve una lista con los repositorios del usuario, cada elemento de la lista es un diccionario con la información del repositorio):
>>> ecrespo.repositories()
[{u'scm': u'hg', u'has_wiki': True, u'last_updated': u'2011-09-12 03:56:37', u'created_on': u'2009-04-09 22:42:58', u'owner': u'ecrespo', u'logo': None, u'email_mailinglist': u'', u'is_mq': False, u'size': 747499, u'read_only': False, u'fork_of': None, u'mq_of': None, u'state': u'available', u'utc_created_on': u'2009-04-09 20:42:58+00:00', u'website': u'', u'description': u'Script que automatiza el proceso de conversi\xf3n de un sistema Debian/Ubuntu para que sea accesible para las personas con discapacidad visual', u'has_issues': True, u'is_fork': False, u'slug': u'automatizar-accesibilidad', u'is_private': False, u'name': u'automatizar-accesibilidad', u'language': u'', u'utc_last_updated': u'2011-09-12 01:56:37+00:00', u'email_writers': True, u'main_branch': u'default', u'no_public_forks': False, u'resource_uri': u'/api/1.0/repositories/ecrespo/automatizar-accesibilidad'}, {u'scm': u'hg', u'has_wiki': True, u'last_updated': u'2011-09-08 13:09:06', u'created_on': u'2011-08-04 05:02:06', u'owner': u'ecrespo', u'logo': None, u'email_mailinglist': u'', u'is_mq': False, u'size': 545, u'read_only': False, u'fork_of': None, u'mq_of': None, u'state': u'available', u'utc_created_on': u'2011-08-04 03:02:06+00:00', u'website': u'', u'description': u'Lista de paquetes para la accesibilidad con una descripci\xf3n y pruebas de los mismos', u'has_issues': False, u'is_fork': False, u'slug': u'accesibilidad', u'is_private': True, u'name': u'accesibilidad', u'language': u'', u'utc_last_updated': u'2011-09-08 11:09:06+00:00', u'email_writers': True, u'main_branch': None, u'no_public_forks': False, u'resource_uri': u'/api/1.0/repositories/ecrespo/accesibilidad'}]

Se captura la descripción del repositorio y la ruta del mismo:
>>> ecrespo.repositories()[0]['description']
u'Script que automatiza el proceso de conversi\xf3n de un sistema Debian/Ubuntu para que sea accesible para las personas con discapacidad visual'

>>> ecrespo.repositories()[0]['resource_uri']
u'/api/1.0/repositories/ecrespo/automatizar-accesibilidad'

Se asocia a uno de los repositorios, en este caso el de accesibilidad.
>>> pyaccesibilidad=ecrespo.repository('accesibilidad')

>>> pyaccesibilidad
<Repository: ecrespo's accesibilidad>

Se lista los tags o branches (para el caso del repositorio accesibilidad devuelve diccionarios vacíos):
>>> pyaccesibilidad.tags()
{}

>>> pyaccesibilidad.branches()
{}






7 feb. 2012

Obtener información de las interfaces de red con python(netifaces)

Existe un módulo en python que permite obtener la información de las interfaces de red.

Dicho módulo se llama netifaces, con él se puede obtener la lista de interfaces de su equipo, obtener la información de Enlace de Red de cada interfaz, su dirección IPv4 y su Dirección IPv6.

Para instalar el módulo se ejecuta apt-get para el caso de Debian/Canaima/Ubuntu.
#apt-get install python-netifaces

La idea es crear un script que capture la lista de interfaces del equipo y muestre la información de cada una de dichas interfaces.

El código del programa se muestra a continuación:

#!/usr/bin/env python

#Se importa el modulo netifaces
import netifaces

#Se captura la lista de interfaces en el equipo
interfaces = netifaces.interfaces()
#Se muestra las interfaces
print "interfaces: ", interfaces

#Se recorre la lista de interfaces
for interface in interfaces:
#Se captura la informacion de cada interfaz
datos = netifaces.ifaddresses(interface)
print "--------------------------"
#Se muestra el nombre de la interface
print "Interface: %s" %interface
#Se captura la lista de parametros que tiene la interface
variables = datos.keys()
#Se muestra la direccion de la capa de enlace de red de la interface
print "Capa de enlace de red: ", datos[netifaces.AF_LINK][0]['addr']
#Si esta presente la informacion de IPV4 se muestra
if netifaces.AF_INET in variables:
print "IPv4: IP: %s, Mascara: %s" %(datos[netifaces.AF_INET][0]['addr'], datos[netifaces.AF_INET][0]['netmask'])
#Si esta presente la informacion de IPv6 se muestra
if netifaces.AF_INET in variables:
print "IPv6: IP: %s, Mascara: %s " %(datos[netifaces.AF_INET6][0]['addr'], datos[netifaces.AF_INET6][0]['netmask'])


El resultado del programa se muestra a continuación:

interfaces: ['lo', 'eth0', 'wlan0']
--------------------------
Interface: lo
Capa de enlace de red: 00:00:00:00:00:00
IPv4: IP: 127.0.0.1, Mascara: 255.0.0.0
IPv6: IP: ::1, Mascara: ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
--------------------------
Interface: eth0
Capa de enlace de red: 71:6a:b7:77:46:5f
--------------------------
Interface: wlan0
Capa de enlace de red: 00:26:85:74:fe:89
IPv4: IP: 192.168.10.108, Mascara: 255.255.255.0
IPv6: IP: fe80::236:92ff:fa54:fe89%wlan0, Mascara: ffff:ffff:ffff:ffff::


Para más información sobre el módulo pueden visitar la información en la página de Python o el sitio de la aplicación.

6 feb. 2012

WebService con Soappy

Hace ya mucho tiempo escribí un ejemplo de como usar xml-rpc desde python como webservice.
En este caso se explicará el uso de otro protocolo que deriva de xml-rpc que se llama SOAP (Simple Object Access Protocol).

SOAP es un protocolo estándar que define cómo dos objetos en diferentes procesos pueden comunicarse por medio del intercambio de datos XML. Pueden conseguir más información en la página de wikipedia.


En python existe un módulo para trabajar con SOAP que se llama soappy. Lo primero que se hará es instalarlo.

#apt-get install python-soappy

La idea es crear 4 funciones, de suma, resta, multiplicación y división, registrarlas en el servicio SOAP, levantar el servidor y realizar las llamadas desde el cliente.

El programa servidor de SOAP es el siguiente:


#!/usr/bin/env python

import SOAPpy

#Funciones que devuelven la suma, resta, multiplicacion y division de 2 numeros

def suma(a,b):
    return a+b

def resta(a,b):
    return a-b

def multiplicacion(a,b):
    return a*b

def division(a,b):
    return a/b

#Se crea la instancia del servicio SOAP en el equipo por el puerto 8080.
server = SOAPpy.SOAPServer(("localhost", 8080))

#Registro de las funciones suma,resta, multiplicacion y division
#en el servicio SOAP.
server.registerFunction(suma)
server.registerFunction(resta)
server.registerFunction(multiplicacion)
server.registerFunction(division)

#Levantar el servicio SOAP.
server.serve_forever()

El programa cliente de SOAP es el siguiente:
#!/usr/bin/env python

#Se importa el modulo SOAPpy
import SOAPpy

#Se crea la instancia del proxy SOAP
#a el servidor SOAP
server = SOAPpy.SOAPProxy("http://localhost:8080/")

#Se llama las funciones registradas en el servidor SOAP
print "El resultado de la suma es: ", server.suma(5,10)
print "El resultado de la resta es: ",server.resta(20,5)
print "El resultado de la multiplicacion es: ", server.multiplicacion(10,5)
print "El resultado de la division es: ", server.division(10,3)

Se le da permisos de ejecución a ambos archivos, se ejecuta primero el servidor y luego el cliente que devuelve el siguiente resultado:

Se ejecuta cada programa en una consola distinta.
ecrespo@jewel:~/bin$ ./soapservidor.py

ecrespo@jewel:~/bin$ ./soapcliente.py
El resultado de la suma es:  15
El resultado de la resta es:  15
El resultado de la multiplicacion es:  50
El resultado de la division es:  3


AddThis