Hay muchos procesos dentro de la informática que parecen magia, por ejemplo, conectarse a Internet. "Mágicamente" al seleccionar una red y poner su clave, puedes navegar, ver un video o escuchar música desde algún "rincón" de Internet.

Para que estos procesos sean así de simples, hubo gente que se quebró la cabeza pensando y creando servicios y configuraciones para que el "usuario final" solamente vea que el mundo se abre frente a sus ojos.

Uno de estos servicios es el DHCP, que es capaz de asignar IP a una maquina que se conecta a la red. Con una configuración muy simple de DHCP podemos asignar IP a todos quienes lleguen a conectarse, pero, que pasa si quiero tener siempre las mismas IP dentro de casa, por ejemplo, para controlar el acceso de los notebook/computador de los niños a Internet en algunos horarios. Con DHCP puedo configurar personalizadamente la IP, los servidores de dominio y algunos otros detalles de cada equipo si lo deseo, de esta forma agregar filtros de contenido, entre otras cosas.

Instalando el servicio DHCP

Lo primero es como de costumbre en debian, actualizar la fuente de datos de los programas que se pueden instalar.

sudo apt update

Sugiero que si existen actualizaciones las apliquen sudo apt dist-upgrade -y, no es algo obligatorio, pero si sugerido fuertemente para asegurarse de estar con los últimos parches de seguridad.

Instalar el servidor de DHCP:

sudo apt install isc-dhcp-server -y

Instalar es solo la primer parte, de ahí hay que configurar el servicio para hacer lo que se desea, recomiendo no activar el servicio hasta tener hecha al menos la primer parte de la configuración.

Configurando lo básico

Lo primero es ir a revisar el archivo que nos crea de forma predeterminada la instalación. Este se encuentra en /etc/dhcp/dhcpd.conf. Se puede apreciar que trae muchas lineas comentadas, pero otras no, cuales son esas lineas:

option domain-name "example.org";
option domain-name-servers ns1.example.org, ns2.example.org;

default-lease-time 600;
max-lease-time 7200;

ddns-update-style none;

La primera es el "nombre de domino" de mi red local, en este caso es "example.org"". La segunda, los servidores de nombre (es decir, quien me dice a cual IP corresponde un nombre como "google.com"). La tercer linea indica el tiempo predeterminado que dura esta configuración entregada al equipo cliente(10 minutos), la siguiente el tiempo máximo de la concesión de la configuración (2 horas). La última linea nos indica el estilo en que se actualizará el servidor DNS Dinámico de nuestro cliente, en esta configuración, no lo utiliza.

