Archive

You are currently browsing the archives for the Networking category.

Virtualización de Servidores con KVM en Debian Lenny

By Jose Antonio Cely Saidiza

 

La gran mayoría de servidores actuales, posee la potencia suficiente y cantidad de memoria, para poder virtualizar máquinas y en estas correr instancias de sistemas operativos. De esta manera podremos sacarle más provecho a nuestro hardware, y posiblemente reducir costos.

En mi caso de ejemplo, antes usaba 3 máquinas para mi trabajo de desarrollo de software, (1) Mi portátil, en el cual tengo todo lo de producción, el código final, las release oficiales. (2) El servidor de pruebas, (3) El servidor de integración. Pero eso, es historia pasada XD, ahora las dos últimas corren virtualizadas en el portátil (DELL inspiron, 2Gb RAM, Athlon 64 X2).

El siguiente articulo explicará como instalar, crear y configurar maquinas virtuales en un servidor Debian GNU/Linux, utilizando KVM. Estas maquinas virtuales se podrán usar y serán visibles como cualquier otro host de la red.
Para este tutorial necesitamos
1 – Servidor con el sistema Debian (Lenny) base instalado, no es necesario entorno gráfico
2 – Computador con cliente VNC (vncviewer, xtightvncviewer, etc), y cliente ssh.

POR QUE KVM

Las alternativas libres de alto rendimiento que tenemos son 3 (En mi opinión las más importantes):
1 – Virtual Box: Desarrollado por la empresa innotek GmbH, pero SUN Microsystems lo compro, y ahora Oracle compro a SUN… mmmm.. muchos intereses de por medio, no quiero correr riesgos, descarte su uso sin probarlo :D.

2 – XEN: Desarrollado por la Universidad de Cambridge. En este caso Citrix lo compro en el 2007. Citrix cerro el proyecto, tiene un producto gratuito, el XenServer Express Edition, aunque solo puede soportar cuatro máquinas virtuales.
Las versiones actuales se basan en el código ante de su cierre. XEN es el de más alto rendimiento (sin embargo KVM lo supera en varios aspectos).
En el caso de Debian requiere unas versiones empaquetadas especiales del Kernel:
Etch: xen-linux-system-2.6.18-6-xen-686 and xen-linux-system-2.6.18-6-xen-amd64.
Lenny: xen-linux-system-2.6.26-2-xen-686 and xen-linux-system-2.6.26-2-xen-amd64
Y esto fue lo que no me convenció, tener que usar un kernel especifico, en algunas pruebas, después de instalar el kernel el sistema no arranco! Se imaginan si hubiese sido en un servidor remoto!!!. Obviamente buscando en Internet encontré bastante documentación a los problemas que se me presentaban (que fueron bastantes), entonces eran muchos riesgos para una instalación remota, descarte su uso.

3 – KVM (Kernel virtual Machine): Desarrollado por la empresa Qumranet. KVM, como su nombre lo indica, hace parte del núcleo (desde la versión 2.6.20) y herramientas en el espacio de usuario. Por lo tanto no tengo que cambiar el Kernel en ejecución!. La única pega es que requiere un procesador x86 con soporte Virtualization Technology. Sin embargo la mayoría de los procesadores actuales lo soportan, sin embargo si tu procesador es anterior al 2008, lo más probables es que no funcione.
Se está trabajando para utilizar más características de la Virtualization Technology, por lo tanto el tema de rendimiento (que en mis pruebas es más que satisfactorio para usar en producción) mejorara constantemente.

INSTALACIÓN DE KVM Y CONFIGURACIÓN DE RED EN EL SERVIDOR

Asumimos que el servidor tiene el servicio ssh, y podemos acceder a él.
Desde el computador cliente accederemos al servidor para configurar todo lo que necesitamos, aunque esto se puede hacer desde el propio servidor, incluso con herramientas gráficas. Este tutorial esta previsto para el caso que solo tengamos acceso ssh al servidor, es un servidor decente, por ende, no tiene entorno gráfico XD.

Una vez el en servidor;
Detectamos si nuestro procesador soporta virtualización de Hardware

egrep '(vmx|svm)' --color=always /proc/cpuinfo

En mi caso, tengo un procesador AMD Athlon(tm) 64 X2 Dual-Core (se puede ver con cat /proc/cpuinfo), y la salida es la siguiente:

flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt rdtscp lm 3dnowext 3dnow rep_good pni cx16 lahf_lm cmp_legacy svm extapic cr8_legacy 3dnowprefetch

flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt rdtscp lm 3dnowext 3dnow rep_good pni cx16 lahf_lm cmp_legacy svm extapic cr8_legacy 3dnowprefetch

Lo cual significa que si soporta virtualización. Si al ejecutar el comando no produce ninguna salida, puede llorar, su hardware no soporta virtualización y NO HAY NADA QUE HACER!
, lo más probable es que estés trabajan en un procesador un poco viejo, por ejemplo el procesador de mi Desktop ( AMD Sempron) no lo soporta :'( …

Si tenemos suerte, continuamos
// Como buenos Debianitas, primero actualizamos lista de paquetes
apt-get update

// luego instalamos el módulo y utilidades de red
apt-get install kvm bridge-utils

Ahora tenemos que establecer un puente (bridgue) de red en nuestro servidor, para que nuestras máquinas virtuales se puede acceder desde otros hosts como si se trataran de sistemas físicos de red.
Para eso editamos el clásico archivo /etc/network/interfaces:
Por ejemplo, en mi caso esta asi
cat /etc/network/interfaces


# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet static
address 192.168.0.2
netmask 255.255.255.0
gateway 192.168.0.1

Lo editamos ( vi /etc/network/interfaces), modificando algunas lineas para que quede así:

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface

auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet manual

