Servidor DHCP en un entorno de máquinas Vagrant
DHCP es un protocolo que permite administrar y gestionar automáticamente las redes TCP/IP mediante el uso de un software en un servidor. Las siglas corresponden a Dynamic Host Configuration Protocol y ofrecen mediante un conjunto de reglas configuraciones de red como dirección IP, máscara de red, servidor DNS, puerta de enlace…
Este servicio se mantiene a la escucha de peticiones broadcast (a toda la red) pues, cuando un cliente pide una dirección IP por DHCP, no sabe en qué dirección IP se encuentra el servidor. Si el servidor DHCP está correctamente configurado, la petición sería oída y este servicio respondería con una dirección IP y, de manera opcional, con información adicional sobre otras configuraciones como las antes mencionadas.
La explicación de cómo funciona un servidor DHCP es más extensa en los apuntes ¿Cómo funciona el servidor DHCP? de José Domingo Muñoz.
Escenario de Vagrant
El objetivo es crear un escenario ficticio con máquinas virtuales Vagrant que permitan configurar una red de hasta tres equipos: un servidor y dos clientes. Durante esta configuración se realizarán los ajustes básicos para la concesión de direcciones IP a través del servidor DHCP instalado en un equipo con Debian Jessie.
Este es el fichero de configuración del escenario montado sobre Vagrant. En él se define los nombres de las máquinas virtuales así como las configuraciones de red.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# -*- mode: ruby -*- # vi: set ft=ruby : Vagrant.configure("2") do |config| config.vm.define :servidor do |servidor| servidor.vm.box = "jessie64" servidor.vm.hostname = "servidor" servidor.vm.network :public_network,:bridge=>"eth0" servidor.vm.network :private_network, ip: "192.168.100.1", virtualbox__intnet: "interna" end config.vm.define :cliente1 do |cliente1| cliente1.vm.box = "jessie64" cliente1.vm.hostname = "cliente1" cliente1.vm.network :private_network, type:"dhcp", virtualbox__intnet: "interna" end config.vm.define :cliente2 do |cliente2| cliente2.vm.box = "jessie64" cliente2.vm.hostname = "cliente2" cliente2.vm.network :private_network, type:"dhcp", virtualbox__intnet: "interna" end end |
Actualizamos los repositorios y los sistemas de todas las máquinas Vagrant con apt-get update && apt-get upgrade
En los clientes (cliente1 y cliente2) ejecutamos ip r
. Observamos la ruta por defecto creada en la eth0, la cual tenemos que borrar y podemos hacerlo con ip r del default
Esto impedirá que estas máquinas tengan acceso directo a internet.
Igualmente en la máquina que actuará como servidor DHCP debemos ejecutar ip r del default
para borrar la ruta por defecto en el servidor. Además, ejecutamos ip r add default via 172.22.0.1 dev eth1
y ip r default via 172.22.0.1
para encaminar el tráfico por la eth1.
Configuración del servidor DHCP en Debian Jessie
El primer paso será comprobar que nuestra máquina Vagrant ha recibido correctamente la configuración referente a la red, por ello ejecutamos ifconfig
. El siguiente paso es instalar un servidor DHCP en nuestra máquina con la instrucción apt-get install isc-dhcp-server
Este servidor DHCP ha de ser configurado para servir la configuración por la interfaz en la que hemos creado nuestra red privada. Por defecto lo hace por la eth0, pero en este caso se trata de la interfaz de red eth2 que posee la dirección IP 192.168.100.1.
Al final del fichero /etc/default/isc-dhcp-server establecemos el valor eth2 en el parámetro INTERFACES=»»
1 2 3 4 5 6 7 8 9 10 11 |
(...) # Path to dhcpd's PID file (default: /var/run/dhcpd.pid). #DHCPD_PID=/var/run/dhcpd.pid # Additional options to start dhcpd with. # Don't use options -cf or -pf here; use DHCPD_CONF/ DHCPD_PID instead #OPTIONS="" # On what interfaces should the DHCP server (dhcpd) serve DHCP requests? # Separate multiple interfaces with spaces, e.g. "eth0 eth1". INTERFACES="eth2" |
El fichero de configuración principal de DHCP está ubicado en /etc/dhcp/dhcpd.conf. En él estableceremos las configuraciones deseadas para nuestro servidor DHCP, por lo que hacemos una copia de respaldo con cp /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.bk
que también puede servirnos para consultar nuevas configuraciones.
Editamos el fichero original para configurar parámetros como el tiempo de concesión, el tipo de log o las configuraciones aplicadas a las subredes.
option routers indicará la puerta de enlace por defecto, option domain-name-servers el servidor DNS que tendrá las máquinas clientes y option broadcast-address la dirección de broadcast.
Mientras, dentro de subnet ponemos la configuración DHCP que recibirá los clientes así como el rango de direcciones IP que el servidor DHCP. Los parámetros anteriores pueden especificarse dentro de la subnet para aplicarse únicamente a esa subnet, o fuera de ella para todas las redes.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
default-lease-time 60; max-lease-time 7200; authoritative; log-facility local7; option routers 192.168.100.1; option domain-name-servers 192.168.102.2; option broadcast-address 192.168.100.255; subnet 192.168.100.0 netmask 255.255.255.0 { range 192.168.100.10 192.168.100.254; } |
Activar el bit de forwarding y añadir regla de iptables para hacer NAT
Igualmente, para realizar NAT y que la red interna tenga conexión con internet a través del servidor DHCP, debemos activar en la máquina servidor el bit de forwarding con echo 1 > /proc/sys/net/ipv4/ip_forward
para activar el reenvío de paquetes.
La configuración de este fichero se perderá al reinicio de la máquina, si queremos que sea persistente debemos descomentar la línea #net.ipv4.ip_forward=1 del fichero /etc/sysctl.conf
También es necesario añadir una regla de iptables para que el tráfico llegado a través de la red 192.168.100.0 se encamine por la interfaz de red eth1, que es la que conecta con internet: iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o eth1 -j MASQUERADE
Crear una reserva de dirección IP
En un servidor DHCP es posible crear una reserva de dirección IP para que siempre sea asignada a una misma tarjeta de red o dirección física (MAC). Por eso, lo correcto no es decir que se le asigna a una máquina, si no a una interfaz ya que si cambiamos la dirección MAC de ésta, será asignada otra dirección IP distinta.
Lo primero es conocer qué MAC tiene el equipo cliente, para ello podemos consultar el fichero /var/lib/dhcp/dhcpd.leases del servidor o ejecutar ifconfig
en el mismo cliente.
Esta reserva la realizamos añadiendo el siguiente fragmento al fichero de configuración del servidor DHCP. Igualmente, pueden establecerse otros tipos de configuraciones como la dirección de broadcast, la puerta de enlace o el servidor DNS que serán enviadas al cliente DHCP.
1 2 3 4 |
host cliente1 { hardware ethernet 08:00:27:e0:8b:ee; fixed-address 192.168.100.5; } |
En el código anterior se ha reservado la dirección IP 192.168.100.5 a la dirección MAC 08:00:27:e0:8b:ee. La dirección IP concedida puede estar fuera del rango de direcciones IP que concede del servidor DHCP.
Uso de varios ámbitos DHCP
Un ámbito es una configuración que permite asignar ajustes diferentes a una subred de equipos que reciben configuración por el protocolo DHCP. En él se pueden establecer las configuraciones anteriores para que se apliquen únicamente a esa subred.
De esta manera, es posible asignar un rango específico de direcciones IP u otras configuraciones al igual que en las reservas de direcciones IP como tiempo de concesión, dirección de la puerta de enlace, etc.
Antes es necesario realizar cambios en nuestro escenario editando el fichero Vagrantfile. Debemos añadir una nueva interfaz al servidor, donde se conectará a otra red llamada local y a la cual ahora pertenecerá cliente2.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# -*- mode: ruby -*- # vi: set ft=ruby : Vagrant.configure("2") do |config| config.vm.define :servidor do |servidor| servidor.vm.box = "jessie64" servidor.vm.hostname = "servidor" servidor.vm.network :public_network,:bridge=>"eth0" servidor.vm.network :private_network, ip: "192.168.100.1", virtualbox__intnet: "interna" servidor.vm.network :private_network, ip: "192.168.200.1", virtualbox__intnet: "local" end config.vm.define :cliente1 do |cliente1| cliente1.vm.box = "jessie64" cliente1.vm.hostname = "cliente1" cliente1.vm.network :private_network, type:"dhcp", virtualbox__intnet: "interna" end config.vm.define :cliente2 do |cliente2| cliente2.vm.box = "jessie64" cliente2.vm.hostname = "cliente2" cliente2.vm.network :private_network, type:"dhcp", virtualbox__intnet: "local" end end |
Con esta configuración, el equipo servidor estará conectado a dos redes: interna con conexión a cliente1 y local con conexión a cliente2.
Configuración del servidor DHCP para varios ámbitos
Realizamos un ifconfig
en el servidor DHCP, para comprobar que la nueva tarjeta de red ha sido añadida correctamente. En este caso la interfaz es la eth3, por lo que debemos añadir su uso en el fichero /etc/default/isc-dhcp-server modificando INTERFACES="eth2"
por INTERFACES="eth2 eth3"
En el fichero /etc/dhcp/dhcpd.conf hacemos la definición de la nueva subred, añadiéndole los parámetros de configuración y modificando el tiempo de concesión, que será 24 horas.
Por ello, añadimos el siguiente fragmento bajo nuestra configuración y reiniciamos el servicio DHCP.
1 2 3 4 5 |
subnet 192.168.200.0 netmask 255.255.255.0 { max-lease-time 86400; option routers 192.168.200.1; range 192.168.200.5 192.168.200.254; } |
Desde los clientes, realizamos un ifconfig
para comprobar que han recibido las direcciones IP a través del servidor DHCP.
Por último, para que la red 192.168.200.0/24 también tenga acceso a internet a través del servidor, debemos añadir una regla de iptables de la misma forma que para la red 192.168.100.0/24. En este caso sería iptables -t nat -A POSTROUTING -s 192.168.200.0/24 -o eth1 -j MASQUERADE
Para la gestión de los clientes podemos utilizar dhclient -r
que reniega la concesión realiza por el servidor DHCP (quedando el cliente sin configuración de red) o dhclient interfaz
solicitamos configuración mediante DHCP para la interfaz elegida.