Toquemos la configuración, a mi red le quiero dar el dominio ficticio o local de "alvear.home", quiero entregarle de forma predeterminada que resuelva con "filtro" de contenidos, por lo que usaré los DNS "Family protection servers AdGuard" (94.140.14.15 y 94.140.15.16 más detalles en: https://adguard-dns.io). Además deseo configurar la "red" en que vivirán mis equipos y cuál será el rango dinámico de las IP.

Mi red será 192.168.0.0/23, es decir, tendré 510 IP disponibles para asignar. Mi router (de movistar) tiene la IP estática 192.168.1.1, lo dejaré tal cual, solo debo tener el cuidado de decirle que él ya no entregará las IP y cambiar la "mascara de la subred" a 255.255.254.0 que es la mascara que corresponde a la red 192.168.0.0/23.

configuración del router

El rango de asignación dinámica de equipos de red, lo dejaré de 125 IP usando el último segmento de la red. No se si algún día habrán tantas visitas en mi departamento de 50 m², pero mejor que sobre a que falte.

Como he instalado en mi pequeño "servidor" la impresora, lo dejaré como servidor predeterminado de impresión. Agregaré también servidores de tiempo porque me agrada que mis equipos estén a la hora. Existen muchas opciones de configuración y quizás en tu red necesites alguna otra y alguna que yo tengo no, te dejo el link por si quieres revisar (https://kb.isc.org/docs/isc-dhcp-41-manual-pages-dhcp-options)

# nombre de mi red interna
option domain-name "alvear.home";

# servidores de Family protection servers AdGuard,
# en teoría filtran sitios de adultos y publicidad
option domain-name-servers 94.140.14.15, 94.140.15.16;

# bajo los tiempos de entrega del servicio, eso hará que
# busquen la configuración cada minuto, ideal si quiero cambiarla
# para que no puedan navegar en algún momento.
default-lease-time 60;
max-lease-time 90;

# Usando el estandar de dns dinámico
ddns-update-style standard;

# con el modo authoritative le indico que este servidor de DHCP es
# el que resuelve las direcciones IP, por lo que debe anunciarse como
# tal en la red enviando mensajes "DHCPNAK"
authoritative;

# indicando que usaremos los nombres declarativos de host
use-host-decl-names on;

# definición de mi red o "subred" 192.168.0.0/23
subnet 192.168.0.0 netmask 255.255.254.0 {

  # IP que repartirá entre las maquinas no conocidas
  range dynamic-bootp 192.168.1.129 192.168.1.254;
  
  # puerta de enlace o salida de la red
  option routers 192.168.1.1;
  
  # dirección del broadcast o ultima IP de la red
  option broadcast-address 192.168.1.255;
  
  # Servidores de tiempo
  option ntp-servers 1.cl.pool.ntp.org, ntp.shoa.cl, debian.pool.ntp.org;
  
  # Servidor de impresión
  option lpr-servers 192.168.0.1;
}

Finalmente, y algo no menor, hay que configurar la red del "servidor", sino, tendremos un lindo caos.

Primero, editamos /etc/default/isc-dhcp-server, en donde su contenido será en mi caso:

INTERFACESv4="enp3s0"

Porqué en mi caso, porque "enp3s0" es mi interfaz de red, en tu caso puede ser eth1 u otro dispositivo.

Siguiendo la misma lógica hay que editar el archivo /etc/network/interfaces para dejar nuestro servidor con una configuración estática. En mi caso el archivo es el siguiente:

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug enp3s0
#iface enp3s0 inet dhcp
#

iface enp3s0 inet static
        address 192.168.0.1/23
        gateway 192.168.1.1
        dns-nameservers 8.8.4.4 8.8.8.8
        dns-search alvear.home

Ahora sí, estamos listos para activar el servicio.

sudo systemctl enable isc-dhcp-server.service
sudo systemctl start isc-dhcp-server.service
sudo systemctl status isc-dhcp-server.service

Si todo les salio bien, la salida debería ser similar a este:

● isc-dhcp-server.service - LSB: DHCP server
     Loaded: loaded (/etc/init.d/isc-dhcp-server; generated)
     Active: active (running) since Wed 2024-03-20 20:23:27 -03; 47min ago
       Docs: man:systemd-sysv-generator(8)
    Process: 1395233 ExecStart=/etc/init.d/isc-dhcp-server start (code=exited, status=0/SUCCESS)
      Tasks: 1 (limit: 9339)
     Memory: 13.1M
        CPU: 2.191s
     CGroup: /system.slice/isc-dhcp-server.service
             └─1395246 /usr/sbin/dhcpd -4 -q -cf /etc/dhcp/dhcpd.conf enp3s0

mar 20 21:10:52 nuc dhcpd[1395246]: DHCPREQUEST for 192.168.0.255 from 78:2b:46:e8:9a:4f via enp3s0
mar 20 21:10:52 nuc dhcpd[1395246]: DHCPACK on 192.168.0.255 to 78:2b:46:e8:9a:4f via enp3s0
mar 20 21:10:54 nuc dhcpd[1395246]: DHCPREQUEST for 192.168.1.131 from e0:62:67:36:92:07 via enp3s0
mar 20 21:10:54 nuc dhcpd[1395246]: DHCPACK on 192.168.1.131 to e0:62:67:36:92:07 via enp3s0
mar 20 21:10:54 nuc dhcpd[1395246]: DHCPREQUEST for 192.168.1.129 from 00:e9:3a:db:6c:a5 via enp3s0
mar 20 21:10:54 nuc dhcpd[1395246]: DHCPACK on 192.168.1.129 to 00:e9:3a:db:6c:a5 via enp3s0

¿Y cómo les doy siempre la misma IP a mis equipos?

Este segundo paso no es menor y puede a la verdad ser bastante tedioso si tienes muchos equipos en casa, pues hay que ir tomando la mac-address de cada uno de ellos. La mac-address es como la huella digital única de cada dispositivo de red. (Se que se puede clonar y cambiar por software, pero en teoría es única).

En nuestro archivo /etc/dhcp/dhcpd.conf se pueden agregar al final de lo que hicimos, los host para cada máquina de una forma similar a:

host movistar { # hogar-net
  hardware ethernet e4:ab:89:ab:84:4e;
  fixed-address 192.168.1.1;
  option host-name "movistar";
  option dhcp-client-identifier "movistar";
}

y con eso van configurando equipo a equipo... pero, como les comenté en la entrada anterior, me gustan los script y pensé, la configuración es idéntica para cada equipo, con excepción de los valores, podría hacer una planilla csv y luego crear un archivo de configuración, entonces, en vez de agregar host a host, mejor creo un archivo de host y solamente lo incluyo dentro de /etc/dhcp/dhcpd.conf, así mi última linea es:

include "/etc/dhcp/host-home.conf";

el script "net-host-config.sh" que me crea el archivo de host es el siguiente:

#!/bin/bash

rm -f host-home.conf

for i in $(cat net.csv); do
  IP=$(echo $i|awk -F";" '{print $1}')
  ID=$(echo $i|awk -F";" '{print $2}')
  HW=$(echo $i|awk -F";" '{print $3}')
  HN=$(echo $i|awk -F";" '{print $4}')
  KIND=$(echo $i|awk -F";" '{print $5}')
  if [ "$IP" = 'IP' ]; then 
    echo "writing..."; 
  else
    echo -n "host $ID { # $KIND\n  hardware ethernet $HW;\n  fixed-address $IP;\n  option host-name \"$HN\";\n  option dhcp-client-identifier \"$ID\";\n}\n\n" >> host-home.conf
  fi
done

echo "restarting..."
systemctl restart isc-dhcp-server.service

echo "done."

La estructura del archivo "net.csv" que es la planilla de los dispositivos es esta, lo importante es el orden de las columnas y que esté bien escrito

IP;ID;HARDWARE;HOSTNAME;TIPO
192.168.0.120;lenovo-lan;b4:a9:fc:55:b6:73;laptop-Roy;laptop
192.168.0.121;lenovo-wifi;28:39:26:a9:59:81;laptop-Roy;laptop
192.168.0.122;hp-caro-lan;50:81:40:4a:93:53;laptop-Caro;laptop
192.168.0.123;hp-caro-wifi;00:e9:3a:db:6c:25;laptop-Caro;laptop
192.168.0.124;hp-jairo-lan;a0:d3:c1:ca:42:20;laptop-Jairo;laptop
192.168.0.125;hp-jairo-wifi;a4:db:30:aa:57:4a;laptop-Jairo;laptop
192.168.0.126;hp-vasti-lan;a0:1d:48:fc:30:d6;laptop-Vasti;laptop
192.168.0.127;hp-vasti-wifi;fc:f8:ae:5c:2d:39;laptop-Vasti;laptop
192.168.1.1;movistar;e4:ab:89:ab:84:4e;movistar;hogar-net
192.168.1.2;tenda;c8:3a:35:16:e3:71;tenda;hogar-net
192.168.1.3;MiWiFi-RC04;a4:a9:30:12:f0:f8;xiaomi-wifi;hogar-net
192.168.1.4;ESP_B6EBE3;a4:cf:12:ba:eb:e3;enchufe-1;hogar-enchufe
192.168.1.5;lumi-gateway-mgl03;54:ef:44:c8:45:d2;mi-gateway;hogar
192.168.1.6;google-home;00:f6:20:cb:2b:43;nest-home;hogar
192.168.1.7;chrome-cast;14:c1:4e:9b:cf:7a;tele;hogar
192.168.1.8;yeelink-vasti;44:23:7c:89:bf:33;luz-vasti;hogar-luz
192.168.1.9;yeelink-jairo;5c:e5:0c:82:1b:c5;luz-jairo;hogar-luz
192.168.1.10;philips-light-bulb_miio237741054;44:23:7c:b1:ea:fe;luz-puerta-1;hogar-luz
192.168.1.11;philips-light-bulb_miio237741345;44:23:7c:b1:fa:21;luz-puerta-2;hogar-luz
192.168.1.12;luz-papas1;d0:27:02:15:ad:de;luz-papas-1;hogar-luz
192.168.1.13;luz-papas2;d0:27:02:15:e7:d8;luz-papas-2;hogar-luz
192.168.1.14;lampara-caro;04:cf:8c:3c:a5:df;lampara-caro;hogar-luz

Obviamente acá deberían ir tus dispositivos.

Finalmente, aplicamos los comandos:

sudo su -
cd /etc/dhcp/
chmod +x net-host-config.sh
./net-host-config.sh
exit

Con eso, al cavo de un minuto ya deberían estar tus dispositivos con sus nuevas IP.

¿Cómo limito el trafico en alguna hora a algunos equipos?

Eso aun no lo he implementado, pero mi idea es simple. Dado a que le entregué "nombre" y "tipo" a las maquinas, modificar el archivo net-host-config.sh para que cree host "fuera del estandar", asignando por ejemplo, una puerta de enlace que no sea tal, algo así como:

#!/bin/bash

rm -f host-home.conf

for i in $(cat net.csv); do
  IP=$(echo $i|awk -F";" '{print $1}')
  ID=$(echo $i|awk -F";" '{print $2}')
  HW=$(echo $i|awk -F";" '{print $3}')
  HN=$(echo $i|awk -F";" '{print $4}')
  KIND=$(echo $i|awk -F";" '{print $5}')
  if [ "$IP" = 'IP' ]; then 
    echo "writing..."; 
  else
    TIPO=$(echo $KIND | cut -c1-6)
    if [ "${TIPO}" = 'laptop' ]; then
      echo -n "host $ID { # $KIND\n  hardware ethernet $HW;\n  fixed-address $IP;\n  option host-name \"$HN\";\n  option dhcp-client-identifier \"$ID\";\n  option routers 192.168.0.2;\n  }\n\n" >> host-home.conf
    else
      echo -n "host $ID { # $KIND\n  hardware ethernet $HW;\n  fixed-address $IP;\n  option host-name \"$HN\";\n  option dhcp-client-identifier \"$ID\";\n}\n\n" >> host-home.conf
    fi
  fi
done

echo "restarting..."
systemctl restart isc-dhcp-server.service

echo "done."

Para que todos los laptop tenga una puerta de enlace diferente. Claro está, es solo un bosquejo de la idea, pues aun eso no tiene un horario sino que es siempre.

Probablemente lo implemente en estos días, ya que comenzaron las clases, cuando lo tenga se los comparto.

Finalmente, por la configuración de firewall que hicimos en el post anterior (https://r.qo-op.cl/servidor-en-casa/), no necesitamos modificar nada, pues dimos una confianza total en nuestra red.

Éxito!