El SysAdmin del 3er Mundo

todo lo que expliqué mientras nadie prestaba atención

tls y ssl en postfix

| Comments

Acá en salud, ahora se están cayendo de la mata y dándose cuenta de los peligroso que son las conexiones planas.

Aún no logro hacerle entender a la gente, la diferencia entre un certificado autofirmado y un certificado emitido por una autoridad de certificación ; pero que más les vamos a pedir, si el certificado de nauta es autofirmado.

De momento con darle la muela del candadito y las letricas verdes en el navegador, van cogiendo algo.

Pero volviendo al tema postfix con SSL. Vamos a crear un certificado autofirmado, por tanto, regla de oro:

el hostname que provees en el certificado, debe ser machear al del servicio

En letra de molde. Si proveemos un certificado autofirmado, para conectarnos a smtp.hcg.sld.cu no puedes decir en el cliente de correo, que el servidor smtp es 192.168.0.1 porque no será válido.

Aún cuando el certificado no sea válido, déjame recodarte que debemos ir haciéndole cultura de seguridad informática, si no… bueno… no me voy a meter en un lío diciendo las barbaridades que se logran suplantando identidades.

Bueno entremos en materia. Lo Primero que haremos será generar la clave privada para el servidor.

Donde dice smtp.tudominio.cu tu pondrás el hostname de que apunta para tu servidor smtp. Si eres un desastre y no tiene DNS. Pon la IP de tu servidor de correo.

REPITO

Donde dice FQDN or YOUR name debe decir la dirección del servidor SMTP. La dirección tal cual la pones en los clientes.

Cuando lo hagas, te pedirá un password.

“generando clave privada del servidor”
1
openssl genrsa -des3 -out smtp.tudominio.cu.key 2048

Ahora creamos el certificado. Te pedirá hasta la talla de calzoncillos que usas. NO respondas a lo locoi, recuerda el FQDN. Te acuerdas del password que pusiste?

“creando el certificado”
1
openssl req -new -key smtp.tudominio.cu.key -out smtp.tudominio.cu.csr

Debes ver algo como esto:

“ceremonia de creación de certificado”
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Enter pass phrase for smtp.tudominio.cu.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CU
State or Province Name (full name) [Some-State]:Havana
Locality Name (eg, city) []:Plaza
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Calixto
Organizational Unit Name (eg, section) []:Informatica
Common Name (e.g. server FQDN or YOUR name) []:smtp.tudominio.cu
Email Address []:ssl@tudominio.cu

Bites verdad? Bueno, ya hicimos lo más importante, pero no hemos terminado. Vamos a firmar el certificado con la la llave emisora.

“cri-cra firmando el certificado”
1
openssl x509 -req -days 365 -in smtp.tudominio.cu.csr -signkey smtp.tudominio.cu.key -out smtp.tudominio.cu.crt

Ahora vamos a dar un paso cuestionable.

Cada vez que un servicio con con un certificado SSL valla a ser iniciado. Debería pedir un password, para así asegurar que el legítimo operador de servicio ha sido quien le dio la arrancada. Pero poner un password cada vez que arranca postfix, no es ninguna gracia. Por tanto, quitamos el password. Obviamente, te lo pedirá una última vez.

“quitando el password”
1
2
openssl rsa -in smtp.tudominio.cu.key -out smtp.tudominio.cu.key.sinpassword
mv smtp.tudominio.cu.key.sinpassword smtp.tudominio.cu.key

Emitimos una autoridad de raíz (de pacotilla)

“la CA del chiste”
1
2
openssl req -new -x509 -extensions v3_ca -keyout cakey.pem -out cacert.pem -days 3650
# aqui te pedirá la misma rutina, ojo con lo que pones en el campo FQDN or YOUR name

Bueno, con el disi y con el mulo, ya tenemos una CA loca, que la podemos reusar para otros servicios, por tanto, tratemosla como tal.

“los puntos sobre las ies”
1
2
3
4
5
6
chmod 600 smtp.tudominio.cu.key
chmod 600 cakey.pem
mv smtp.tudominio.cu.key /etc/ssl/private/
mv smtp.tudominio.cu.crt /etc/ssl/certs/
mv cakey.pem /etc/ssl/private/
mv cacert.pem /etc/ssl/certs/

