"Después del juego es antes del juego"
Sepp Herberger

domingo, 27 de julio de 2014

Configuracion NAT-DHCP para aulas mixtas de Linux-Windows

Un escenario con el que me encuentro frecuentemente es un aula en el que el ordenador del profesor tiene dos tarjetas de red. Con una de ellas tiene conexión con la red general y con la otra da conexión a una red privada con los ordenadores de los alumnos.

Para que esto funcione, el ordenador del profesor tiene que tener configurado el NAT y un servicio DHCP para ofrecer IP y conectividad a los ordenadores de los alumnos. La cosa se complica cuando tanto el ordenador de profesor como el de alumnos tienen arranque dual y queremos que todo funcione indistintamente tanto Windows como en Linux, independientemente de lo que tenga arrancado cada ordenador de la estancia.

El esquema que he usado es el siguiente:

  • En el profesor, el interfaz que conecta con la red del centro tiene configuración de red dinámica, recibe todo por DHCP, tanto en windows como en Linux.
  • En el profesor, el interfaz que conecta con la red privada del aula tiene configuracion IP fija, con IP 192.168.0.254, máscara 255.255.255.0 y el resto de parámetros sin definir.
  • Los ordenadores de los alumnos son fáciles de configurar: simplemente los dejamos que cojan la configuración de red por DHCP, tanto en Windows como en Linux y ya es suficiente. Recibirán direcciones fijas en función de su MAC en el rango 192.168.0.201-225 (son 25 pc). Debemos recopilar sus MACs en una lista antes de empezar la configuración.

En Linux es relativamente sencillo de conseguir que el ordenador del profesor haga estas tareas. Asumimos que eth0 es la tarjeta de red que conecta con el centro y eth1 la que conecta con la red privada del aula. El /etc/network/interfaces sería:

 # This file describes the network interfaces available on your system
 # and how to activate them. For more information, see interfaces(5).
 # The loopback network interface
 auto lo eth0 eth1
 iface lo inet loopback
 # The primary network interface
 iface eth0 inet dhcp
  ifup eth0
  post-up /sbin/ethtool -s $IFACE wol g
  post-down /sbin/ethtool -s $IFACE wol g
 #La interfaz secundaria
 iface eth1 inet static
     address 192.168.0.254
     netmask 255.255.255.0
     broadcast 192.168.0.255

Para habilitar el NAT tendriamos estos ficheros:

/etc/default/enable-nat

NETWORK_TO_NAT=192.168.0.0/24
OUTSIDE_IF=eth0

/etc/init.d/enable-nat

#! /bin/sh
### BEGIN INIT INFO
# Provides:          enable-nat
# Required-Start:    $remote_fs
# Should-Start:      $network $syslog
# Required-Stop:     $remote_fs
# Should-Stop:       $network $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Enabling NAT for clients behind eth1
# Description:       Enabling Network Address Translation for clients
#                    sitting in the thin client network behind eth1
### END INIT INFO

IPTABLES=/sbin/iptables

NETWORK_TO_NAT=
OUTSIDE_IF=eth0

# Only enable by default if LTSP is installed
if [ -e /opt/ltsp ] ; then
    NETWORK_TO_NAT="192.168.0.0/24"
fi

. /lib/lsb/init-functions

if [ -f /etc/default/enable-nat ] ; then
    . /etc/default/enable-nat
fi

# Bail out if no iptables binary or no configuration
[ -x ${IPTABLES} -a "$NETWORK_TO_NAT" ] || exit 0

do_status() {
    $IPTABLES -L -t nat |grep -A3 POSTROUTING
}

is_enabled() {
    if do_status | grep -q "$NETWORK_TO_NAT" ; then
    true
    else
    false
    fi
}