auto br0
iface br0 inet static
address 192.168.0.2
netmask 255.255.255.0
gateway 192.168.0.1
bridge_ports eth0
bridge_fd 9
bridge_hello 2
bridge_maxage 12
bridge_stp off

Obviamente, se debe acondicionar los archivos a su direccionamiento IP.
Después de editado, reiniciamos la red

/etc/init.d/networking restart

Y listo, si ejecutáramos el comando ifconfig, veríamos algo como esto (atención a la interfaz br0):

br0 Link encap:Ethernet HWaddr 00:1c:23:92:4e:d8
inet addr:192.168.0.2 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::21c:23ff:fe92:4ed8/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:18143 errors:0 dropped:0 overruns:0 frame:0
TX packets:27478 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1084126 (1.0 MiB) TX bytes:16915847 (16.1 MiB)

eth0 Link encap:Ethernet HWaddr 00:1c:23:92:4e:d8
inet6 addr: fe80::21c:23ff:fe92:4ed8/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:112400 errors:0 dropped:0 overruns:0 frame:0
TX packets:92086 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:144800236 (138.0 MiB) TX bytes:22306616 (21.2 MiB)
Interrupt:21

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:42 errors:0 dropped:0 overruns:0 frame:0
TX packets:42 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:2908 (2.8 KiB) TX bytes:2908 (2.8 KiB)

TRABAJANDO CON MAQUINAS VIRTUALES

Antes que nada necesitamos una partición, o un archivo para que sea usado por la máquina virtual como disco duro, en el caso de usar un archivo, ejecutamos:

qemu-img create disk.deb 4G

El anterior comando crea un archivo, que la maquina virtual interpretara como un disco de 4Gb. Por cada máquina que virtualicemos, obiamente debemos crear su archivo
En nuestro ejemplo, instalaremos un sistema Debian en nuestra maquina virtual (Debian virtualizando Debian, que bonito :P ). Para eso necesitamos descargar una imagen ISO del instalador, en mi caso descargue la ISO del netinstall en la carpeta /home
El comando kvm, trae infinidad de opciones interesantes ( man kvm-qemu ).

Para virtualizar una máquina con 256Mb de Ram, con un adaptador de red Realtek compatible, que arranque desde CDROM, y que el CDROM sea nuestra imagen ISO, ejecutamos:

kvm -hda disk.deb -cdrom /home/debian-501-i386-netinst.iso -boot d -m 256 -net nic,vlan=0,model=rtl8139 -net tap,vlan=0 -vnc :0

Como podemos ver, el final agregamos –vnc :0, lo cual significa que podremos desde ya conectarnos vía VNC al servidor como nuestro cliente de preferencia, desde aca podremos seguir la instalación de Debian sin ninguna novedad! En hora buena.

Instalando Debian por VNC

Después de haber instalado el sistema base, ya no es necesario arrancar desde el CDROM, por lo tanto, siempre que se quiera arrancar esta máquina y acceder desde VNC, ejecutamos:

kvm -hda disk.deb -boot c -m 256 -net nic,vlan=0,model=rtl8139 -net tap,vlan=0 -vnc :0

Nótese que al parametro -boot, se cambio por “c “,. Boot permite los siguiente parametros:
Boot on floppy (a), hard disk (c), CD-ROM (d), or Etherboot (n).

Muy seguramente después de configurada nuestra máquina, algunas veces necesitamos iniciarla sin sesión VNC, o por cuestiones de seguridad. Además también podremos necesitar que corra en modo daemon, entonces ejecutamos:

kvm -hda disk.deb -boot c -m 256 -net nic,vlan=0,model=rtl8139 -net tap,vlan=0 -vnc none -daemonize

Este comando lo podríamos poner (tantas veces como sea necesario por cada maquina) en los scripts de arranque del sistema para que inicien siempre junto con el servidor.

NOTA FINAL

Vimos el funcionamiento básico de virtualización con KVM, para casos de manejar muchas maquinas virtuales, existen front-ends que facilitan mucho el trabajo (virt-install, virt-manager, etc). Tambien se pueden setear inumerables parametros en las maquinas a virtualizar, como en numero de cores del procesador, parametros avanzados de red, más seguridad a VNC, etc.

Dudas, comentarios, sugerencias?

http://www.linux-kvm.org
http://blog.bodhizazen.net/linux/how-to-run-kvm-without-x/
http://www.phoronix.com/scan.php?page=article&item=623&num=4

Feb

25

INSTALACIÓN DE NAGIOS 2.7 EN DEBIAN ETCH, PARTE 1

By Jose Antonio Cely Saidiza

Este tutorial esta basado en la documentación oficial de nagios, y algunas tutoriales en español que hay en Internet, escribo este post, por que queria comentar mi experiencia con este espectacular programa que lo recomiendo un montón!
Nagios® es un software de monitorización de redes y sistemas, con licencia GPL. Nagios observa servidores y servicios de red específicos, alertándote cuando las cosas van mal y cuando están bien.
Para correr Nagios junto con sus plugins, solo es necesario tener un sistema operativo (de preferencia Linux :D ) con un servidor web, un compilador de C y la librería gd versión 1.6.3 o superior.

INSTALANDO NAGIOS

Este tutorial esta basado en debian etch que a la fecha es testing, intente instalarlo con apt-get install … pero la configuración por defecto no me funciono, tal vez por que el etch aun esta en testing, además me obligaba a usar el paquete exim4, y en el servidor de pruebas tengo qmail y esto me ocasionaría un conflicto. Entonces explicaré como instalar desde los fuentes.

De la página oficial de nagios:

http://www.nagios.org/download/

Descargamos la ultima versión ( a la fecha 2.7 ), en este caso nagios-2.7.tar.gz , y el paquete de plugins, en este caso la versión nagios-plugins-1.4.5.tar.gz (ya esta disponible la versión de plugins 1.4.6, pero me dio un error de compilación, entonces no la use)

