domingo, 25 de mayo de 2008

Servidor Hogareño - Versión GNU/Linux

Este artículo tendrá por objeto dar las explicaciones necesarias para poder montar un servidor hogareño basado en GNU/Linux. Los servicios que se pretenden brindar son: DHCP, PDC, FileServer, Proxy, y Filtrado de Páginas. Si hay tiempo, un servidor del tipo Portal estaría también muy bueno.

La versión de GNU/Linux elegida, en este momento, es la Ubuntu 8.04, que si bien ha demostrado que no es la más rápida, por lo menos está basada en paquetes .deb, verifica de una forma medianamente coherente dependencias, y permite su actualización con un grado bastante sencillo de tareas.

El primer punto ha sido instalar la distribución por default, generando una partición de 8 GBpara el swap, y de 130 GB para /.

Lo ideal no es dejar todo el contenido del primer disco sin dividir filesystems, pero en este caso, como el servidor tendrá características hogareñas, no hace falta más.

Cayendo sin red

Mi motherboard es un ASUS P5GC-MX/1333, que tiene una tarjeta de red Attansic L2, por supuesto, como me gustan los desafíos, no soportada directamente por Ubuntu 8.04. Y digo no soportada directamente, porque si bien el driver aparece dentro de los existentes en esta versión, sencillamente no funcionan con este motherboard. Los módulos de esta tarjeta de red aparecen como cargados al ejecutar un "lspci", pero no funcionan, lo cual nos lleva, ante todo, a tener que buscar un nuevo driver, que deberá funcionar mejor que éste.

Efectivamente, con el motherboard me llegó un CD con drivers. Entre ellos, encontré que aparecía un directorio llamado "LinuxDrivers". Excelente, me dije, y sin pensarlo, seguí el procedimiento necesario para compilarlos. Nada más inútil, porque llegué a un mensaje de error que me decía que no tenía el directorio /usr/src/linux-headers-2.6.24-16-generic. No hay problema, utilicé el ingenio, y saqué de internet, en otra máquina, desde el sitio packages.ubuntu.com, esos paquetes y sus dependencias. Los grabé en un memory stick, y los instalé en el equipo.

Para poder compilar lo que necesitaba, sin saber si era o no necesario, pero sabiendo que en algún momento lo sería, instalé, desde el CD de Ubuntu, el paquete build-essential.

Pero tampoco funcionó, dado que me apareció, al ejecutar "make", un mensaje haciendo referencias a problemas de CFLAGS, requiriendo que se modifiquen los parámetros para que se utilicen EXTRA_CFLAGS. Cuando estaba a punto de darme por vencido, y comenzar con alguna otra distro, que me diera más y mejores drivers (según tengo entendido, ya hay varias que así lo hacen), encontré un código fuente dedicado a esta tarjeta, que se encuentra en http://people.redhat.com/csnook/atl2/atl2-2.0.4.tar.bz2 . Lo bajé, lo compilé, y el módulo atl2.ko resultante, lo copié a /lib/modules/2.6.24-16-generic/ubuntu/net/atl2/atl2.ko.

Rebooteé el equipo, y la configuración de red comenzó a funcionar. La familia, contenta. Ahora puedo hacer un "apt-get update", y que funcione. Lo sé, no me olvidé de comentar las entradas del CD de Ubuntu en "/etc/apt/sources.list".

Conexión vía terminal y VNC

Una de las primeras cosas que necesité, fue el servidor OpenSSH, dado que me resultaría más cómodo trabajar con el servidor de esta manera, en forma remota. Para ello, instalé el paquete openssh-server con el comando "apt-get install openssh-server". El sistema bajó también el "libssl0.9.8.0.9.8g-4ubuntu", el "openssh-client", y el "openssh-blacklist". Luego de la instalación, y sólo para ver si todo levantaba correctamente desde el principio, rebotee el sistema.

Una cosa que me encantó de este motherboard es que un reboot dura menos de 30 segundos. Increíble.

Inmediatamente después, me pude conectar desde otros equipos sin problemas:

login as: hecsa
hecsa@192.9.200.2's password:
Linux dshecsa01 2.6.24-16-generic #1 SMP Thu Apr 10 13:23:42 UTC 2008 i686

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