do_start() {
    if is_enabled ; then
    log_action_msg "NAT for clients on network $NETWORK_TO_NAT already enabled"
    else
    log_action_begin_msg "Enabling NAT for clients on network $NETWORK_TO_NAT."
    $IPTABLES -t nat -A POSTROUTING -s $NETWORK_TO_NAT -o $OUTSIDE_IF -j MASQUERADE
    log_action_end_msg $?
    fi

    # Enable IP-forwarding if it isn't enabled already.
    if [ 0 = "`cat /proc/sys/net/ipv4/ip_forward`" ]; then
    log_action_begin_msg "Enabling IPv4 forwarding."
    echo 1 > /proc/sys/net/ipv4/ip_forward
    log_action_end_msg $?
    fi
}

do_stop() {
    if is_enabled ; then
    log_action_begin_msg "Disabling NAT for clients on network $NETWORK_TO_NAT."
    $IPTABLES -F -t nat
    log_action_end_msg $?
    else
    log_action_msg "NAT for clients on network $NETWORK_TO_NAT already disabled"
    fi
}

case "$1" in
    start)
        do_start
        ;;
    stop)
        do_stop
        ;;
    restart|force-reload)
        do_stop
        do_start
        ;;
    status)
        do_status
        ;;
    *)
        echo "Usage: $0 {start|stop|restart|force-reload|status}"
        exit 2
        ;;
esac
exit 0

Debemos configurar el servicio enable-nat para que se ejecute en el arranque, tal como nos cuenta Esteban en su blog:

/usr/sbin/update-rc.d enable-nat defaults

Una vez configurado el NAT debemos configurar el DHCP privado del aula. Instalamos paquete isc-dhcp-server y retocamos los siguientes ficheros:

/etc/default/isc-dhcp-server

# Defaults for dhcp initscript
# sourced by /etc/init.d/dhcp
# installed at /etc/default/isc-dhcp-server by the maintainer scripts

#
# This is a POSIX shell fragment
#

# On what interfaces should the DHCP server (dhcpd) serve DHCP requests?
#    Separate multiple interfaces with spaces, e.g. "eth0 eth1".
INTERFACES="eth1"

/etc/dhcp/dhcpd.conf

shared-network redaula03 {
#Definimos el DNS de nuestra red principal, el dominio de nuestra red principal y dejamos configurado el PXE por si queremos montar
#mas adelante un servidor PXE en la red del aula.
     subnet 192.168.0.0 netmask 255.255.255.0 {
        option routers 192.168.0.254;
        option subnet-mask 255.255.255.0;
        option broadcast-address 192.168.0.255;
        option domain-name-servers 172.19.231.3;
                option domain-name "vguadalupe";
        option netbios-name-servers 172.19.231.3;
                # TFPT server for PXE boot
                next-server 192.168.0.254;
                server-name "A03-PRO";
                filename "pxelinux.0";

     # Configuramos los equipos con IP fija, asociando cada MAC y nombre de PC de alumno a una IP concreta dentro del aula, para facilitar
     # las tareas de administracion.
     group {

    host A03-O01 {
        option host-name "A03-O01";
        hardware ethernet 00:14:2A:96:51:65;
        fixed-address 192.168.0.201;
        }

        ...aqui mas equipos...

    host A03-O20 {
        option host-name "A03-O20";
        hardware ethernet 00:14:2A:98:E6:56;
        fixed-address 192.168.0.220;

         }

     } #fin group
  } #fin subnet
}

Reiniciamos el servicio DHCP con:

/etc/init.d/isc-dhcp-server restart

Hablemos ahora de como configurar todo lo anterior en el Windows del ordenador del profesor. Podemos tener la tentación de configurar la conexión compartida a Internet (ICS), que incluye NAT y DHCP todo-en-uno. Craso error. Pese a ser muy cómoda, nos encontraremos con que no podemos configurar nada del servidor DHCP: ni las direcciones, ni el dominio, ni ningún otro parámetro de red que queramos enviar a los clientes.  Por ejemplo, los equipos de los alumnos recibirán IP aleatorias y el dominio de búsqueda sera mshome.net, lo cual nos traerá problemas para que resuelvan IP del centro. Es el precio de hacerlo todo en un par de clicks.

