miércoles, marzo 25, 2015

Debugging con gdb y usando Dev-C++

Debugging con gdb

Para poder realizar el debug con gdb de un código en C o C++ tenemos que compilar con la opción -g de la siguiente manera:

$ gcc -g -o nombre_ejecutable archivo.c

donde -g habilita la opció de debug, -o le da al archivo ejecutable el nombre de nombre_ejecutable que creará al archivo nombre_ejecutable.exe y archivo.c es nuestro código fuente.

para realizar l debug con gdb:

$ gdb ./nombre_ejecutable
(gdb)

veamos algunos comandos útiles:
(gdb) break main      (crea un breakpoint en nuestra clase principal main)

(gdb) run                  (ejecutará el código hasta encontrar el primer breakpoint)
 
(gdb) continue         (ejecuta el resto del código hasta el próximo breakpoint)
(gdb) step                (ejecuta próxima línea de código)
(gdb) next               (igual que next pero no ejecuta la línea, la considera como la próxima instrucción)
(gdb) break contar  (crea un breakpoint en la función "contar")
(gdb) archivo.c:22  (crea un breakpoint en la línea 22 del archivo fuente archivo.c)
(gdb) print nombre_variable (imprime la variable "nombre_variable" definida en el código)

(gdb) info breakpoints  (lista los breakpoints existentes)

(gdb) delete breakpoint 1 (elimina el breakpoint 1)
(gdb) delete breakpoint 4-7 (elimina el rango de breakpoints del 4 al 7)

Debugging usando el entorno Dev-C++

es importante que nuestro código corra dentro de un proyecto, es decir, debemos crear el proyecto siguiendo los pasos siguientes:
File -> New -> Project

seleccionar por ejemplo "console application" si nuestro código se ejecutará en consola (o elegir otra opción que corresponda), seleccionar si el código está desarrollado en C o C++, colocar nombre de archivo y luego oprimir OK.

Luego debemos crear nuestro código fuente y posteriormente habilitar la opción de debug, para ello deben seguir estos pasos:

Project -> Project Options -> Compiler - Linker

y en la opción Generate debugging information seleccionar Yes.



ahora debemos crear un breakpoint porque si hacemos el debug sin éste el programa se ejecutará de manera nomal, así que a manera de ejemplo creemos un breakpoint en el main, basta con hacer un click izquierdo sobre el número que indica nuestra línea de instrucción main, veremos que aparece un indicador tipo check, ahora estamos listos, podemos oprimir la tecla F5 para realizar el debug.

En la ventana inferior de Dev-C++ en la pestaña Debug,  tenemos varias opciones que pueden ayudarnos a realizar nuestra depuración.


miércoles, marzo 18, 2015

Simulación de Red Básica con Virtualización

Simulación de Red básica con Virtualización:

vamos a simular una LAN con VMware, dicha red tendrá dos segmentos de red con los parámetros mostrados en la imagen, para ello usaremos máquinas virtuales, PC1 será una virtualización de Debian y PC2 de Win XP, el router será configurado en una máquina virtual con Debian y a los que previamente se le asignan desde VMware dos Adpatadores de Red.

Para crear los adaptadores de red debe seleccionarse la máquina virtual (de aquí en adelante abreviaré máquina virtual como MV) que configuraremos como router y luego "Edit virtual machine setting


Cuando creemos los adpatadores de red debemos asegurarnos de seleccionar la opción "Bridge: connected directly to the physical network". ver Máquinas Virtuales: adaptadores de red.



Configurar Router Virtual

para configurar los interfaces de red para el router, encendemos la máquina virtual (que en este caso es un debian virtualizado) y ejecutamos los siguientes pasos:

$ sudo nano /etc/network/interfaces

definir interface eth0 y eth1 para lo que serán nuestras dos redes, ver imagen con detalles:


salir guardando cambios. Para que nuestra configuración funcione es decir, para obligar al equipo a trabajar como un router debemos seguir el siguiente paso:

$ sudo nano /etc/sysctl.conf

y descomentar la línea que contiene net.ipv4.ip_forward=1 (en la imagen se muestra ya descomentada). Salir guardandado los cambios

ahora reiniciamos el equipo: $ sudo init 6

Configurar Host:

este paso es muy sencillo, basta con instalar dos máquinas virtuales con los sistemas que deseemos, en este tutorial se montaron dos MV una con windows xp y otra con debian y seguir luego los siguientes pasos:


PC2 (debian):
iniciamos la MV debian y ejecutamos:

$ sudo nano /etc/network/interfaces

y configuramos los siguiente valores:

iface eth0 inet static
        address 192.168.2.12
        netmask 255.255.255.0
        gateway 192.168.2.10


noten que la dirección IP del host será 192.168.2.12 y la del gateway será la del interfaz de red del router (previamente configurado en la sección anterior) que se encuentra en el mismo segmento de red (red: 192.168.2.0), por lo tanto el gateway será: 192.168.2.10

para reiniciar:
$ sudo init 6

PC2 (windows xp):
iniciar la MV y configurar los datos de red en "network connections" tecla derecha del ratón sobre "Local area connection" y seleccionar "properties" y luego "Internet protocols TCP/IP" y luego botón "properties", en la ventana que se desplegará colocaremos los siguientes valores de red para que coinciden con nuestro diagrama de red a simular:

IP address: 200.1.1.5
Subnet mask: 255.255.255.0
Default gateway: 200.1.1.10

la dirección IP de PC1 será 200.1.1.5 y la del default gateway será la del interfaz de nuestro router que se encuentra en el mismo segmento de red por lo tanto deberá ser 200.1.1.10 (red: 200.1.1.0)



Pruebas de conexión:

para probar que los segmentos estén correctamente configurados y los host puedan comunicarse entre si, nos valemos del comando ping para realizar una prueba muy sencilla:

desde el PC1 ejecutar desde consola:

$ ping 200.1.1.5

y deberiamos tener como espuesta algo parecido a esto
PING 200.1.1.5 (200.1.1.5) 56(84) bytes of data.
64 bytes from 200.1.1.5: icmp_req=1 ttl=127 time=5.28 ms
64 bytes from 200.1.1.5: icmp_req=2 ttl=127 time=0.494 ms
64 bytes from 200.1.1.5: icmp_req=3 ttl=127 time=0.447 ms
64 bytes from 200.1.1.5: icmp_req=4 ttl=127 time=0.307 ms
64 bytes from 200.1.1.5: icmp_req=5 ttl=127 time=0.497 ms
64 bytes from 200.1.1.5: icmp_req=6 ttl=127 time=0.487 ms
64 bytes from 200.1.1.5: icmp_req=7 ttl=127 time=0.482 ms
64 bytes from 200.1.1.5: icmp_req=8 ttl=127 time=0.481 ms

luego desde PC2 ejecuta desde consola:

c:\> ping 192.168.2.12

y como respuesta tendrás algo parecido al mensaje anterior,

Con el comando ping enviamos paquetes de 64 bytes al host remoto y medimos el tiempo de respuesta , en caso de que el host no pueda ser localizado (unreachable) obtendremos un mensaje de error que nos indica que los segmentos de red nos están interconectados o que la dirección del host remoto que indicamos es errada.


Si todo sale bien es el momento de realizar pruebas, por ejemplo podemos capturar paquetes con wireshark, para eso bastará con instalar el software en alguna de las MV.

martes, marzo 10, 2015

Configurar Interfaces de Red en Debian

 
Las configuraciones de los interfaces de red se realizan en 
el archivo /etc/network/interfaces
 
Configurar DHCP:
auto eth0
allow-hotplug eth0
iface eth0 inet dhcp
 
Configurar dirección estática
allow-hotplug eth0
auto eth0
iface eth0 inet static
        address 192.0.2.7
        netmask 255.255.255.0
        gateway 192.0.2.254 
 