To access official Ubuntu documentation, please visit:
http://help.ubuntu.com/
hecsa@dshecsa01:~$

Excelente, el primer paso estaba dado!

Ahora, vamos por la conexión vía VNC. Como es sabido, el paquete a instalar es el vncserver.

Al hacer un "apt-cache search vncserver", encontré que uno de los listados era el "vnc4server". Lo instalé con el comando "apt-get install vnc4server", y posteriormente lo inicié con el comando "vncserver". Así de sencillo.

Ahora bien, la primera imágen es que el entorno en sí se veía bastante básico, por lo que descomenté las siguientes dos líneas en el archivo $HOME/.vnc/xstartup, para que levante por VNC un entorno más completo, como el que tengo en la consola del equipo:

unset SESSION_MANAGER
exec /etc/X11/xinit/xinitrc

Claro que lo que el sistema quiere es levantar el TWM, que no tenía instalado, por lo cual ejecuté "apt-get install twm". Reinicé el servidor con los comandos "vncserver -kill :1", y "vncserver", y todo quedó de maravillas.

Compartiendo los archivos

Por supuesto, lo que debía hacer ahora era instalar el servidor Samba, y configurarlo para que pueda funcionar como un PDC.

Primer paso, instalar el paquete samba: "apt-get install samba".

El paquete aparentemente, se instaló correctamente, pero arrojó unos mensajes extraños, que luego analizaré (Veremos el resultado de este análisis en el apéndice dedicado a tales fines):

tdbsam_open: Converting version 0 database to version 3.
account_policy_get: tdb_fetch_uint32 failed for field 1 (min password length), returning 0
account_policy_get: tdb_fetch_uint32 failed for field 2 (password history), returning 0
account_policy_get: tdb_fetch_uint32 failed for field 3 (user must logon to change password), returning 0
account_policy_get: tdb_fetch_uint32 failed for field 4 (maximum password age), returning 0
account_policy_get: tdb_fetch_uint32 failed for field 5 (minimum password age), returning 0
account_policy_get: tdb_fetch_uint32 failed for field 6 (lockout duration), returning 0
account_policy_get: tdb_fetch_uint32 failed for field 7 (reset count minutes), returning 0
account_policy_get: tdb_fetch_uint32 failed for field 8 (bad lockout attempt), returning 0
account_policy_get: tdb_fetch_uint32 failed for field 9 (disconnect time), returning 0
account_policy_get: tdb_fetch_uint32 failed for field 10 (refuse machine password change), returning 0

Ahora, pasaremos a la configuración, que calculo que no será una tarea menor. Veamos cómo transformamos este servidor en un Samba PDC.

Para eso, lo primero que hago es generar un archivo "/etc/samba/smb.conf" como el siguiente:

[global]
workgroup = GRUPETE
netbios name = SERVER1
server string = %h server
obey pam restrictions = Yes
passdb backend = tdbsam
passwd program = /usr/bin/passwd %u
passwd chat = *Enter\snew\sUNIX\spassword:* %n\n *Retype\snew\sUNIX\spassword:* %n\n .
log level = 2
log file = /var/log/samba/log.%m
max log size = 1000
socket options = TCP_NODELAY IPTOS_LOWDELAY SO_SNDBUF=8192 SO_RCVBUF=8192
add user script = /usr/sbin/useradd -m %u
delete user script = /usr/sbin/userdel -r %u
add group script = /usr/sbin/groupadd %g
delete group script = /usr/sbin/groupdel %g
add user to group script = /usr/sbin/usermod -G %g %u
add machine script = /usr/sbin/useradd -d /var/lib/nobody -s /bin/false -M %u
logon script = %U.cmd
domain logons = Yes
os level = 65
domain master = Yes
dns proxy = No
wins support = Yes
ldap ssl = no
panic action = /usr/share/samba/panic-action %d
invalid users = bin, daemon, sys, man, postfix, mail, ftp
admin users = @wheel

[homes]
comment = Home Directories
valid users = %S
read only = No
create mask = 0700
directory mask = 0700
browseable = No
dont descend = profile

[netlogon]
comment = Network Logon Service
path = /home/samba/netlogon
share modes = No

[printers]
comment = All Printers
path = /tmp
create mask = 0700
printable = Yes
browseable = No

[print$]
comment = Printer Drivers
path = /var/lib/samba/printers