Ahora viene el turno de postfix. Haremos dos cosas

  • habilitar el tranporte ssl/tls por el puerto 465
  • habilitar las funciones ssl

Ve al master.cf y busca la cadena de texto smtps debes ver algo como esto:

“parte del master.cf ANTES”
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
smtp      inet  n       -       -       -       -       smtpd
#smtp      inet  n       -       -       -       1       postscreen
#smtpd     pass  -       -       -       -       -       smtpd
#dnsblog   unix  -       -       -       -       0       dnsblog
#tlsproxy  unix  -       -       -       -       0       tlsproxy
#submission inet n       -       -       -       -       smtpd
#  -o syslog_name=postfix/submission
#  -o smtpd_tls_security_level=encrypt
#  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING
#smtps     inet  n       -       -       -       -       smtpd
#  -o syslog_name=postfix/smtps
#  -o smtpd_tls_wrappermode=yes
#  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING
#628       inet  n       -       -       -       -       qmqpd
pickup    fifo  n       -       -       60      1       pickup
cleanup   unix  n       -       -       -       0       cleanup

Descomentamos todo lo que tenga que ver con smtps debe quedarte más o menos así:

“parte del master.cf DESPUES”
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
smtp      inet  n       -       -       -       -       smtpd
#smtp      inet  n       -       -       -       1       postscreen
#smtpd     pass  -       -       -       -       -       smtpd
#dnsblog   unix  -       -       -       -       0       dnsblog
#tlsproxy  unix  -       -       -       -       0       tlsproxy
#submission inet n       -       -       -       -       smtpd
#  -o syslog_name=postfix/submission
#  -o smtpd_tls_security_level=encrypt
#  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING
smtps     inet  n       -       -       -       -       smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING
#628       inet  n       -       -       -       -       qmqpd
pickup    fifo  n       -       -       60      1       pickup
cleanup   unix  n       -       -       -       0       cleanup

Ahora trabajemos con el main.cf, habilitamos las funciones que tengan que ver con SSL, declarando esto:

“tope del main.cf”
1
2
3
4
5
6
smtpd_use_tls = yes
smtpd_tls_auth_only = no
smtpd_tls_key_file = /etc/ssl/private/smtp.tudominio.cu.key
smtpd_tls_cert_file = /etc/ssl/certs/smtp.tudominio.cu.crt
smtpd_tls_CAfile = /etc/ssl/certs/cacert.pem
tls_random_source = dev:/dev/urandom

No olvides correr postfix reload

Te voy a coser el culo con un alambre finito.
No te quedará bonito, pero te quedará seguro.

Décima popular

Si este artículo te resultó interesante, considere donar 0.003 BTC: 1LgL9cfT2StNk9gdedMJZseMnKJCEgQJdQ

compartir la wifi

| Comments

Cada vez que paso por 23, me cuentro mil y una red cuyo ESSID tiene el sufijo Conectify delante. Insultado por semejante derroche de windows, le comentaba a un colega, que daba tristeza no ver un linuxero ahí conectado.

El socio me dijo: -en linux no se puede compartir la wifi

PA DARLE POR LA CARA!

Dos paquetes nada más que hacen falta: iw, hostapd

La idea es:

  • crear una interfaz wifi como estacion
  • crear una interfaz wifi como AP
  • crear un interfaz bridge (puente)
  • declarar que la interfaz de salida del puente, es la estación
  • echar a andar el AP por software

¿SE ENTENDIÓ?

Si tienes el puñetero NetworkManager corriendo, este es un buen momento para pararlo.

La interfaz que usualmente vez como wlan0 es en realidad phy0. ¿Quieres verlo? Corre esto:

iw
1
iw dev wlan0 del

¿Te fijaste que wlan0 desapareció? No te preocupes, puedes volver a crearla. Así:

iw
1
iw phy phy0 interface add estacion0 type station

Como mismo hicimos una estación, podemos hacer un AP.

iw
1
iw phy phy0 interface add hotspot0 type __ap

Ahora creamos la interfaz de puente y le asignamos a wlan0 como extremo de salida.