Primero creamos los usuarios y grupos necesarios (www-data es el usuario en que corre apache en debian, en otras distribuciones puede variar)

adduser nagios
groupadd nagcmd
/usr/sbin/usermod -G nagcmd nagios
/usr/sbin/usermod -G nagcmd www-data

Creamos el directorio donde instalaremos nagios

mkdir /usr/local/nagios

Cambiamos de usuario y grupo el directorio recién creado

chown nagios:nagios -R /usr/local/nagios/

En el directorio donde este descargado nagios, lo descomprimimos

tar zxvf nagios-2.7.tar.gz

Luego ingresamos al directorio

cd nagios-2.7

Una vez en el directorio, ejecutamos

./configure – -prefix=/usr/local/nagios – -with-cgiurl=/nagios/cgi-bin – -with-htmurl=/nagios/ – -with-nagios-user=nagios – -with-nagios-group=nagios – -with-command-group=nagcmd

Si el configure no nos informa ningún error compilamos

make all

Instalamos…

make install

Creamos un script de inicialización en /etc/init.d/

make install-init

Ahora configuración del script creado para que se ejecute siempre al arranque (update-rc.d es el comando en debian para configurar servicios al arranque, en otras distribuciones puede variar)

update-rc.d nagios defaults

Configuramos permisos de algunos directorios

make install-commandmode

Instalamos algunas configuraciones de ejemplo, atención a este paso, por que nos basaremos en estos archivos para crear los nuestros

make install-config

Creamos enlaces simbólicos de binarios para nuestro sistema

ln -s /usr/local/nagios/bin/nagios /usr/sbin/nagios
ln -s /usr/local/nagios/bin/nagiostats /usr/sbin/nagiostats

Ahora instalaremos los plugins

Descomprimimos el paquete

tar zxvf nagios-plugins-1.4.5.tar.gz
cd nagios-plugins-1.4.5

Ejecutamos el script de configuración

./configure – -prefix=/usr/local/nagios – -with-cgiurl=/nagios/cgi-bin

Si el configure no nos informa ningún error compilamos

make

Instalamos…

make install
make install-root

Si hemos llegado a este punto sin problemas, crearemos la interfaz web de nagios

En el caso de ejemplo (debian etch) editaremos el archivo de configuración por default de apache2

/etc/apache2/sites-available/default

Al final agregamos

ScriptAlias /nagios/cgi-bin «/usr/local/nagios/sbin»


# SSLRequireSSL
Options ExecCGI
AllowOverride None
Order allow,deny
Allow from all
# Order deny,allow
# Deny from all
# Allow from 127.0.0.1
AuthName «Nagios Access»
AuthType Basic
AuthUserFile /usr/local/nagios/etc/htpasswd.users
Require valid-user

Alias /nagios «/usr/local/nagios/share»


# SSLRequireSSL
Options None
AllowOverride None
Order allow,deny
Allow from all
# Order deny,allow
# Deny from all
# Allow from 127.0.0.1
AuthName «Nagios Access»
AuthType Basic
AuthUserFile /usr/local/nagios/etc/htpasswd.users
Require valid-user

Ahora creamos el archivo con el password para el usuario

htpasswd -c /usr/local/nagios/etc/htpasswd.users nagiosadmin

Reiniciamos apache

/etc/init.d/apache2 restart

Ahora podremos comprobar si funciona apuntando con un navegador a nuestro servidor. Ejemplo

http://192.168.0.66/nagios

Debe aparecer en pantalla la típica ventana de autenticación de apache. Nos autenticamos y debemos ingresar a un panel de administración web, en hora buena!

CONFIGURANDO NAGIOS

Empieza lo interesante, vamos a configurar nagios!!!
En este caso crearé un entorno para mi empresa y algunos clientes como ejercicio. Monte el servidor nagios en un portátil abandonado, un PIII, con 128Mb de RAM, en el que ya tenia instalado apache2 con Debian etch, el portátil se conecta a Internet con el ADSL de mi apartamento, desde acá supervisaré los servidores de Tecsua los cuales son un firewall y dos servidores web y de correo. También supervisaré dos clientes específicos, uno consta de un router y un firewall, y el segundo cliente nada más supervisaremos un servidor de aplicaciones que solo esta encendido en horarios de oficina. Figura 1
Espero os sirva de base para sus configuraciones especificas.


Figura 1

Pero antes de eso veamos como se «ordena» esto en el sistema Nagios.
Deben crearse los «contactos», que son las personas a las que se les debe notificar cualquier cosa que este configurada en nagios. Estos contactos deben clasificarse en «grupos», que como su nombre lo indica, establece características en común para esos «contactos».

En mi ejemplo, tenemos tres contactos, los clasificados en dos grupos llamados admin y tehcnical, Figura 2
1 – nagiosadmin, es el administrador general, hace parte del grupo «admin»
2 – supervisor, un supuesto supervisor general, hace parte del grupo «admin»
3 – technical_1, un supuesto técnico de soporte, hace parte del grupo «technical»


Figura 2

Ahora debemos crear «hosts» (entiéndase por host a un servidor, un router, etc), y estos hosts también deben clasificarse en grupos con características en común

En mi ejemplo, tenemos 7 hosts clasificados en dos grupos llamados tecsuaservers y tecsuaclients, Figura 3
1 – tecsua_router, router de acceso a internet de las oficinas de tecsua, obviamente hace parte del grupo tecsuaservers
2 – firewall_tecsua, firewall general en las oficinas de tecsua, grupo tecsuaservers
3 – tecsua_server_1, servidor web y de en las correo oficinas de tecsua, grupo tecsuaservers
4 – tecsua_server_2, servidor web y de correo de un cliente en las oficinas de tecsua, grupo tecsuaservers
5 – c1_router, router de acceso a internet de un cliente especifico c1, grupo tecsuaclients
6 – firewall_c1, es el firewall general de el cliente especifico c1, grupo tecsuaclients
7 – appserver_c2, es el servidor de aplicaciones de un cliente especifico c2, el cual solo esta encendido en horarios de oficina, grupo tecsuaclients


