Archivos para Julio 2008

Planeta Linux

Hoy han agregado mi blog a Planeta Linux México, el cual he sido fiel seguidor desde hace más de 1 año. Un agradecimiento a la comunidad de Planeta Linux.

Aquellas personas que tengan sean lectores o autores de blogs acerca de software libre, los invito a visitar o unirse a una de las comunidades mas grandes en América Latina: Planeta Linux.

Hasta luego.

Montar un servidor DHCP en Debian

En esta ocasión hablaremos de cómo montar un servicio DHCP en tu caja con Debian. Antes que nada, ¿qué es DHCP?. DHCP responde al protocolo de configuración dinámica de host. En otras palabras, es un protocolo que se utiliza para proporcionar una configuración ip a otros equipos que se encuentren en el mismo segmento de red que el servidor. El servidor DHCP es aquel que proporciona direcciones ip dinámicas a equipos que lo soliciten.

¿Porqué debería instalar un servidor DHCP? La respuesta es simple, imagina que tienes 50 equipos en una red. Sería algo complicado ir a cada uno de ellos y configurar manualmente su configuración ip (dirección, máscara de subred, puerta de enlace y dirección de DNS). Aún así lo pudieras hacer pero con una probabilidad alta de que ocurran errores debido a una mala captura de alguna dirección (nos podemos equivocar entre tanto número de red). Es por eso que si se instalara un servidor DHCP, éste proporcionaría la configuración a cada equipo y sin errores.

Para instalar el servidor DHCP, ejecutamos el siguiente comando:

# apt-get install dhcp3-server

Una vez instalado el servicio, copiamos el archivo /etc/dhcp3/dhcpd.conf a /etc/dhcp3/dhcpd.conf.old. Esto es para conservar el archivo de configuración original. Eliminamos el archivo de configuración original y creamos un archivo nuevo con el mismo nombre (/etc/dhcp3/dhcpd.conf), y añadimos la siguiente configuración (sustituye las direcciones y nombre de dominio respecto a tu red):

authoritative;

subnet 192.168.20.0 netmask 255.255.255.0 {
   range 192.168.20.100 192.168.20.150;
   option domain-name-servers 192.168.20.254;
   option domain-name "debian.internal";
   option routers 192.168.20.254;
   option broadcast-address 192.168.20.255;
   default-lease-time 600000;
   max-lease-time 720000;
}

Al final, guardamos los cambios en el archivo /etc/dhcp3/dhcpd.conf. La configuración anterior indica que este servidor va a ser nuestro servidor principal DHCP. La configuración pertenece a la red 192.168.10.20 y repartiremos direcciones de la 192.168.20.100 a la 192.168.20.150 (50 direcciones). El nombre del dominio es debian.internal. La dirección de router o puerta de enlace es 192.168.20.254. Una vez verificada nuestra configuración, solo resta reiniciar el servicio:

# /etc/init.d/dhcp3-server restart

Es todo. A partir de allí nuestro servidor podrá comenzar a repartir direcciones ip dinámicas.

Día del administrador de red.

El último viernes de Julio es el día del administrador de red. Felicidades a todos los administradores de red.

http://www.sysadminday.com/

Inspección de puertos con Nmap

En esta ocasión vamos a ver cómo realizar una inspección de puertos a un equipo en la red utilizando una de las herramientas mas simples y poderosas que hay para este tipo de situaciones: Nmap.

Nmap estará disponible en los repositorios de tu distro favorita. En el caso de Debian, lo puedes instalar así:

# apt-get install nmap

Antes de continuar, debo señalar que Nmap es una herramienta peligrosa. Usalo bajo tu propio riesgo. Una inspección puede poner en jaque a un equipo, especialmente si la inspección se realiza a un equipo que ejecute un sistema operativo Windows.

Para realizar una inspección rápida y sencilla de los puertos en uso en un equipo:

$ nmap 192.168.10.254