br0
1
2
3
4
5
6
ip link add name br0 type bridge
iw dev estacion0 set 4addr on
ip link set dev estacion0 promisc on
ip link set dev estacion0 up
ip link set dev estacion0 master br0
ip link set up dev br0

En letra de molde:

  • crea un bridge llamado br0
  • dile que lleva ipv4 (requerido, no se por qué)
  • pon la interfaz en modo promiscuo
  • levanta el enlace de estaicon0
  • coloca a estacion0 como interfaz de salida del túnel
  • levanta el bridge

Ahora viene lo más importante, el AP. El fichero /etc/hostapd/hostapd.conf contendrá la configuración de nuestros AP. A mi me quedó así:

/etc/hostapd/hostapd.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# el nombre de tu wifi
ssid=Linux

# la contraseña de tu wifi
wpa_passphrase=secretisisimo

# la interfaz de red que hará de AP
interface=hostspot0

# el puente al que se acoplará
bridge=br0

# el canal, lo puede seleccionar manual
# pero un valor de 0, hará el survey.
# Mejor que el ap lo seleccione, así
# no chocas con ningún canal de etecsa en 23
# y aprovechemos ahora que podemos hacer lo
# que nos de la gana con el espectro radioeléctrico
channel=0

# no toques más nada de aquí pa abajo
auth_algs=3
driver=nl80211
hw_mode=g
logger_stdout=-1
logger_stdout_level=2
max_num_sta=5
rsn_pairwise=CCMP
wpa=2
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP CCMP

y arráncalo:

systemctl
1
systemctl start hostapd

Desde entonces, lo que se conecte a tu wifi con ESSID “Linux” en este caso, irá a dar a la red que tengas conectada en tu Wifi. En este caso la red de br0, cuyo otro extremo sería la wifi de etecsa.

Lo mismo puede hacer cambiando el extremo del tunel. Por ejemplo, con eth0 saldría hacia una red cableada. Una manera de meter una WiFi en una red.

Además

De esta misma forma, si tuvieras dos tarjetas wifi, pones una como AP y le pones la otra como extremo del puente.

OJO

Otra cosa, si tienes corriendo el NetworkManager no podrás echar a andar hostapd. Páralo, arranca hostapd y vuelve a hechar a andar el NetworkManager.

La técnica es la técnica y sin técnica, no hay técnica.

Si este artículo te resultó interesante, considere donar 0.003 BTC: 1LgL9cfT2StNk9gdedMJZseMnKJCEgQJdQ

systemd-timesyncd

| Comments

Mantener un reloj sincronizado y en hora, siempre ha sido un dilema. Algunas personas no reconocen la necesidad de esto; y además son tan imbéciles, que luego se quejan cuando la desfasada fecha de su computadora les impide conectarse a un sitio SSL.

En los servidores y en las estaciones de trabajo que se respeten; siempre ha sido una opción usar un cliente NTP. Pero los ntp, cuando la fecha no está en el día adecuado, no se toman la molestia de sincronizar. En los raspberry-pi eso puede llegar a ser un tremendo problema, ya que NO tienen reloj de hardware y ni siquiera conservan la fecha.

El tan criticado Systemd, tiene una solución para este problema. Sucia y burda, pero muy eficiente. Normalmente, los “clientes” NTP, son cliente y servidor. En el caso de systemd-timsyncd, no se tomaron la molestia de implementar un servidor; solamente un cliente minimalista. Además, guarda las sincronizaciones en un fichero, para determinar si tu reloj de hardware se adelante o atraza y contrarrestar dicho efecto.

Lo bueno que tiene es que agarra la fecha y hora de cualquier parte; luego, la setea sin chistar. La configuración es sencillísima. Localiza el fichero:

/etc/systemd/timesyncd.conf

Declárale un servidor principal y si te da la gana, uno o varios adicionales. A mi me quedó así:

/etc/systemd/timesyncd.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.
#
# You can override the directives in this file by creating files in
# /etc/systemd/timesyncd.conf.d/*.conf.
#
# See timesyncd.conf(5) for details

[Time]
NTP=time.hcg.sld.cu
FallbackNTP=time.sld.cu time.microsoft.com