Figura 3

Y por ultimo, debemos crear «servicios», que pueden ser de cualquier tipo (ping, smtp, http, etc), y estos servicios deben estar asociados a un host.
En mi ejemplo son 12 servicios,

    host & services

  • appserver_c2 HTTP, PING
  • c1_router PING
  • firewall_c1 PING
  • firewall_tecsua PING
  • tecsua_router PING
  • tecsua_server_1 HTTP, PING, SMTP
  • tecsua_server_2 HTTP, PING, SMTP

Una vez tenemos claro el escenario, (para esto recomiendo hacer un mapa como los anteriores) solo es codificar esto en los archivos de configuración.
Cuando ejecutamos en la instalación el comando make install-config, este nos creo unos archivos base en /usr/local/nagios/etc. El archivo de configuración principal es:
nagios.cfg, el cual trae toda una serie de configuraciones por defecto que aplican bien para la mayoría de los casos.
También nos creo el archivo localhost.cfg, el cual viene preconfigurado para supervisar el sistema local, es muy útil estudiar este archivo, trae ejemplos muy explicativos, pero en mi caso y como generalmente se hace, fraccioné este archivo el varios archivos sueltos, para que sea mas cómodo configurar las cosas. A continuación explico las pequeñas modificaciones a algunos archivos y muestro en pantalla los archivos creados sueltos, los cuales pueden crear con su editor favorito dentro de carpeta de configuración de nagios.

1 – En el archivo nagios.cfg

a – Buscar la linea que apunta al archivo de ejemplo localhost.cfg y comentarla para que no use ese archivo

# Host and service definitions for monitoring this machine
# cfg_file=/usr/local/nagios/etc/localhost.cfg

b – Descomentar las lineas que apuntan a varios archivos de configuración, estos son los que vamos a crear si no existen

cfg_file=/usr/local/nagios/etc/contactgroups.cfg
cfg_file=/usr/local/nagios/etc/contacts.cfg
#cfg_file=/usr/local/nagios/etc/dependencies.cfg
#cfg_file=/usr/local/nagios/etc/escalations.cfg
cfg_file=/usr/local/nagios/etc/hostgroups.cfg
cfg_file=/usr/local/nagios/etc/hosts.cfg
cfg_file=/usr/local/nagios/etc/services.cfg
cfg_file=/usr/local/nagios/etc/timeperiods.cfg

2 – En el archivo cgi.cfg

a – Buscar la linea use_authentication que esta establecida por defecto a 1, y configurarla a 0, sin autenticación, esto es NO recomendado, pero por ser la parte 1 del manual no nos complicaremos tanto, en la parte 2 hablaremos al detalle de la autenticación.

use_authentication=0

b – Al final del archivo des comentar las alarmas sonoras si las queremos usar, estar se ejecutarán en el cliente.

host_unreachable_sound=hostdown.wav
host_down_sound=hostdown.wav
service_critical_sound=critical.wav
service_warning_sound=warning.wav
service_unknown_sound=warning.wav
normal_sound=noproblem.wav

3 – Ahora creamos los archivos de configuración, aclaro nuevamente que este es para mi ejemplo, podéis ajustar estos archivos a tus necesidades. (cambiar xxx.xxx.xxx.xxx por sus direcciones IP)

A – contactgroups.cfg

define contactgroup{
contactgroup_name admin
alias Nagios Administrators
members nagiosadmin,supervisor
}

define contactgroup{
contactgroup_name technical
alias Network Technicals
members technical_1
}

B – contacts.cfg

define contact{
contact_name nagiosadmin
alias Nagios Administrator
service_notification_period 24×7
host_notification_period 24×7
service_notification_options w,u,c,r
host_notification_options d,r
service_notification_commands notify-by-email
host_notification_commands host-notify-by-email
email jose.cely@xxxxx.xxx
}

define contact{
contact_name supervisor
alias Network Supervisor
service_notification_period 24×7
host_notification_period 24×7
service_notification_options u,c,r
host_notification_options d,r
service_notification_commands notify-by-email
host_notification_commands host-notify-by-email
email linus@xxxxx.xxx
}

define contact{
contact_name technical_1
alias Techical One
service_notification_period 24×7
host_notification_period 24×7
service_notification_options w,u,c,r
host_notification_options d,r
service_notification_commands notify-by-email
host_notification_commands host-notify-by-email
email alam.brito@xxxxx.xxx
}

C – hosts.cfg


# Generic host definition template – This is NOT a real host, just a template!

define host{
name generic-host ; The name of this host template
notifications_enabled 1 ; Host notifications are enabled
event_handler_enabled 1 ; Host event handler is enabled
flap_detection_enabled 1 ; Flap detection is enabled
failure_prediction_enabled 1 ; Failure prediction is enabled
process_perf_data 1 ; Process performance data
retain_status_information 1 ; Retain status information across program restarts
retain_nonstatus_information 1 ; Retain non-status information across program restarts
notification_period 24×7 ; Send host notifications at any time
register 0 ; DONT REGISTER THIS DEFINITION – ITS NOT A REAL HOST, JUST A TEMPLATE!
}

define host{
use generic-host ; Name of host template to use
host_name tecsua_router
alias Router SAGEM ADSL
address xxx.xxx.xxx.xxx
check_command check-host-alive
max_check_attempts 20
contact_groups admin
notification_interval 60
notification_period 24×7
notification_options d,u,r
}