Levantar interfaz sin dirección:
   iface eth0 inet manual
      pre-up ifconfig $IFACE up
      post-down ifconfig $IFACE down
 
Configuración de cliente DNS:
estas configuraciones se aplican en /etc/dhcp/dhclient.conf
ejemplo: 
supersede domain-name-servers 12.34.56.78, 12.34.56.79;
 
 
Fuente:
https://wiki.debian.org/es/NetworkConfiguration#Configurar_la_interfaz_manualmente 

Máquinas Virtuales: Adaptadores de Red

Cuando trabajamos con virtualización, especialmente cuando deseamos utilizar máquinas virtuales para simular configuraciones de red, es importante conocer lo tipos de configuraciones con los que podemos contar.

Voy a enfocarme en el paquete de virtualización conocido como VMware que nos ofrece tres tipos de conexiones de red básicas que serán descritas a continuación (existe la opción de configuración de red personalizada que no será tratada en esta entrada):

Bridge network
esta opción configura tu maquina virtual como un entidad única y separada dentro de la red , por lo tanto será completamente independiente del host (anfitrión), es decir del equipo donde estamos corriendo la máquina virtual.

 Link to bridged_1.png

la red bridge es configurada automáticamente al seleccionar Use bridge networking en el wizard de  instalación de nuevas máquinas virtuales "New Virtual Machine Wizard" o si es seleccionada la opción Typical setup.

Como generalmente nuestro host estará en una red Ethernet, la configuración como bridge network es la opción más sencilla para darle acceso a la red a nuestra máquina virtual. La máquina virtual necesitará tener su identificación propia en la red (su propia dirección IP) que generalmente le será asignada por DHCP o también podríamos asignarsela de manera manual. La máquina virtual una vez configurada su IP, será un nodo más dentro de la red (como si fuera un nodo físico) que podrá contactar a otros nodos de la red y a su vez podrá ser contactada por el resto de los equipos.

Si elegimos esta configuración debemos asegurarnos que cada máquina virtual posea su propia dirección.

Network Address Translation
 con este tipo de configuración la máquina virtual compartirá la MAC y la dirección IP del host (equipo anfitrión). Ambas tendrán una única identificación de red que no será visible fuera de dicha red. La configuración NAT puede ser útil si solo se dispone de una única dirección IP o MAC. También podríamos tener diferentes máquinas virtuales compartiendo la misma IP del host pero manejando servicios diferentes, por ejemplo una para requerimientos HTTP y otra FTP.

Link to nat_1.png

Cuando se configura NAT, como ya se dijo la máquina virtual no tendrá su propia dirección para red externa, a cambio se establece una red privada sobre el computador host. La máquina virtual obtendrá la dirección IP que le asignará un VMware virtual DHCP server. Existe un módulo interno conocido como VMware NAT device que se encarga de parsar los datos entre una o varias máquinas virtuales y la red externa.

Con NAT la máquina virtual podrá utilizar protocolos TCP/IP estandard para conectarse a otras máquinas en red externa, por ejemplo podríamos navegar via WEB por HTTP y transferir archivos via FTP y realizar Telnet a otros computadores, sin embargo la configuración por defecto no permite que equipos externos puedan contactar con máquinas virtuales NAT, lo que podría tener como consecuencia que si una máquina virtual es establecida como servidor Web nunca podrá enviar páginas a equipos que se encuentren en la red externa.


Host-only network
esta opción configura la máquina virtual para que solo podamos tener acceso desde la red al host. Esta configuración provee una conexión de red entre la máquina virtual y el computador anfitrión usando un adpatador Ethernet vitual que es visible por el sistema operativo del anfitirión. Esta opción puede ser útil si queremos configurar una red virtual aislada.

Link to host-only_1.png

si usamos este tipo de configuración para el adaptador de red,  la máquina virtual y el anfitrión se conectarán por una red privada virtual y las direcciones de dicha red serán asignadas por un módulo conocido como VMware DHCP server.


