Servidor PXE
Introducción
Un servidor PXE es un sistema capaz de brindar a sus clientes la opción de instalación vía red (netinstall). Es una forma muy rápida y cómoda de realizar la instalación de un sistema operativo dado que no se necesita siquiera que el equipo a instalar cuente con una lectora de CD/DVD. Además, un servidor PXE puede contar con la capacidad de instalar múltiples sistemas operativos, evitándonos tener uno o más CDs/DVDs por cada sistema. Otra ventaja es que la instalación se realiza obteniendo los paquetes desde un repositorio central con lo que, terminada la instalación, el sistema contará con las últimas versiones de cada paquete. Esto mismo puede suponer una desventaja si la conexión a Internet es lenta, aunque en este último caso lo ideal es montar un mirror de los sistemas necesarios de manera que los archivos se descarguen mucho más rápido.
Para montar un servidor PXE propio utilizaremos Debian Lenny y los siguientes programas:
- Servidor DHCP.
- Servidor TFTP.
En la sección siguiente se procede a la instalación y configuración del servidor en cuestión.
Instalación y configuración
Instalar el software necesario.
pxe-server:~# aptitude install tftpd-hpa dhcp3-server
Una vez instalados ambos servicios, es necesario permitir el inicio de tftpd-hpa como demonio, de la siguiente manera:
pxe-server:~# vi /etc/default/tftpd-hpa RUN_DAEMON="yes" OPTIONS="-l -s /var/lib/tftpboot"
Si el directorio /var/lib/tftpboot no existiera será necesario crearlo. Ahora bien, el próximo paso es iniciar el servidor TFTP.
pxe-server:~# /etc/init.d/tftpd-hpa start
Luego de configurado TFTP, habrá que indicarle al servidor DHCP las interfaces en las que debe ofrecer IPs. En este caso se utiliza la eth0.
pxe-server:~# vi /etc/default/dhcp3-server INTERFACES="eth0"
El próximo paso es instruir al servidor DHCP acerca de la información de configuración que debe brindar.
pxe-server:~# vi /etc/dhcp3/dhcpd.conf
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.200 192.168.1.250;
option routers 192.168.1.1;
option domain-name-servers 192.168.1.1;
filename "pxelinux.0";
}
Una vez cumplidos los dos pasos anteriores ya se puede poner a funcionar el servidor DHCP.
pxe-server:~# /etc/init.d/dhcp3-server restart
Constatar entonces que tanto el servidor DHCP como el servidor TFTP estén funcionando.
pxe-server:~# netstat -nlup Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name udp 0 0 0.0.0.0:67 0.0.0.0:* 2684/dhcpd3 udp 0 0 0.0.0.0:68 0.0.0.0:* 1706/dhclient3 udp 0 0 0.0.0.0:69 0.0.0.0:* 2379/in.tftpd
El paso siguiente es descargar los archivos necesarios para realizar la instalación por red. En este caso se mostrará cómo configurar al servidor para que permita instalar Debian Lenny.
pxe-server:~# cd /var/lib/tftpboot/ pxe-server:/var/lib/tftpboot# lftp -c "open http://http.us.debian.org/debian/dists/lenny/main/installer-i386/current/images/netboot/; mirror"
Listo, el servidor ya está configurado y funcionando. A partir de este momento ya es posible instalar Debian Lenny en cualquier equipo vía red. Para ello, se configura el cliente para que bootee utilizando PXE, se lo conecta en el mismo segmento de red en que se encuentra el servidor configurado y listo, la instalación comenzará automáticamente.
Wake On LAN: prender un equipo de forma remota
Wake On LAN: ¿Qué es y para qué sirve?
Muchas veces es necesario acceder a una máquina remota por algún motivo aunque puede que la necesidad sea eventual y no se justifique el gasto de tenerla encendida todo el tiempo. Para estas oportunidades, la técnica de Wake On LAN (WOL) es ideal. Básicamente, nos permite encender un equipo utilizando como único medio la red local.
WOL tiene dos prerrequisitos fáciles de cumplir: requiere que la computadora a ser encendida soporte WOL y esté conectada a una red Ethernet. Su forma de funcionamiento es igualmente simple: se envía una trama especial, llamada paquete mágico (magic packet), que contiene dentro la dirección MAC de la PC a “despertar” repetida 16 veces. De esta manera, la PC que está apagada recibe dicha trama, detecta el paquete mágico y al verificar que la MAC contenida es la propia envía una señal de encendido. Lógicamente, para que esto funcione es necesario que la placa de red siga recibiendo energía, con lo cuál existe un mínimo consumo.
Configurando WOL en la máquina destino.
Para habilitar WOL es necesario hacerlo primero desde el BIOS, desde la sección Power Management (administración de energía). Allí se encuentra una opción normalmente referida como Wake On LAN, Wake on MAC LAN o algo parecido. Lógicamente, hay que habilitar dicha opción. En la mayoría de los sistemas debería alcanzar con eso, dado que WOL es una característica independiente del sistema operativo. No obstante, en un caso (con un motherboard MSI K9N Neo) no me funcionó dicha opción y lo habilité desde Linux. Por ello explicaré a continuación cómo hacerlo.
testing:~# ethtool eth0
Settings for eth0:
Supported ports: [ MII ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Supports auto-negotiation: Yes
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Advertised auto-negotiation: Yes
Speed: 100Mb/s
Duplex: Full
Port: MII
PHYAD: 1
Transceiver: external
Auto-negotiation: on
Supports Wake-on: g
Wake-on: d
Link detected: yes
De la salida anterior importan particularmente dos opciones: Supports Wake-on y Wake-on. La primera de ellas, con una g indica que la placa de red soporta efectivamente WOL; la segunda, con una d indica que WOL está desactivado en esa interfaz. Para habilitarlo:
testing:~# ethtool -s eth0 wol g
testing:~# ethtool eth0
Settings for eth0:
Supported ports: [ MII ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Supports auto-negotiation: Yes
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Advertised auto-negotiation: Yes
Speed: 100Mb/s
Duplex: Full
Port: MII
PHYAD: 1
Transceiver: external
Auto-negotiation: on
Supports Wake-on: g
Wake-on: g
Link detected: yes
Despertando un equipo por LAN.
Para encender un equipo por LAN se necesita enviar el paquete mágico. Hay varias utilidades que hacen esto. En Linux se puede utilizar wakeonlan y en Mac existe una utilidad free llamada WakeUp. Mikrotik también lo soporta con una utilidad propia, que se verá a continuación.
Utilizando wakeonlan en Linux.
Si el equipo a encender está en la misma red alcanza con el siguiente comando, indicando sólo la MAC del mismo. En este caso se supone que la MAC es 08:00:27:e8:02:6b.
leandro@megan:~$ wakeonlan 08:00:27:e8:02:6b Sending magic packet to 255.255.255.255:9 with 08:00:27:e8:02:6b
Si el equipo está en otra red entonces son necesarios algunos pasos y parámetros adicionales:
- La utilidad wakeonlan envía el paquete mágico al puerto 9 UDP. Por tal motivo, en caso de utilizar NAT es necesario redirigir ese puerto a la IP de la máquina destino. De le contrario será necesario sólo habilitarlo en el firewall.
- La máquina que ejecute la utilidad para prender el equipo remoto debe ahora apuntar a la IP del router que redirigirá el paquete.
A continuación se muestran los parámetros del comando dado que no es tema de este post explicar cómo redirigir puertos. Se supone aquí que el router hace NAT y tiene la IP 10.0.0.1.
leandro@megan:~$ wakeonlan -i 10.0.0.1 08:00:27:e8:02:6b Sending magic packet to 10.0.0.1:9 with 08:00:27:e8:02:6b
Utilizando la utilidad de Mikrotik.
Con un router Mikrotik, basta con especificar la MAC del sistema destino y, opcionalmente, la interfaz mediante la cual dicho sistema se conecta.
[leandro@MikroTik] > tool wol mac=08:00:27:e8:02:6b interface=LAN
Nginx + PHP + FastCGI + MySQL + FreeBSD
El objetivo de este post es explicar la configuración mínima para tener funcionando sobre un sistema FreeBSD 8 un servidor web muy liviano con Nginx y FastCGI, con soporte para PHP y MySQL.
Un poco de la arquitectura
Como ya comenté, el servidor web estará basado en un sistema FreeBSD 8 por diferentes motivos:
- Altamente estable.
- Muy seguro en su configuración por defecto.
- Sistema liviano, sin servicios innecesarios ni paquetes de software que no sean indispensables para el funcionamiento del sistema.
Además de lo anterior me gustan los sistemas BSD y también trabajar con diferentes entornos operativos, lo cual también ayudó en la elección.
Para brindar el servicio web el elegido fue Nginx, debido a que es un servidor web muy liviano y estable, capaz de ofrecer alta performance y con una configuración muy sencilla. Como se comenta en su wiki, Nginx es el motor de alrededor del 6.55% de los servidores web del mercado, siendo el backend de varios sitios importantes como WordPress, Hulu, Ohloh, Git HUB, Source Forge y Torrent Reactor.
Ahora bien, para servir los requerimientos de FastCGI se utilizará spawn-fcgi, que es una implementación empaquetada del código escrito originalmente para dar soporte a FastCGI en Lighttpd.
Por su parte, las versiones de MySQL y PHP serán la 5.5 y la 5.3.3 respectivamente, con la primera disponible en los repositorios de FreeBSD. En el caso de PHP, será necesario compilarlo desde los fuentes.
Pasos preliminares
Se asume que se cuenta con un sistema FreeBSD 8 instalado y funcionando correctamente, con los repositorios de paquetes configurados. En el sistema utilizado para este tutorial los únicos servicios que se ejecutan son sendmail (viene por defecto con FreeBSD) y SSH, como se puede ver a continuación:
[root@ ~]# netstat -na -p tcp | grep -i listen tcp4 0 0 127.0.0.1.25 *.* LISTEN tcp4 0 0 *.22 *.* LISTEN tcp6 0 0 *.22 *.* LISTEN
Instalación del servidor MySQL
Lo primero a instalar será el servidor de bases de datos, dado que es el paso más simple de realizar. Para ello, se instala y se define que se desea permitir que el servicio se inicie y que lo haga automáticamente con el sistema. Dicha acción se define en el archivo /etc/rc.conf. Finalmente se inicia el servicio.
[root@ ~]# pkg_add -r mysql55-server [root@ ~]# vi /etc/rc.conf mysql_enable="YES" [root@ ~]# /usr/local/etc/rc.d/mysql-server start
A continuación puede verse que el servicio está efectivamente esperando por conexiones en el puerto TCP 3306.
[root@ ~]# netstat -na -p tcp | grep -i listen tcp4 0 0 127.0.0.1.25 *.* LISTEN tcp4 0 0 *.22 *.* LISTEN tcp6 0 0 *.22 *.* LISTEN tcp46 0 0 *.3306 *.* LISTEN
Instalación y configuración de Nginx
El servidor nginx está también disponible en los repositorios de paquetes de FreeBSD, con lo cuál para instalarlo basta con ejecutar lo siguiente:
[root@ ~]# pkg_add -r nginx
Ahora bien, si se desea que el servidor sea accesible desde otros lugares es necesario editar el nombre del mismo desde el archivo de configuración de nginx y cambiar el nombre localhost por uno válido o por la IP del servidor.
[root@ ~]# vi /usr/local/etc/nginx/nginx.conf
server_name NOMBRE_SERVIDOR;
Luego, es necesario nuevamente definir el inicio del servicio y arrancarlo.
[root@ ~]# vi /etc/rc.conf nginx_enable="YES" [root@ ~]# /usr/local/etc/rc.d/nginx start
A continuación puede verse que el servicio está efectivamente esperando por conexiones en el puerto TCP 80.
[root@ ~]# netstat -na -p tcp | grep -i listen tcp4 0 0 *.80 *.* LISTEN tcp4 0 0 127.0.0.1.25 *.* LISTEN tcp4 0 0 *.22 *.* LISTEN tcp6 0 0 *.22 *.* LISTEN tcp46 0 0 *.3306 *.* LISTEN
Instalación y configuración de PHP
Como se dijo al principio del post, PHP se instalará desde los fuentes, con lo cuál será necesario cumplir algunas dependencias y luego realizar la compilación. En este caso, PHP se compilará con soporte para zlib, gd y mysql.
[root@ ~]# pkg_add -r gd libXpm [root@ ~]# cd /usr/rsc [root@ /usr/src]# wget -c http://ar2.php.net/distributions/php-5.3.3.tar.bz2 [root@ /usr/src]# tar -xvjf php-5.5.5.tar.bz2 [root@ /usr/src/php-5.3.3]# ./configure --with-zlib --with-gd --with-mysql --with-jpeg-dir=/usr/local/lib --with-png-dir=/usr/local/lib --with-xpm-dir=/usr/local/lib [root@ /usr/src/php-5.3.3]# make [root@ /usr/src/php-5.3.3]# make install
Configurar el soporte para FastCGI
Este paso es muy simple y consiste en instalar spawn-fcgi, configurar su inicio, arrancarlo e indicarle a Nginx que los requerimientos PHP los redirija a dicho servicio. Todo esto se hace como se ve a continuación.
[root@ ~]# pkg_add -r spawn-fcgi [root@ ~]# vi /etc/rc.conf spawn_fcgi_enable="YES" [root@ ~]# /usr/local/etc/rc.d/spawn-fcgi start
Luego de iniciado el servicio, se puede ver que el mismo está efectivamente escuchando en el puerto TCP 9000.
[root@ ~]# netstat -na -p tcp | grep -i listen tcp4 0 0 *.80 *.* LISTEN tcp4 0 0 127.0.0.1.9000 *.* LISTEN tcp4 0 0 127.0.0.1.25 *.* LISTEN tcp4 0 0 *.22 *.* LISTEN tcp6 0 0 *.22 *.* LISTEN tcp46 0 0 *.3306 *.* LISTEN
Ahora sí, finalmente, indicarle a Nginx dos cosas:
- Que considere las páginas index.php como páginas de inicio. Esto se realiza agregando el valor index.php al final de la directiva index.
- Que procese los scripts PHP con spawn-fcgi. Ya existe una configuración que simplemente se debe descomentar para que esto funcione.
[root@ ~]# vi /usr/local/etc/nginx/nginx.conf
index index.html index.htm index.php;
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/www/nginx/$fastcgi_script_name;
include fastcgi_params;
}
Una aclaración es que la variable fastcgi_param debe indicar el path completo al directorio raíz de nginx, dado que el valor que incluye por defecto no funciona.
Pasos finales
Si se cumplieron todos los pasos anteriores y no surgió ninguna dificultad ya se cuenta entonces con la implementación de la arquitectura planteada funcionando correctamente. Ahora sólo resta publicar los sitios web que se deseen.
Habilitar SNMP en Mikrotik
Los routerboard Mikrotik incluyen la posibilidad de monitorearlos utilizando SNMP de forma muy sencilla, como puede verse a continuación.
[user@core-gateway] > snmp set enabled=yes contact="root@netstorming" location="communications-room" trap-community=public
[user@core-gateway] > snmp print
enabled: yes
contact: "root@netstorming"
location: "communications-room"
engine-id: ""
engine-boots: 0
time-window: 15
trap-sink: 0.0.0.0
trap-community: public
trap-version: 1
[user@core-gateway] > snmp community print
# NAME ADDRESS SECURITY READ-ACCESS
0 public 0.0.0.0/0 none yes
[user@core-gateway] > snmp community set 0 address=172.16.30.2
[user@core-gateway] > snmp community print
# NAME ADDRESS SECURITY READ-ACCESS
0 public 172.16.30.2/32 none yes
En los comandos anteriores puede verse que se habilita SNMP, se utiliza la comunidad por defecto public que nos permite consultar diferentes MIBS al equipo y se la restringe para que sólo se la pueda consultar desde la IP 172.16.30.2 que es la IP del servidor de monitoreo.
Se puede constatar que lo anterior funcione correctamente ejecutando el comando snmpwalk en dicho servidor:
scarlet:~ leandro$ snmpwalk -v1 -c public 172.16.30.1 SNMPv2-MIB::sysDescr.0 = STRING: router SNMPv2-MIB::sysObjectID.0 = OID: SNMPv2-SMI::enterprises.14988.1 DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (29815700) 3 days, 10:49:17.00 SNMPv2-MIB::sysContact.0 = STRING: root@netstorming SNMPv2-MIB::sysName.0 = STRING: core-gateway SNMPv2-MIB::sysLocation.0 = STRING: communications-room SNMPv2-MIB::sysServices.0 = INTEGER: 78 ...
La salida es mucho más extensa que lo que se muestra, pero si se obtiene algo de lo anterior entonces se puede asumir que SNMP está funcionando correctamente en el equipo y que el servidor es capaz de obtener la información que necesita.
BitTorrent para actualizar Facebook y Twitter
Muchos sistemas operativos libres utilizan el protocolo BitTorrent para que los usuarios descarguen los CDs y DVDs del mismo por su gran eficiencia, dado que no sólo se pueden lograr grandes velocidades de transferencia sino que además se reduce de manera muy importante el tráfico en los servidores propios.
Pero eso no es todo, dado que recientemente desde Facebook y Twitter comentaban que utilizan dicho protocolo para hacer actualizaciones masivas del código en sus servidores, una tarea que les lleva en la actualidad unos pocos minutos. Sin dudas una solución muy buena para conocer y comenzar a implementar, aunque sin dudas a una escala menor (al menos en mi caso). Si lo hago lo estaré comentando por aquí oportunamente.