[archive]
comment = Directorio Archivos
path = /archivos
valid users = @interno, root
read only = No
create mask = 0770
directory mask = 0770
browseable = No

Ahora, a generar los usuarios. Comienzo por el mío, así que como sé que está generado en el sistema GNU/Linux, ejecuto "smbpasswd -a hecsa".

Inmediatamente, o mejor dicho, luego de esperar unos minutos, pude levantar desde una máquina separada los directorios compartidos mediante el protocolo de Samba. Otro éxito, y ya van varios!

Dame una dirección, por favor

Ahora, le llegaba el turno al servidor DHCP, que tantas alegrías nos da siempre.

Lo primer, es instalar el paquete que nos dará este servicio. Al hacer un "apt-cache search dhcpd" encontré a mi viejo amigo y aliado "dhcp3-server", que como siempre, instalé con el comando "apt-get install dhcp3-server".

Lo interesante es que luego de instalarlo, aparecen estos mensajes:

* Starting DHCP server dhcpd3 [fail]
invoke-rc.d: initscript dhcp3-server, action "start" failed.

Pero al mirar archivos como el "/var/log/messages", o el "/var/log/daemon.log", no encontramos más que mensajes de subida el dhcpd, lo cual desconcierta bastante.

Para evitar seguir hurgando en detalles extravagantes, sencillamente dejé el archivo "/etc/dhcp3/dhcpd.conf" de la siguiente forma:

option domain-name "hecsa.com.ar";
option domain-name-servers 200.42.0.108, 200.42.0.109;

default-lease-time 600;
max-lease-time 7200;

subnet 192.9.200.0 netmask 255.255.255.0 {
range 192.9.200.220 192.9.200.230;
option routers 192.9.200.1;
option domain-name-servers 200.42.0.108, 200.42.0.109;
authoritative;
}

host hecsadv {
hardware ethernet 00:13:02:61:23:C4;
fixed-address 192.9.200.142;
}

A que no se imaginan qué pasó cuando levantó de nuevo el servicio dhcpd, con los comandos "/etc/init.d/dhcp3-server stop" y "/etc/init.d/dhcp3-server start"? Mírenlo ustedes mismos:

root@dshecsa01:/etc# /etc/init.d/dhcp3-server stop
* Stopping DHCP server dhcpd3 [fail]
root@dshecsa01:/etc# /etc/init.d/dhcp3-server start
* Starting DHCP server dhcpd3 [ OK ]

Sí, así es...quedó funcionando. Ya tenemos servidor de direcciones, y hasta una dirección fijada para una de las máquinas de la red. Qué tal, eh?

Servidor Proxy

Nada más sencillo que instalar un servidor proxy en GNU/Linux, y ni que hablar sobre Ubuntu.
Lo único que tendremos que hacer es ejecutar "apt-get install squid".
Ahora viene la parte de la configuración, que si bien tampoco es complicada, merece que se explique de forma adecuada para evitar problemas.
Lo primero que tendremos que hacer es ingresar al directorio /etc/squid, y copiar el archivo instalado por omisión, squid.conf, como squid.conf.original, o lo que querramos que sea.
Ahora, lo editaremos, y le cambiaremos las siguientes líneas:

visible_hostname dshecsa01
acl mi_red src 192.9.200.0/24
http_access allow mi_red

Ahora, bajamos y subimos el squid con el set de comandos "/etc/init.d/squid stop" y "/etc/init.d/squid start", y todo queda funcionando.

Apéndices

Solución de backup

Para realizar backups, y dado que remarco la característica de "hogareño" de este servidor, nada como un buen DVD-RW.

Para poder usarlo con GNU/Linux, nada como implementar el excelente programa K3B, realmente una versión mejorada de cualquier programa de grabación de CD/DVD que haya visto.

Como siempre, lo instalo con el comando "apt-get install k3b". Pero como el K3B requiere de otros programas para funcionar perfectamente, ejecuto también "apt-get install normalize-audio", "apt-get install sox", "apt-get install transcode", "apt-get install vcdimager", y me faltaría algo que levante el eMovix, pero por ahora no lo encuentro. Con lo que tengo, ya podré realizar la mayor parte de todas las cosas que generalmente hago con un programa como el K3B.

No hay comentarios: