Configuración de thinserver: LTSP, shares y Kerberos
Glosario breve
- LTSP: Thin Client Server — entorno para clientes ligeros que inician por red.
- Kerberos: Sistema de autenticación de red basado en tickets.
- CIFS/SMB: Protocolo para acceder a compartidos Windows desde Linux.
- NETLOGON: Compartido típico en controladores de dominio con scripts de inicio.
Índice
- DHCP y arranque PXE
- Personalización del cliente ligero
- Montar compartidos Windows al iniciar sesión
- Quitar compartidos al cerrar sesión
- SSH sin contraseña con Kerberos
- Problemas comunes y soluciones
- Checklist de despliegue y pruebas
- Playbook de actualización y seguridad
DHCP Server Settings
A continuación están las entradas de ejemplo que necesitas en tu servidor DHCP para que un cliente ligero arranque desde thinserver. Conserva exactamente el contenido de los bloques de código cuando lo apliques.
default-lease-time 21600;
max-lease-time 21600;
option subnet-mask 255.255.255.0;
option broadcast-address 10.255.255.255;
option routers 10.0.0.1;
option domain-name-servers 10.0.0.10
option domain-name "domain.internal";
option root-path "/opt/ltsp/i386";
host thinclient1 {
next-server 10.0.0.10;
hardware ethernet 00:AA:BB:CC:DD:EE;
fixed-address 10.0.0.100;
filename "ltsp/i386/pxelinux.0";
option root-path "10.0.0.10:/opt/ltsp/i386";
}
host thinclient2 {
next-server 10.0.0.10;
hardware ethernet 00:BB:CC:DD:EE:FF;
fixed-address 10.0.0.101;
filename "ltsp/i386/pxelinux.0";
option root-path "10.0.0.10:/opt/ltsp/i386";
}
Nota: ajusta direcciones IP, MAC y rutas de root-path según tu entorno. Mantén coherencia entre DHCP, TFTP y el sistema de archivos LTSP.
Personalización y aplicaciones en clientes ligeros
Para facilitar el uso a los clientes ligeros instalé el tema XPGnome y modifiqué los menús de inicio. También instalé Adobe Reader 9 y Skype en el entorno del cliente.
Si falta el icono de “Cerrar sesión” en el entorno GNOME, puedes buscar un icono de 48×48 y redimensionarlo con GIMP a 32×32, 24×24, 22×22 y 16×16. Renombra el icono a system-log-out.png y guárdalo en /usr/share/icons/GnomeXP/{tamaño}/actions en el servidor.
El resultado final se ve así:

Para aplicar estas preferencias por defecto a todos los usuarios que inician sesión en thinserver, copia desde la carpeta del usuario que instaló el tema XPGnome los directorios .config, .gconf, .icons, .local y .themes a /etc/skel. A partir de entonces, cualquier cambio adicional que quieras aplicar a todos los usuarios deberá copiarse también a /etc/skel.
Important: Mantén un usuario “plantilla” que sirva como origen de /etc/skel y documenta los cambios.
Montar compartidos Windows al iniciar sesión
Hay varias maneras de montar compartidos Windows en Linux. En este entorno opté por usar scripts Bash y Perl junto con “Startup Applications” de Ubuntu para que el proceso se ejecute en el contexto del usuario (no como root), aprovechando Kerberos para autenticación sin contraseña.
Requisitos previos:
- Asegúrate de que el compartido NETLOGON del controlador de dominio (dc.domain.internal) esté montado en thinserver.domain.internal.
- Crea una cuenta de dominio con permisos limitados para listar el contenido del AD (ejemplo: usuario “public” con contraseña “password” en este tutorial). Usa una cuenta con privilegios mínimos.
Crea la carpeta de montaje para NETLOGON:
sudo mkdir /mnt/logonAñade esta línea a /etc/fstab para montar NETLOGON (ajusta nombres si es necesario):
//dc.domain.internal/netlogon /mnt/logon cifs username=public,password=password 0 0Monta todas las entradas de fstab:
sudo mount -aEl flujo que seguí hace que cada usuario tenga su propio archivo .mount.sh y .umount.sh generados dinámicamente a partir de su script de logon (por ejemplo, jdoe.bat) que reside en el compartido NETLOGON.
Un ejemplo de batch (jdoe.bat):
@echo off
NET USE S: \\server\common
NET USE T: \\server\ITScript win_share.sh (guardar en /usr/local/bin/) — este script comprueba y regenera .mount.sh y .umount.sh y luego ejecuta el montaje:
#!/bin/sh
# Check to see if .mount.sh and .umount.sh exist, if so delete them!
if [ -f /home/$USER/.mount.sh ]; then
rm /home/$USER/.mount.sh
fi
if [ -f /home/$USER/.umount.sh ]; then
rm /home/$USER/.umount.sh
fi
# Create the .mount.sh and .umount.sh scripts from users batch file
/usr/local/bin/mount.pl $USER
# Mount network shares when logging on.
/home/$USER/.mount.shScript mount.pl (guardar en /usr/local/bin/) — genera dinámicamente los scripts de montaje/desmontaje por usuario basado en su .bat de NETLOGON:
#!/usr/bin/perl
# Build dynamic ~user/.mount.sh based on logon.bat
$user = $ARGV[0];
$file = "/mnt/logonbat/$user.bat"; # <-- Change this from $user to the name of the batch script if you only use one.
die if ! $user;
die if ! -e $file;
open (PAM_CONF, ">/home/$user/.mount.sh");
open (LOGOFF, ">/home/$user/.umount.sh");
print PAM_CONF qq{#!/bin/sh
if [ ! -d /home/$user/Home ]; then
mkdir /home/$user/Home
fi
mount.cifs //server/$user /home/$user/Home -o username=$user,sec=krb5
};
print LOGOFF qq{#!/bin/sh
if [ "`cat /proc/mounts | grep /home/$user/Home | wc -l`" -ge "1" ]; then
umount.cifs /home/$user/Home
fi \n};
my(@arr)=`cat /mnt/logonbat/$user.bat`;
$mounts = parse_batfile(\@arr);
foreach $mount (@$mounts) {
chomp($mount);
($server,$share) = $mount =~ /\\\\(.*)\\(.*)/;
$share =~ tr/\cM//d;
$mnt = $share;
# skip AUDIT. It's for PCs only
next if $mnt =~ /AUDIT/;
# skip personal shares.
next if lc("$mnt") eq lc("$user");
next if ! $mnt;
#strip dollar sign from mount point
$mnt =~ s/\$$//;
# make sure mount point is unique
$mnt .= "-$server" if $seen{$mnt}++;
# upshift first letter of mnt point
$mnt =~ s/^(.)()(.*)/\u$1$2/g;
# print PAM_CONF "volume $user cifs $server $share /home/$user/$mnt - - -\n";
print PAM_CONF qq{if [ ! -d /home/$user/$mnt ]; then
mkdir /home/$user/$mnt
fi
mount.cifs //$server//$mnt /home/$user/$mnt -o username=$user,sec=krb5 \n};
print LOGOFF qq{if [ "`cat /proc/mounts | grep /home/$user/$mnt | wc -l`" -ge "1" ]; then
umount.cifs /home/$user/$mnt
fi \n};
}
close PAM_CONF;
close LOGOFF;
system ("chown $user:16777729 /home/$user/.mount.sh"); # 16777729 is my GID for "Domain Users"
system ("chown $user:16777729 /home/$user/.umount.sh"); # 16777729 is my GID for "Domain Users"
system ("chmod +x /home/$user/.mount.sh");
system ("chmod +x /home/$user/.umount.sh");
# All done
sub parse_batfile {
my($file) = @_;
my(@mounts);
foreach $line (@$file) {
(@val) = split / /,$line;
if (uc($val[0]) eq "NET" && uc($val[1]) eq "USE") {
push (@mounts,$val[3]);
}
if ($val[0] eq "CALL") {
my($match) = $val[1] =~ /\\\\.*\\NETLOGON\\(.*)/ ;
if ($match) {
chop($match);
my(@arr)=`cat /mnt/logonbat/$match`;
$mounts = parse_batfile(\@arr);
unshift @mounts, @$mounts;
}
}
}
return \@mounts;
}Ejemplo del contenido que genera .mount.sh para jdoe:
#!/bin/sh
if [ ! -d /home/jdoe/Home ]; then
mkdir /home/jdoe/Home
fi
mount.cifs //server/jdoe /home/jdoe/Home -o username=jdoe,sec=krb5
if [ ! -d /home/jdoe/common ]; then
mkdir /home/jdoe/common
fi
mount.cifs //server/common /home/jdoe/common -o username=jdoe,sec=krb5
if [ ! -d /home/jdoe/IT ]; then
mkdir /home/jdoe/IT
fi
mount.cifs //server/IT /home/jdoe/IT -o username=jdoe,sec=krb5 Una vez que tienes win_share.sh y mount.pl en /usr/local/bin, crea una entrada en “Startup Applications” para ejecutar win_share.sh al iniciar sesión (Preferencias > Aplicaciones al inicio).

Nota: configura la aplicación de inicio para ejecutarse en el contexto del usuario, no como root.
Quitar compartidos Windows al cerrar sesión
Para desmontar los compartidos cuando el usuario cierra sesión usé pam_script.so, un módulo PAM que permite ejecutar scripts en eventos de sesión. No usé pam_script para el inicio porque sus scripts se ejecutan como root y los scripts de montaje dependen de la variable $USER.
Instala libpam-script (ajusta nombre y versión según tu repositorio):
sudo dpkg -i libpam-script_1.1.4-1_i386.debEjemplo de .umount.sh (generado por mount.pl para jdoe):
#!/bin/sh
if [ "`cat /proc/mounts | grep /home/jdoe/Home | wc -l`" -ge "1" ]; then
umount.cifs /home/jdoe/Home
fi
if [ "`cat /proc/mounts | grep /home/jdoe/common | wc -l`" -ge "1" ]; then
umount.cifs /home/jdoe/common
fi
if [ "`cat /proc/mounts | grep /home/jdoe/IT | wc -l`" -ge "1" ]; then
umount.cifs /home/jdoe/IT
fi Crea y edita /usr/share/libpam-script/pam_script_ses_close con el siguiente contenido:
#!/bin/sh
# pam_script_ses_close script to remove windows shares
/home/$PAM_USER/.umount.sh 2>&1 >> /var/log/umount.logAñade la siguiente línea a /etc/pam.d/common-session:
session optional pam_script.soPrueba el cierre de sesión y revisa /var/log/umount.log para verificar que los desmontajes se realizaron correctamente.
SSH sin contraseña con Kerberos
Si tu servidor y estación de trabajo Linux están en el dominio con Kerberos configurado correctamente, puedes habilitar login por SSH sin contraseña usando GSSAPI.
En thinserver, edita /etc/ssh/sshd_config y añade/ajusta:
# GSSAPI options
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes
UseDNS yesEn la estación de trabajo, edita /etc/ssh/ssh_config y añade/ajusta:
GSSAPIAuthentication yes
GSSAPIDelegateCredentials yesPrueba la conexión desde la estación de trabajo con depuración:
ssh -v thinserverSi Kerberos funciona verás mensajes como:
*debug1: Next authentication method: gssapi-keyex
debug1: No valid Key exchange context
debug1: Next authentication method: gssapi-with-mic
debug1: Delegating credentials
debug1: Delegating credentials
debug1: Authentication succeeded (gssapi-with-mic).*Important: Asegúrate de que la hora entre controlador de dominio, servidor y estaciones esté sincronizada (NTP). Kerberos falla con desajustes de tiempo.
Problemas comunes y soluciones
Estos son problemas reales que encontré y las soluciones aplicadas. Úsalos como referencia rápida.
PROBLEMA: LTSP client authenticates but logs out immediately SOLUCIÓN: gconftool-2 –direct –config-source xml:readwrite:/etc/gconf/gconf.xml.mandatory –type string –set /desktop/gnome/session/required_components/windowmanager metacity
PROBLEMA: No VNC on thin clients SOLUCIÓN: http://bootpolish.net/home_ltsp_installx11vnconltsp5
PROBLEMA: Cambiar la pantalla de login por una personalizada SOLUCIÓN: https://help.ubuntu.com/community/EdubuntuFAQ
PROBLEMA: Configurar contraseña de root en cliente ligero SOLUCIÓN: https://help.ubuntu.com/community/EdubuntuFAQ
PROBLEMA: No aparece el icono de logout SOLUCIÓN: http://ubuntuforums.org/archive/index.php/t-815188.html
Checklist de despliegue para administradores (rol: sysadmin)
- Preparación del servidor:
- Verificar conectividad DHCP/TFTP/HTTP entre PXE y servidor
- Comprobar rutas de root-path y permisos en /opt/ltsp
- Sincronizar hora (NTP)
- Revisar kerberos/krb5.conf y registros
- Scripts y fstab:
- Colocar mount.pl y win_share.sh en /usr/local/bin con permisos 755
- Añadir línea del NETLOGON en /etc/fstab y ejecutar mount -a
- Seguridad:
- Evitar dejar credenciales en texto plano; usar tickets Kerberos cuando sea posible
- Restringir cuenta usada para listar NETLOGON
- Pruebas de aceptación:
- Cliente ligero arranca por PXE y carga entorno LTSP
- Usuario inicia sesión y se montan los compartidos definidos en su .bat
- Al cerrar sesión, los recursos se desmontan y no quedan mounts residuales
- SSH auth GSSAPI funcionando desde estación
Mini playbook: desplegar ajustes por defecto a todos los usuarios
- Preparar usuario plantilla (ej: “template”) y personalizar el escritorio.
- Copiar .config, .gconf, .icons, .local y .themes de /home/template a /etc/skel.
- Verificar permisos y propiedad en /etc/skel.
- Reiniciar servicio de gestión de usuarios o crear nuevo usuario de prueba para verificar herencia.
- Documentar cambios y versionar /etc/skel en control de configuración.
Criterios de aceptación y pruebas (KPI cualitativos)
- Arranque PXE: clientes ligeros obtienen IP y TFTP sirve pxelinux.0
- Montajes: al iniciar sesión, los directorios /home/
/{Home,common,IT,…} están montados y accesibles - Desmontaje: tras cerrar sesión, no existen entradas CIFS en /proc/mounts para esos puntos
- SSH: iniciar sesión por SSH desde una estación con Kerberos no solicita contraseña
Seguridad y privacidad
- Evita almacenar contraseñas en /etc/fstab en texto claro; en su lugar usa credenciales de máquina o tickets Kerberos.
- Limita el alcance de la cuenta “public” utilizada para listar NETLOGON. Usa permisos mínimos.
- Revisa logs regularmente (/var/log/auth.log, /var/log/umount.log) y aplica rotación de logs.
- GDPR/privacidad: si compartes carpetas con datos personales asegúrate de documentar retención y accesos; aplica controles y auditoría.
Alternativas y cuándo no usar este método
- Si no tienes Kerberos en el dominio, deberás usar credenciales en fstab o soluciones de autenticación alternativas (SSHFS con claves, winbind con mount.cifs y credenciales seguras).
- Si los clientes son PCs completas (no thin clients), una solución basada en AD GPO (Windows) puede ser más apropiada.
Resumen
- Configura DHCP y rutas PXE correctamente para LTSP.
- Personaliza el escritorio y copia la plantilla a /etc/skel para aplicarlo globalmente.
- Usa mount.pl y win_share.sh para generar montajes dinámicos por usuario desde NETLOGON, aprovechando Kerberos para evitar contraseñas en tiempo de sesión.
- Usa pam_script para desmontar recursos al cerrar sesión.
- Habilita GSSAPI en SSH para acceso sin contraseña.
Notas: valida cada paso en un entorno de pruebas antes de aplicarlo en producción. Mantén respaldo de configuraciones y procedimientos de reversión.
Materiales similares
Podman en Debian 11: instalación y uso
Apt-pinning en Debian: guía práctica
OptiScaler: inyectar FSR 4 en casi cualquier juego
Dansguardian + Squid NTLM en Debian Etch
Arreglar error de instalación Android en SD