Generalmente, mi laptop está en el calixto, por eso puse mi servidor local como primario; pero si no lo estuviera, de seguro time.sld.cu sería alcanzable. En el dificilísimo caso de que estuviera de cara a internet, quizás responda el de microsoft, que no está malo. Por cierto, los comentarios del fichero son bastante útiles, vale la pena leerlos.

Por último, lo más importante, habilitar y arrancar el servicio:

systemctl start systemd-timesyncd.service

systemctl enable systemd-timesyncd.service

Para saber el estado del servicio, corre:

timedatectl

Te dirá la hora local y la UTC; te dirá además si está sincronizando por NTP. Con ese comando puede hacer un montón de operaciones, por ejemplo, setear la hora civilizadamente, ya que este la pone en el RTC también.

No existe juez más justo, que el pasar del tiempo.

Si este artículo te resultó interesante, considere donar 0.003 BTC: 1LgL9cfT2StNk9gdedMJZseMnKJCEgQJdQ

repo de fdroid

| Comments

“La que se avecina”, sería una buena manera para describir la revolución de aparatos con android que habrá en el Calixto García muy pronto. Yo siempre con el paso al frente y las luz larga (modestia y aparte) estuve pensando que tener nuestro propio repositorio de aplicaciones para android; sería una buena manera de mantener a todo el mundo bien actualizado, sobre todo a aquellos que no tienen acceso a internet.

Para el que no lo conozca, fdroid es una herramienta cliente para repositorios de android, osea como google market pero libre.

La mecánica es sencilla: Bajo los paquetes con aptoide, verifico que sean seguros y copio la cache para el directorio repo/ de fdroid en el servidor con acrosync

En el repo de debian y en AUR, el paquete se llama fdroidserver. La rutina de instalación ya la conoces.

Creamos el directorio donde meteremos el repo, en mi caso, aquí:

mkdir
1
mkdir -p /srv/http/fdroid/repo

Creamos la configuración de nginx, a mi me quedó así:

nginx.conf
1
2
3
4
5
6
7
8
server {
     listen   10.1.1.14:80;
     listen   10.1.1.14:443 ssl;
     server_name android.hcg.sld.cu;
     location / {
     root /srv/http/fdroid/repo/;
     }
}

Un virtualhost nombrado android. No olvide crear el puntero DNS

Ahora, ve al directorio raíz del repo, OJO A LA RAIZ, NO a donde dice repo/.

fdroid
1
2
cd /srv/http/fdroid/
fdroid init

Te preguntará por la android-sdk, por lo general, está en /opt/android-sdk, dale la ruta.

¿¿No tienes la SDK de android?? Ah pues estás muy jodio… En el caso de arch, el repo de bbqlinux contiene la sdk completa, solo para 64 bits.

Pero volviendo con fdroid:

Ahora debe habérse creado el directorio repo/ dentro del directorio /srv/http/fdroid y es ahí donde copiarás las APK.