Vamos a ver como configurarlo todo manualmente para que se comporte exactamente igual a como lo hace en el Linux. Primero, configuramos a mano la IP fija de la tarjeta de red interna del aula (192.168.0.254 con máscara de red 255.255.255.0). Después tenemos que configurar el DHCP, pero el servidor DHCP de Windows no nos sirve porque no es nada configurable. Usaremos uno de terceros muy sencillito y la vez potente::

Lo descargamos de http://dhcpserver.sourceforge.net/.

Una vez descargados lo instalamos y durante la instalación decimos que se ejecute como un servicio de Windows. Una vez instalado desde Inicio->Programas->Open DHCP Server accederemos al manual, la configuración y los logs. La configuracion es simplemente rellenar un fichero de texto con el siguiente contenido:

[LISTEN_ON]
#Specify the Interfaces you would like Server to listen
192.168.0.254

[LOGGING]
LogLevel=Normal

[REPLICATION_SERVERS]
;Primary=192.168.0.253
;Secondary=192.168.0.254

[HTTP_INTERFACE]
#This is http inerface for viewing lease status,
#Default is first interface, port 6789

[RANGE_SET]
DHCPRange=192.168.0.1-192.168.0.200
SubnetMask=255.255.255.0
DomainServer=172.19.231.3
Router=192.168.0.254

[GLOBAL_OPTIONS]

DomainName="vguadalupe"
SubNetMask=255.255.255.0
#Servidor DNS del centro.
DomainServer=172.19.231.3
Router=192.168.0.254
AddressTime=36000
RenewalTime=0
RebindingTime=0
NextServer=192.168.0.254

[00:14:2A:96:51:65]
IP=192.168.0.201
HostName="A03-O01"

...aqui el resto de equipos...

[00:14:2A:98:E6:56]
IP=192.168.0.220
HostName="A03-O20"

Por último, debemos configurar el NAT en Windows a mano. Esto no es tan obvio, pero buscando en Internet encontré esta excelente guía. Los pasos son:

  1. Cambiar los nombres de los interfaces de red  a “INTERNET-NIC” (el que conecta el ordenador del profesor con la red del centro) y “LAN-NIC” (el que conecta el ordenador del profesor con la red privada del aula), para mayor comodidad y poder identificarlos bien en pasos posteriores. Eso se hace desde Conexiones de red, seleccionando la conexión a cambiar y cambiando el nombre con el menú contextual que aparece al pulsar con el botón derecho.
  2. Con regedit ir a HKEYLOCALMACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters y cambiar la clave "IP Enable Router" a 1 desde su valor actual, que será 0.
  3. Entrar en Panel de Control->Herramientas Administrativas->Servicios y poner el servicio “Enrutamiento y acceso remoto” en Auto. Reiniciar windows.
  4. Crear un fichero .bat desde el bloc de notas con el siguiente contenido:
net stop remoteaccess
netsh routing ip nat install
netsh routing ip nat add interface "INTERNET-NIC" full
netsh routing ip nat add interface "LAN-NIC" private
net start remoteaccess

Por ultimo, ejecutaríamos el .bat creado en el paso anterior y reiniciaríamos sistema

Y ya está. Ya tenemos un servidor de aula que sirve IP y hace NAT de forma igual indistintamente de que lo tengamos arrancado con Linux o con Windows. Los PC de los alumnos recibirán la misma configuración de red siempre, ya estén arrancados con Windows o con Linux.

Hasta la próxima, que creo que irá de programación.

3 comentarios:

  1. ¿Por qué no encuentro lo mismo para windows 10 sin usar virtualización ?
    https://4sysops.com/archives/native-nat-in-windows-10-hyper-v-using-a-nat-virtual-switch/

    ResponderEliminar
    Respuestas
    1. En ese enlace se crea un "switch virtual", no tiene nada que ver con virtualizar el Windows usando Virtualbox

      Eliminar
  2. Este comentario ha sido eliminado por el autor.

    ResponderEliminar