Starting Nmap 4.53 ( http://insecure.org ) at 2008-07-23 09:25 CDT
Interesting ports on 192.168.10.254:
Not shown: 1700 closed ports
PORT     STATE    SERVICE
22/tcp   open     ssh
25/tcp   open     smtp
53/tcp   open     domain
80/tcp   open     http
110/tcp  open     pop3
111/tcp  open     rpcbind
113/tcp  open     auth
139/tcp  open     netbios-ssn
143/tcp  open     imap
445/tcp  open     microsoft-ds
631/tcp  open     ipp
2000/tcp open     callbook
4662/tcp filtered edonkey
8009/tcp open     ajp13

Puede que se tarde algunos minutos, o dependiendo del tráfico y velocidad de tu red. El comando anterior muestra una lista de puertos tcp abiertos en un equipo.

Uno de mis parámetros favoritos, es el que te muestra el tipo de sistema operativo que ejecuta la máquina inspeccionada. Este parámetro se tiene que ejecutar con privilegios de root.

# nmap -O 192.168.10.254

Starting Nmap 4.53 ( http://insecure.org ) at 2008-07-23 09:31 CDT
Interesting ports on 192.168.10.254:
Not shown: 1700 closed ports
PORT     STATE    SERVICE
22/tcp   open     ssh
25/tcp   open     smtp
53/tcp   open     domain
80/tcp   open     http
110/tcp  open     pop3
111/tcp  open     rpcbind
113/tcp  open     auth
139/tcp  open     netbios-ssn
143/tcp  open     imap
445/tcp  open     microsoft-ds
631/tcp  open     ipp
2000/tcp open     callbook
4662/tcp filtered edonkey
8009/tcp open     ajp13
MAC Address: 00:19:21:3E:14:A5 (Elitegroup Computer System Co.)
Device type: general purpose
Running: Linux 2.6.X
OS details: Linux 2.6.17 - 2.6.22
Uptime: 0.023 days (since Wed Jul 23 08:58:56 2008)
Network Distance: 1 hop

OS detection performed. Please report any incorrect results at http://insecure.org/nmap/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 3.927 seconds

Como verás, es simple realizar una inspección de puertos con Nmap. Para más información acerca del programa; puedes consular el sitio oficial de Nmap.

Conexión a postgres desde Java

Hace tiempo tuve la necesidad de conectarme a Postgres desde Java. En esa ocasión tuve algunos problemas para hacerlo, por lo que hago esta pequeña guía para todos aquellos que se inicien en JDBC. El código mas o menos puede funcionar con cualquier base de datos.

      1 package prueba;
      2
      3 import java.sql.*;
      4
      5 public class ConexionPostgres {
      6
      7     public void consultar() {
      8         String cc = "jdbc:postgresql://127.0.0.1/prueba?" +
      9             "user=postgres&password=eureka";
     10         try {
     11             Class.forName("org.postgresql.Driver");
     12             Connection conexion = DriverManager.getConnection(cc);
     13             Statement comando = conexion.createStatement();
     14             String sql =
     15                 "SELECT nombre, apellido FROM clientes ORDER BY apellido";
     16             ResultSet resultado = comando.executeQuery(sql);
     17             while(resultado.next()) {
     18                 String n = resultado.getString("nombre");
     19                 String a = resultado.getString("apellido");
     20                 System.out.println(n + " " + a);
     21             }
     22             resultado.close();
     23             comando.close();
     24             conexion.close();
     25         } catch(Exception e) {
     26             System.out.println(e.getMessage());
     27         }
     28     }
     29
     30     public static void main(String[] args) {
     31         ConexionPostgres cp = new ConexionPostgres();
     32         cp.consultar();
     33     }
     34 }

La línea 7 define un método llamado consultar. Dentro de esta función está el código para realizar la conexión a la tabla dentro de una base de datos Postgres.

La línea 8 define la cadena de conexión a la base de datos llamada prueba.

En la línea 11 se carga el controlador JDBC para postgres. Lo puedes descargar aquí.

La línea 12 inicia la conexión a la base de datos “prueba” del servidor postgres.

En la línea 13 se crea un objeto llamado conexion, el cual modela una conexión a un origen de datos. En la siguiente línea se crea un objeto String con la consulta a realizar.

La línea 16 ejecuta la consulta y almacena el resultado en un objeto de tipo ResultSet. Los objetos de este tipo, son unas estructuras dinámicas para almacenar resultados de consultas. En la siguiente línea se define un while que evalúa el resultado de la llamada al método “next” del objeto resultado. Los objetos de tipo ResultSet cuentan con una especie de cursor para seleccionar una fila del resultado de una consulta. Al realizar una llamada a “next”, el cursor se mueve a un registro. De esa manera se va accediendo uno a uno de los registros retornados. El método “next” retornará falso en caso de no haber un registro siguiente al cual apuntar. Por defecto, el cursor de registros apunta a ningún registro, por lo que por lo menos hay que ejecutar una vez el método “next” para obtener si quiera 1 registro. De esta manera, el while se encarga de ir moviendo el cursor de registros de manera automática. Dentro del while simplemente se accede a cada campo de la fila del registro seleccionado y se imprime en pantalla.

Las líneas 22, 23 y 24 liberan los recursos utilizados por los objetos Connection, Statement y ResultSet.

Para compilar, crear un directorio llamado prueba y almacenar dentro de él el archivo ConexionPostgres.java.

$ javac prueba/*.java

Para ejecutar, configurar el classpath de acuerdo a la ubicación del driver JDBC de postgres. En mi caso, he creado un directorio llamado lib dentro del directorio de mi aplicación. Dentro del directorio lib he puesto el archivo jar que contiene el controlador de jdbc. Ejemplo:

$ java -classpath ./prueba/lib/postgresql-8.2.jdbc4.jar:. prueba.ConexionPostgres

Hasta la próxima.