cp /donde/esten/tus/*.apk /srv/http/fdroid/repo/

Pero claro, querrás que tu repo se identifique. El fichero /srv/http/fdroid/config.py contiene lo que buscas. Por la linea trenta y pico; a mi me quedó así:

config.py
1
2
3
4
5
6
7
8
9
10
11
12
...

repo_url = "http://android.hcg.sld.cu"
repo_name = "Calixto Garcia"
repo_icon = "calixto_xsm.png"
repo_description = """
Repositorio de aplicaciones de android del calixto. Intentaremos proveerle
aplicaciones debidamente actualizadas. Sientase libre de colaborar, trayendonos
las mas recientes APK.
"""

...

Ah! y sin tildes, si no, python se vuelve loco con el encoding.

Ahora vamos a crear el índice inicial, pero eso mismo comando lo correrás cuando agregues aplicaciones a tu repo.

fdroid
1
fdroid update --create-metadata

OJO!! Asegúrate de que las APK no tengan un espacio en su nombre; muchísimo menos un caracter raro. Si todo salió bien debes ver algo como “Generating metada”.

Con eso terminaste el servidor… Ve a fdroid y ponle la URL del virtualhost como repo, luego update y listo…

¿Cómo se hace? Facilito. Párate en la primer pantalla, aprieta el botón de menú del dispositivo y toca donde dice “Gestionar Repositorios” o en inglés, “Manage Repos”

Desactiva los respos inalcanzables y añade tu repo local. Luego actualiza y listo, verás las aplicaciones disponibles.

Ya solo te quedaría instalar un rsync que desemboque en el repo y con acrosync subes la cache de aptotide para el repo, así como lo estoy haciendo yo ahora.

Si este artículo te resultó interesante, considere donar 0.003 BTC: 1LgL9cfT2StNk9gdedMJZseMnKJCEgQJdQ

prawn, pdf con ruby

| Comments

De siempre, los usuarios que fueron forzados a abandonar MSAcces por un motivo u otro; sienten un incontenible necesidad por los “informes”.

A la hora de imprimir, muchos usaurios no entienden que un HTML se imprima. Incluso, habiéndoles hecho un javascript que muestra el diálogo de impresión, simplemente lo cierra y me preguntan “¿y ahora que hago con esto?”

En recientes diálogos con un bibliotecario (que hereda la clase Usuario) me dijo que la gente entiende más de imprimir PDF.

Hacer un PDF me pareció una tare bastante compleja; y lo es, pero Prawn lo hace de una manera casi increíble. Para no aburrirte con el cuento, te mostraré como montarlo arriba del tren.

EjemploController que tu conoce:

“ejemplo_controller.rb”
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# el controlador bin ban bin ban
class EjemploController < ApplicationController

   def accion # la acción, como se llame

      # a según el sapo, la pedrá
      respond_to do |format|

         # tírame el pdf
         format.pdf do

            # tráeme al animal
            require 'prawn'

            # créame un nuevo documento pdf
            @pdf=Prawn::Document.new

            # tírame el banner, el H1 como quien dice, tamaño de fuente 25px en negrita
            @pdf.formatted_text [ {text: 'El título del documentos',size: 25,styles: [:bold]} ]

            # hazle una rallita horizontal debano al header
            @pdf.stroke_horizontal_line 0,235

            # mueve el cursor pa abajo
            @pdf.move_down 20

            # la variable cuerpo contiene un texto laaaaaaargooo en HTML
            # un HTML muy rudimentario, Prawn lo interpresta, por ejemplo
            # las cláusulas <strong>
            @pdf.text @cuerpo, inline_format: true

            # por jemeplo, itera en el modelo User y escribe sus nombres
            for user in User.all
               @pdf.text "Nombre: #{user.nombre}", inline_format: true
               @pdf.move_down 10
               @pdf.text "Edad: #{user.edad}", inline_format: true
               @pdf.move_down 30
            end

            # tírala!!!
            send_data @pdf.render, filename: "solicitud.pdf"

         end # format

      end # respond_to

   end # def

end # class

Vamos a dividir en sílabas:

Línea 7

Rails, la acción responde a múltiples mime-types

Línea 10

Rails, application/pdf responde a la extensión PDF format.pdf do

Línea 13

Carga la librería, sí, ya se que en Rails debes hacer eso en un initializer, de cualquier manera, aún, luego de haberlo agregado a tu Gemfile, no te olvides de requerirla, ya sea en un initializer o en el controlador.

Línea 16

Crea un nuevo PDF y almacénalo en la variable de instancia @pdf

Línea 19

El método formatted_text, recibe como argumento un array de hashes

Cada array en un bloque de texto y contiene un hash. La clave :text contiene el texto a renderizar, :size el tamaño y :style el estilo de fuente.

Línea 22

Trazar línea horizontal, el método stroke_horizontal_line recibe como argumento, de donde, a donde debe trazar la línea.

Pasemos a la línea 41

El método render devuelve el PDF. Si lo sacas con puts verás el PDF crudo. Podrías también tirarlo pa un fichero así:

“fulanito.pdf”
1
   IO.write 'fulanito.pdf',@pdf.render

A los usuarios le encantan los PDF, hazlos feliz ;)

Existen dos tipos de personas,
las que hacen lo que le dicen; y,
las que dicen lo que hay que hacer.

Lázaro Armando

Si este artículo te resultó interesante, considere donar 0.003 BTC: 1LgL9cfT2StNk9gdedMJZseMnKJCEgQJdQ

dhcp por grupos

| Comments

La fiebre LTSP sigue subiendo en el Calixto. La solución definitiva para toda máquina que butee por la red, sin importar su cantidad de RAM o micro…

Pero cuando hay más de un servidor con DHCP en la misma red, se forma el rollo.

isc-dhcp no se puede bloquear con iptables

Si tienes alguna duda de la afirmación anterior, has la tarea y busca en google. De nada vale ponerle un cortafuegos a cada servidor porque isc usa “raw packets” y se caga en lo que diga iptables. Por suerte de afuera pa dentro eso no se aplica. No obstante, ojo si pones un isc con múltiples interfaces, no sea que acabes dándole DHCP al ruter.

En un ambiente como este, no queda otra que hacer un DHCP central con múltiples parámetros, de forma que los clientes ligeros se agrupen por MAC address y se seleccione el servidor adecuado a la hora de butear.

El fichero de configuración es /etc/dhcp/dhcpd.conf y bajo la declaración de la subnet puedes poner una cláusula group para dar parámetros diferentes.

La sintaxis es sencilla:

“ejemplo”
1
2
3
4
5
6
7
8
9
10
11
12
13
14
subnet {

   parametros de la red

}

group {

   parametros del grupo

   host nombre {
      parametros del host
   }
}

Tomemos el caso de dos servidores LTSP en la red, el 10.1.1.6 y el 10.1.1.3, a mi me quedó así:

“/etc/dhcp/dhcpd.conf”
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# vim:filetype=config
authoritative;

# la red
subnet 10.1.1.0 netmask 255.255.255.0 {
    range 10.1.1.100 10.1.1.254;
    option domain-name "hcg.sld.cu";
    option domain-name-servers 10.1.1.1;
    option broadcast-address 10.1.1.255;
    option subnet-mask 255.255.255.0;
} # subnet


# ganker y su pandilla, la gente de archivos médicos
group {

    # clientes ligeros con linux y ltsp
    option root-path "/opt/ltsp/i386";
    if substring( option vendor-class-identifier, 0, 9 ) = "PXEClient" {
        filename "/ltsp/i386/pxelinux.0";
    } else {
        filename "/ltsp/i386/nbi.img";
    }

   # buteen por ganker
   next-server 10.1.1.3;

   # los clientes
   host clganker1 { hardware ethernet 00:1E:90:E1:B4:0A; }
   host clganker2 { hardware ethernet 00:1E:90:E2:6E:1A; }
   host clganker3 { hardware ethernet 00:1E:90:E2:75:B6; }
   host clganker4 { hardware ethernet 00:1E:90:F5:E8:A5; }
   host clganker5 { hardware ethernet 00:1E:90:F5:E9:88; }

} # ganker


# atenea y su flotilla, el servidor de la biblioteca
group {

    # clientes ligeros con linux y ltsp
    option root-path "/opt/ltsp/i386";
    if substring( option vendor-class-identifier, 0, 9 ) = "PXEClient" {
        filename "/ltsp/i386/pxelinux.0";
    } else {
        filename "/ltsp/i386/nbi.img";
    }

   # buteen por el servidor de la bibliteoca
   next-server 10.1.1.6;

   # los clientes
   host biblioteca1 { hardware ethernet 00:1E:90:E1:B4:0A; }
   host biblioteca2 { hardware ethernet 00:1E:90:E2:6E:1A; }
   host biblioteca3 { hardware ethernet 00:1E:90:E2:75:B6; }
   host biblioteca4 { hardware ethernet 00:1E:90:F5:E8:A5; }
   host biblioteca5 { hardware ethernet 00:1E:90:F5:E9:88; }

} # ganker

¿Qué hicimos? Sencillo, declaramos un grupo con distintos parámetros, aunque en este caso solo next-server es verdaderamente distinto. En ambos casos se engatilla el mismo file-name y root-path ya que ambos servidores hay lo mismo. Pero quizás en su red usted tiene otro servidor bootp o PXE y no querrá que las opciones de LTSP sean la misma.

Finalmente el parámetro next-server difiere y es que es este el que le da porque servidor bootear.

Si este artículo te resultó interesante, considere donar 0.003 BTC: 1LgL9cfT2StNk9gdedMJZseMnKJCEgQJdQ