Fuente:
https://www.vmware.com/support/ws5/doc/ws_net_basics.html

sábado, febrero 21, 2015

Warriors of the net (Guerreros de la red)

Excelente animación que muestra, de manera muy creativa y a un público no técnico, como funciona la Internet.

Particularmente me pareció genial la ejemplificación de como el firewall destino filtra los paquetes

Disfrútenlo.



lunes, febrero 16, 2015

Instalando NS3 en Debian

primero debemos instalar los prerequisitos para ns3:

  sudo apt-get install gcc g++ python
  sudo apt-get install gcc g++ python python-dev
  sudo apt-get install mercurial
  sudo apt-get install bzr
  sudo apt-get install gdb valgrind 
  sudo apt-get install gsl-bin libgsl0-dev libgsl0ldbl
  sudo apt-get install flex bison libfl-dev
  sudo apt-get install g++-3.4 gcc-3.4
  sudo apt-get install tcpdump
  sudo apt-get install sqlite sqlite3 libsqlite3-dev
  sudo apt-get install libxml2 libxml2-dev
  sudo apt-get install libgtk2.0-0 libgtk2.0-dev
  sudo apt-get install vtun lxc
  sudo apt-get install uncrustify
  sudo apt-get install doxygen graphviz imagemagick
  sudo apt-get install texlive texlive-extra-utils texlive-latex-extra
  sudo apt-get install python-sphinx dia 
  sudo apt-get install python-pygraphviz python-kiwi python-pygoocanvas libgoocanvas-dev
  sudo apt-get install libboost-signals-dev libboost-filesystem-dev
  sudo apt-get install openmpi-bin openmpi-common openmpi-doc libopenmpi-dev
  sudo apt-get install gcc-multilib

si queremos el soporte para bindings de python debemos instalar también los siguientes paquetes:

sudo apt-get install gccxml
sudo apt-get install pygccxml (para debian sería: python-pygccxml)


luego procedemos a descargar el ns3 e instalarlo:

1 $ cd
2 $ mkdir workspace
3 $ cd workspace
4 $ wget http://www.nsnam.org/release/ns-allinone-3.21.tar.bz2
5 $ sudo cp /home/user/Downloads/ns3-allinone-3.21 ~/workspace/
6 $ cd ~/workspace/
7 $ tar xjf ns-allinone-3.21.tar.bz2
8 $ cd ns-3.21
9 $ ./waf clean
10 $ ./waf configure --build-profile=debug --out=build/debug
11 $ ./waf configure --build-profile=optimized --out=build/optimized
12 $ ./waf configure --enable-examples --enable-tests
13 $ ./waf build

 
si todo va bien podemos correr el siguiente test para verificar que el programa se ha instalado:
 
$ ./test.py -c core
 
y tendríamos como respuesta algo como esto:

192 of 195 tests passed (192 passed, 3 skipped, 0 failed, 0 crashed, 0 valgrind errors)
ahora podemos correr nuestro primer código en ns3, el sempiterno "Hello World":
$ ./waf --run hello-simulator

-----
Enlace de referencia:
Installing NS3 with LENA (LTE Module Simulation) 
 

sábado, enero 03, 2015

SNMP para python

instalar la libreria pysnmp (libreria snmp para python)

$ pip install pysnmp

instalar un simulador snmp:

$ pip install snmpsim

colección de MIBs en forma de módulos PySNMP (útiles si se desea realizar una simulación basada en MIB):

 https://pypi.python.org/pypi/pysnmp-mibs/


Sitio de interes:
http://snmpsim.sourceforge.net/

el siguiente comando contendio en snmpsim crea archivos MIB con información aleatoria
mib2dev.py

miércoles, noviembre 05, 2014

Installing pip on linux mint

write on console:
$ sudo apt-get install python-pip
now you can install packages directly from the console, for example (installing the snmp lib for python):
$ sudo pip install pysnmp