define host{
use generic-host ; Name of host template to use
host_name firewall_tecsua
alias Firewall Tecsua
address xxx.xxx.xxx.xxx
parents tecsua_router
check_command check-host-alive
max_check_attempts 10
contact_groups admin
notification_interval 120
notification_period 24×7
notification_options d,u,r
}

define host{
use generic-host ; Name of host template to use
host_name tecsua_server_1
alias www.tecsua.com
address xxx.xxx.xxx.xxx
parents firewall_tecsua
check_command check-host-alive
max_check_attempts 10
contact_groups admin
notification_interval 120
notification_period 24×7
notification_options d,u,r
}

define host{
use generic-host ; Name of host template to use
host_name tecsua_server_2
alias www.xxxxxx.com.co
address xxx.xxx.xxx.xxx
parents firewall_tecsua
check_command check-host-alive
max_check_attempts 10
contact_groups admin
notification_interval 120
notification_period 24×7
notification_options d,u,r
}

define host{
use generic-host ; Name of host template to use
host_name c1_router
alias Router Coquito ADSL
address xxx.xxx.xxx.xxx
check_command check-host-alive
max_check_attempts 20
contact_groups admin
notification_interval 60
notification_period 24×7
notification_options d,u,r
}

define host{
use generic-host ; Name of host template to use
host_name firewall_c1
alias Firewall xxxxxxxxx
address xxx.xxx.xxx.xxx
parents c1_router
check_command check-host-alive
max_check_attempts 10
contact_groups admin
notification_interval 120
notification_period 24×7
notification_options d,u,r
}

define host{
use generic-host ; Name of host template to use
host_name appserver_c2
alias Aplication Server xxxxx
address xxx.xxx.xxx.xxx
check_command check-host-alive
max_check_attempts 10
contact_groups admin
notification_interval 120
notification_period workhours
notification_options d,u,r
}

D – hostgroups.cfg

define hostgroup{
hostgroup_name tecsuaservers
alias Tecsua Servers
members firewall_tecsua, tecsua_router, tecsua_server_1, tecsua_server_2
}

define hostgroup{
hostgroup_name tecsuaclients
alias Tecsua Clients
members c1_router, firewall_c1, appserver_c2
}

E – services.cfg


# Generic service definition template – This is NOT a real service, just a template!

define service{
name generic-service ; The ‘name’ of this service template
active_checks_enabled 1 ; Active service checks are enabled
passive_checks_enabled 1 ; Passive service checks are enabled/accepted
parallelize_check 1 ; Active service checks should be parallelized (disabling this can lead to major performance problems)
obsess_over_service 1 ; We should obsess over this service (if necessary)
check_freshness 0 ; Default is to NOT check service ‘freshness’
notifications_enabled 1 ; Service notifications are enabled
event_handler_enabled 1 ; Service event handler is enabled
flap_detection_enabled 1 ; Flap detection is enabled
failure_prediction_enabled 1 ; Failure prediction is enabled
process_perf_data 1 ; Process performance data
retain_status_information 1 ; Retain status information across program restarts
retain_nonstatus_information 1 ; Retain non-status information across program restarts
is_volatile 0 ; The service is not volatile
register 0 ; DONT REGISTER THIS DEFINITION – ITS NOT A REAL SERVICE, JUST A TEMPLATE!
}

define service{
# use generic-service ; Name of service template to use
host_name tecsua_router
service_description PING
is_volatile 0
check_period 24×7
max_check_attempts 3
normal_check_interval 5
retry_check_interval 1
contact_groups technical,admin
notification_interval 240
notification_period 24×7
notification_options c,r
check_command check_ping!100.0,20%!500.0,60%
}

define service{
# use generic-service ; Name of service template to use
host_name c1_router
service_description PING
is_volatile 0
check_period 24×7
max_check_attempts 3
normal_check_interval 5
retry_check_interval 1
contact_groups technical
notification_interval 240
notification_period 24×7
notification_options c,r
check_command check_ping!100.0,20%!500.0,60%
}

define service{
# use generic-service ; Name of service template to us
host_name tecsua_server_1
service_description HTTP
is_volatile 0
check_period 24×7
max_check_attempts 3
normal_check_interval 5
retry_check_interval 1
contact_groups technical,admin
notification_interval 120
notification_period 24×7
notification_options w,u,c,r
check_command check_http
}

define service{
# use generic-service ; Name of service template to us
host_name tecsua_server_2
service_description HTTP
is_volatile 0
check_period 24×7
max_check_attempts 3
normal_check_interval 5
retry_check_interval 1
contact_groups technical,admin
notification_interval 120
notification_period 24×7
notification_options w,u,c,r
check_command check_http
}

define service{
# use generic-service ; Name of service template to us
host_name appserver_c2
service_description HTTP
is_volatile 0
check_period workhours
max_check_attempts 3
normal_check_interval 5
retry_check_interval 1
contact_groups technical
notification_interval 120
notification_period workhours
notification_options w,u,c,r
check_command check_http
}

define service{
# use generic-service ; Name of service template to us
host_name tecsua_server_1
service_description SMTP
is_volatile 0
check_period 24×7
max_check_attempts 3
normal_check_interval 5
retry_check_interval 1
contact_groups technical,admin
notification_interval 120
notification_period 24×7
notification_options w,u,c,r
check_command check_smtp
}

define service{
# use generic-service ; Name of service template to us
host_name tecsua_server_2
service_description SMTP
is_volatile 0
check_period 24×7
max_check_attempts 3
normal_check_interval 5
retry_check_interval 1
contact_groups technical,admin
notification_interval 120
notification_period 24×7
notification_options w,u,c,r
check_command check_smtp
}

define service{ # use generic-service ; Name of service template to us
host_name firewall_tecsua
service_description PING
is_volatile 0
check_period 24×7
max_check_attempts 3
normal_check_interval 5
retry_check_interval 1
contact_groups technical,admin
notification_interval 120
notification_period 24×7
notification_options w,u,c,r
check_command check_ping!100.0,20%!500.0,60%
}

define service{ # use generic-service ; Name of service template to us
host_name firewall_c1
service_description PING
is_volatile 0
check_period 24×7
max_check_attempts 3
normal_check_interval 5
retry_check_interval 1
contact_groups technical
notification_interval 120
notification_period 24×7
notification_options w,u,c,r
check_command check_ping!100.0,20%!500.0,60%
}

define service{ # use generic-service ; Name of service template to us
host_name appserver_c2
service_description PING
is_volatile 0
check_period workhours
max_check_attempts 3
normal_check_interval 5
retry_check_interval 1
contact_groups technical
notification_interval 120
notification_period workhours
notification_options w,u,c,r
check_command check_ping!100.0,20%!500.0,60%
}

define service{ # use generic-service ; Name of service template to us
host_name tecsua_server_1
service_description PING
is_volatile 0
check_period 24×7
max_check_attempts 3
normal_check_interval 5
retry_check_interval 1
contact_groups technical,admin
notification_interval 120
notification_period workhours
notification_options w,u,c,r
check_command check_ping!100.0,20%!500.0,60%
}

define service{ # use generic-service ; Name of service template to us
host_name tecsua_server_2
service_description PING
is_volatile 0
check_period 24×7
max_check_attempts 3
normal_check_interval 5
retry_check_interval 1
contact_groups technical,admin
notification_interval 120
notification_period workhours
notification_options w,u,c,r
check_command check_ping!100.0,20%!500.0,60%
}

F – timeperiods.cfg


# This defines a timeperiod where all times are valid for checks,
# notifications, etc. The classic «24×7» support nightmare. : – )

define timeperiod{
timeperiod_name 24×7
alias 24 Hours A Day, 7 Days A Week
sunday 00:00-24:00
monday 00:00-24:00
tuesday 00:00-24:00
wednesday 00:00-24:00
thursday 00:00-24:00
friday 00:00-24:00
saturday 00:00-24:00
}

# ‘workhours’ timeperiod definition
define timeperiod{
timeperiod_name workhours
alias «Normal» Working Hours
monday 09:00-18:00
tuesday 09:00-18:00
wednesday 09:00-18:00
thursday 09:00-18:00
friday 09:00-18:00
saturday 10:00-13:00
}

# ‘nonworkhours’ timeperiod definition
define timeperiod{
timeperiod_name nonworkhours
alias Non-Work Hours
sunday 00:00-24:00
monday 00:00-09:00,18:00-24:00
tuesday 00:00-09:00,18:00-24:00
wednesday 00:00-09:00,18:00-24:00
thursday 00:00-09:00,18:00-24:00
friday 00:00-09:00,18:00-24:00
saturday 00:00-10:00,13:00-24:00
}

# ‘none’ timeperiod definition
define timeperiod{
timeperiod_name none
alias No Time Is A Good Time
}

Con estos archivos base podremos inicializar nagios por primera vez, pero siempre después de cualquier configuración podemos correr una verificación de los archivos de configuración, antes de iniciar, para eso esta la bandera -v en el comando nagios, la cual verifica la sintaxis y correctas relaciones/asignaciones.

Corremos la verificación

nagios -v /usr/local/nagios/etc/nagios.cfg

Que en mi ejemplo al final me de dio esta salida:

Total Warnings: 0
Total Errors: 0

Things look okay – No serious problems were detected during the pre-flight check

Todo figura OK, en algunas configuraciones puede que nos muestre algún warning, pero estos no son tan trascendentales.
Ahora iniciaremos nagios por primera vez!.

/etc/init.d/nagios start

Podemos comprobar que el procesa esta en ejecución con

ps -A|grep nagios

Que en mi caso me muestra esta salida

4883 ? 00:00:00 nagios

En hora buena, ahora podemos acceder vía web a nagios, si la configuración de apache fue correcta deberíamos poder acceder vía web, en mi caso abro un navegador y apunto a mi servidor

http://192.168.0.66/nagios

Nos pedirá nombre de usuario y contraseña (los anteriormente creados), una vez logeados, podremos ver nuestros servidores y servicios, si es le primera vez que inicia nagios, debemos esperar unos minutos para que nagios ejecute sus comandos de supervisión configurados y de esta forma poder empezar a ver resultados en pantalla, Nagios tiene una interfaz web muy intuitiva que no explicaré en este articulo, ya es cuestión de vosotros profundizar. A continuación algunas capturas de pantalla:

Esto es todo por esta primera parte, si este tutorial tiene buena acogida escribiré la parte 2, explicando los mapas 2D y 3D, alarmas sonoras, integración con RRDTools, etc!

Links:

Nagios
http://nagios.org

How to no oficial en Español
http://nagios.linuxbaja.org

Nov

7

Como ponchar un cable ethernet

By Jose Antonio Cely Saidiza


Con todo y wireless, wimax, etc. el cableado estructurado seguirá siendo infalible…
Vía www.viewdo.com encontré este practico video que muestran como hacer correctamente un cable ethernet, muy interesante, en especial para algunos conocidos ( me reservo el nombre :P ) que se la pasan preguntándome como ponchar correctamente en cable ethernet y parece que nunca me he echo explicar bien, o no me han entendido, entonces, ahí tienen el video…


Comentarios?

Oct

26

MONTANDO UN GATEWAY GNU/LINUX CON TODO Y FIREWALL

By Jose Antonio Cely Saidiza

Se denomina Gateway al servidor que permite a las computadoras que se encuentran dentro de una determinada red conectarse a otras computadoras que se encuentran en otra red, la otra red es generalmente Internet.
Entonces la idea es montarnos un server que nos comparta una conexión dedicada a Internet. Para esto podemos usar cualquier CPU obsoleta que tengamos por ahí descuidada. Cualquier Pentium, o Pentium 2 nos puede servir. Asumimos que tenemos un Debian instalado, aunque esto funciona con cualquier distro.
Para compartir la conexión a Internet necesitamos hacer NAT  (Network Address Translation, en español Traducción de la dirección de red), dicho de una forma casta, es el proceso que hace algún dispositivo de hardware como un router o un servidor, el cual maneja dos redes, una interna (LAN) y una externa (Internet), comparte su conexión a Internet cambiando las IP de origen de las peticiones que vienen de la LAN por su propia IP enviándolas a Internet, cuando recibe la respuesta de Internet identifica el paquete y lo redirecciona dentro de la LAN a el equipo que hizo la solicitud. Este proceso es transparante tanto para el equipo dentro de la LAN como para el servidor que responde desde Internet
Tal vez esta animación que realicé para una capacitación aclare este concepto.

firewallejemplo.gifClick en la imagen para ver

 

QUE ES IPTABLES?

Para crear un firewall necesitamos ejecutar comandos de IPTABLES, que es la aplicación firewall para el Kernel Linux en las series del núcleo 2.4 y posteriores, reemplaza a ipchains de las series 2.2 e ipfwadm de las series 2.0. En la mayoría de los manuales que he visto de Iptables, explican como compilar el Kernel para activar Iptables, pero NUNCA lo he tenido que hacer, en las distribuciones que he probado (que son bastantes) siempre esta Iptables funcionando, no hay necesidad de recompilar el Kernel, eso lo que hace es confundir a usuarios noveles como me paso a mi hace unos años :(.
Volviendo al tema, un comando de iptables modifica el comportamiento del Kernel con respecto a la administración de los paquetes de red, es decir que le podemos decir al kernel que haga y que no haga con los paquetes, no les parece fantástico ? … Generalmente tenemos que digitar mas de un comando de Iptables para crear un firewall, es por eso que tenemos que hacer un script con los comandos para no estar digitando cada que iniciamos la maquina los comandos, pero nótese que el firewall NO ES EL SCRIPT!, en el script guardamos son los comandos de Iptables, el firewall es el mismisimo Kernel en persona, no es una aplicación por ahí volando.

EL FIREWALL CON IPTABLES

Aca pueden bajar el script que a continuación trato de explicar

#!/bin/bash
# firewall de ejercicio, con NAT, y bloqueo de puertos

Los caracteres #! indican que el shell /bin/sh es el programa a para ejecutar este script.

IPTABLES="/sbin/iptables"         # ubicacion de iptables
INTERNET="eth0"             # tarjeta de red que se conecta a Internet
LAN="eth1"                 # tarjeta de red que se conecta a la red local
IP_INTERNET="192.168.1.3"          # dirección IP de la tarjeta de red que se conecta Internet

Aca configuro variables en shell para el firewall, esto se hace para que sea mas practico hacer cambios al script. Adaptadlo a tus necesidades.

$IPTABLES -F
$IPTABLES -t nat -F


Borro reglas anteriores, esto es en caso que se haya ejecutado alguna otra sentencia de iptables, por ejemplo algún script de arranque en la distribución que usen o pruebas anteriores de nosotros mismos

echo 1 > /proc/sys/net/ipv4/ip_forward

Activamos el reenvío de paquetes en el Kernel poniendo un ‘1’ en el archivo /proc/sys/net/ipv4/ip_forward , si no se hace, el kernel sencillamente ignoraría los paquetes, por que no son suyos.

$IPTABLES -t nat -A POSTROUTING -o $INTERNET -j SNAT –to $IP_INTERNET

Masquerading es un caso especial de SNAT (source NAT) donde se cambia la dirección IP de origen por la de la interfaz por la cual sale el paquete.

# Dejo pasar los paquetes ICMP
$IPTABLES -A INPUT -i $INTERNET -p ICMP -j ACCEPT

Dejo pasar paquetes ICMP, esto es para que el firewall responda pings, nada mas, algunos dirán que es algo inseguro, pero anda tíos que este es un tutorial básico y para el troubleshoting es mejor habilitar pings.

$IPTABLES -A INPUT -i $INTERNET -p TCP –dport 80 -m state –state NEW -j ACCEPT
$IPTABLES -A INPUT -i $INTERNET -p TCP –dport 22 -m state –state NEW -j ACCEPT

Permito conexiones al puerto 80 (Web) y al puerto 22 (ssh), para poder acceder a estos servicios desde Internet

$IPTABLES -A INPUT -p TCP -m state –state RELATED -j ACCEPT

Acepto paquetes de conexiones ya establecidas

$IPTABLES -A INPUT -i $INTERNET -m state –state NEW,INVALID -j DROP
$IPTABLES -A FORWARD -i $INTERNET -m state –state NEW,INVALID -j DROP


Rechazamos paquetes de conexiones nuevas y rechazamos paquetes de forwarding de conexiones no establecidas. En palabras castas diría que bloqueo todo lo que venga de Internet y no coincida con las reglas anteriores, este es un firewall cuya política por defecto es bloquear todo.

Cuando llega un paquete al firewall, este es analizado por el kernel siguiendo el ORDEN DE LAS REGLAS, es por eso que primero aceptamos las conexión al servidor web y ssh, si un paquete es para alguno de estos servicios entonces el Kernel acepta el paquete y no continua con las demás reglas, pero si el paquete no coincide con las reglas del servidor web y ssh entonces continuara analizándolo con alguna de las ultimas reglas que sencillamente dicen que destruya el paquete.

AÑADIMOS NUESTRO FIREWALL AL ARRANQUE

Guardamos nuestro script en alguna parte de nuestro sistema de archivos, por ejemplo creamos una carpeta en /etc llamada firewall y ahí guardamos nuestros firewalls, por ejemplo nos quedaría así:

/etc/firewall/firewall.sh

Ahora nos aseguramos que nuestro script tenga permisos de ejecución con el comando

chmod +x /etc/firewall/firewall.sh

Ahora debemos añadir nuestro script al arranque, en el caso de Debian Sarge, lo podemos insertar en los archivos de configuración de los adaptadores de red, para que el script se ejecute siempre que se inicien los adaptadores de red. El archivo generalmente es  /etc/network/interfaces
Al archivo le añadimos la siguiente linea:

pre-up /etc/firewall/firewall.sh Esta linea le indica que ejecute el script antes de arrancar el dispositivo de red. El siguiente es un ejemplo de como quedaría el archivo.

labs:/etc/firewall# cat /etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
#
        pre-up /etc/firewall/firewall.sh
        address 192.168.1.3
        netmask 255.255.255.0
        gateway 192.168.1.1

auto eth1
iface eth1 inet static
        address 192.168.0.1
        netmask 255.255.255.0

Para usuarios de otras distribuciones como Fedora pueden sencillamente pegar el path completo al firewall en el final del archivo /etc/rc.local, y se ejecutará siempre al arranque después de que todos los servicios inicien.

DNS CACHE

Ahora necesitamos montar un DNS cache, es decir un servidor de solo cache, que almacene las peticiones DNS que le han hecho, para que cuando otro cliente vuelva a realizar la misma petición, el servidor la entrega directamente sin necesidad de buscarla directamente de Internet, esto suena simple, vale… es simple, pero nos puede ahorrar ancho de banda y optimizar nuestra red cuando se trata con bastantes equipos.
Para esto en Debian Sarge sencillamente ejecutamos

apt-get install bind9

y listo… nos aseguramos que se este ejecutando servidor al arranque y con la configuración que trae por defecto nos sirve de DNS cache. Para usuarios de otras distribuciones (joder tíos, ya es hora para que se pasen a Debian ) creo que también funciona con la configuración por defecto, por ejemplo probé con Fedora Core 3 y me funciono, pero con la versión 2 toca hacer algunos ajustes al archivo /etc/named.conf .

CONFIGURACIÓN DE LOS CLIENTES

A los clientes les configuramos como Gateway y servidor DNS la dirección IP de nuestro servidor y vola!, funciona como magia.
Ejemplo de una configuración:

Dirección IP servidor 192.168.0.1

Dirección IP maquina cliente192.168.0.10
Mascara de Red 255.255.255.0
Gateway 192.168.0.1
Servidor DNS 192.168.0.1

Ahora podemos poner nuestra maquina como Gateway… podemos dejar esta maquina sin teclado en algún rincón y os garantizo que no tendrá ningún problema (tal vez solo problemas de hardware, por dejarla descuidada en un rincón ;-) …)

Dudas, comentarios, sugerencias?
Links:
http://www.netfilter.org/
http://bulma.net/body.phtml?nIdNoticia=1522

Ago

25

Al fin, IM de google, MUERTE al MSN

By Jose Antonio Cely Saidiza

Con agrado me entero de la gran noticia que me hacia falta para volverme creyente de la iglesia de google :D, Mensajería instantánea y como si fuera poco lo están haciendo con jabber, que es Open Source.
A google le debemos mucho, o bueno, mas bien le debo mucho, creo que el 90% de las cosas que he investigado o desarrollado desde hace 3 años para aca hubieran sido imposible sin google, gracias a su poderoso e increíblemente rápido buscador, que en sus entrañas es una gran base de conocimiento. Ya se que estoy hablando demasiado, pero me pregunto, por que google es tan bueno?,  primero su superbuscador, después GMAIL (que por cierto todavía tengo 49 invitaciones), después compran un satélite y montan Google Maps, y ahora rematan con mensajería instantánea, con Google Talk, que esta en estado beta, pero ya funciona a las mil maravillas, lo probé ayer con mi GAIM y no puso ningún problema

Por que muerte al MSN ? si gran mayoría de la gente lo usa? si esta lleno de emoticones y maricaditas que la gente pide?… pues por varias razones, la primera, es que es un producto de microsoft, empresa que siempre se ha caracterizado por tramposa con los usuarios, segundo por que trabaja con un servidor Open Source que conocemos muy bien como funciona,  tercera, por que las aplicaciones clientes están desarrolladas hace rato y son multiplataforma, sin embargo google desarrollo su aplicación cliente, que según he leído desde ahí se pueden enviar invitaciones para GMAIL, y cuarto, por que es un producto de google que siempre se caracteriza por desarrollar servicios rápido, seguros y con tecnologías Open Source/Software libre. Tal vez haya mas razones, pero esas son de las que me acuerdo en este momento.

En este link http://www.google.com/talk/otherclients.html encuentras el tutorial de como configurar tu cliente de mensajería instantánea. Las funcionalidades por el momento son pocas, recordemos que es un beta… animemonos a usarlo, además, para hacer una transición mas suave, desde GAIM uno puede conectarse con las dos cuentas al mismo tiempo (la cuenta de Gmail, y la cuenta de MSN), para ir " migrando " nuestros contactos (obviamente convenciendolos que dejen de usar el MSN).

No falta el paranoico que dice, " no apoyemos estas iniciativas, no creemos otro monopolio", no creo que esto suceda,  hasta el momento google se ha caracterizado por ser una empresa buena y con mucho dinero :D, y hasta el momento no se ha corrompido, además, por que temerle a los monopolios? si la comunidad de software libre tenemos la suficiente fuerza como para acabar con cualquier monopolio como lo estamos haciendo con microsoft …