Práctica 3: Configuración de servicios DHCP, NAT y DNS#

Equipo AMJ-GAB-TPKL

  • Alanis Martínez Jennifer
  • González Arreguín Bryan
  • Torres Partida Karen Larissa

Topología#

Topología

Es una topología tipo estrella donde tenemos conectadas 3 computadores virtuales y una Computadora Física a un switch representado por la Red Host-Only #2 configurada en tareas anteriores, además la máquina virtual Debian tiene como trabajo ser el servidor DHCP y este está conectado a su vez a un router el cual es representado por la red NAT 10.0.2.0 y el router conectado a internet.

La configuración de las redes de Virtual Box se encuentra aquí.

La configuración de todas la máquinas virtuales se encuentra aquí.

Procedimiento de NAT#

Primero configuramos dentro de VirtualBox al adaptador Host-Only ethernet #2 creado en tareas anteriores, haciendo que el servidor DHCP esté deshabilitado.

Configuración del Adaptador Host-Only

Luego ya dentro de la máquina virtual Debian se instalaron las utilerías de red con los siguientes comandos:

    apt -q update
    apt -qy install net-tools

Después se revisaron que interfaces de red se tenían con el siguiente comando:

    ip addr

Dando como resultado:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

       valid_lft forever preferred_lft forever

    inet6 ::1/128 scope host 

       valid_lft forever preferred_lft forever

2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000

    link/ether 08:00:27:ec:2a:15 brd ff:ff:ff:ff:ff:ff

    inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic enp0s3

       valid_lft 83000sec preferred_lft 83000sec

    inet6 fe80::a00:27ff:feec:2a15/64 scope link 

       valid_lft forever preferred_lft forever

3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000

    link/ether 08:00:27:ed:93:80 brd ff:ff:ff:ff:ff:ff

    inet 192.168.57.254/24 brd 192.168.57.255 scope global enp0s8

       valid_lft forever preferred_lft forever

    inet6 fe80::a00:27ff:feed:9380/64 scope link 

       valid_lft forever preferred_lft forever

Así podemos identificar que la interfaz host only es la enp0s8 y la interfaz nat es la enp0s3.

Ya con eso configuramos una ip estática para enp0s8 dentro del archivo /etc/network/interfaces, agregando en él las siguientes líneas:

# Interfaz host-only
auto enp0s8
allow-hotplug enp0s8
iface enp0s8 inet static
  network 192.168.57.0
  address 192.168.57.254
  netmask 255.255.255.0
  broadcast 192.168.57.255

# Interfaz Nat
auto enp0s3
allow-hotplug enp0s3
iface enp0s3 inet dhcp

Y con ello dando como resultado el siguiente archivo.

Luego configuramos el sysctl para habilitar de manera persistente la funcionalidad de IP forward en el kernel, esto se lleva a cabo modificando al archivo /etc/sysctl.conf solo descomentando la siguiente línea:

    net.ipv4.ip_forward = 1

Quedando así el siguiente archivo, después ya solo reiniciamos la configuración de sysctl con el siguiente comando:

    sysctl -p

La salida en terminal de este comando fue la siguiente:

root@dtanatos01:~# sysctl -p
net.ipv4.ip_forward = 1

Ahora debemos configurar iptables, primero instalamos lo necesario con el siguiente comando:

    apt install iptables-persistent

Después revisamos que no haya reglas existentes con el siguiente comando:

    iptables -n -L

Luego habilitamos la regla en la tabla nat con el siguiente comando:

    iptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE

Y por último indicamos que el tráfico puede entrar por Host-Only (enp0s8) y salir por NAT (enp0s3) y viceversa con los siguientes comandos:

    iptables -A FORWARD -i enp0s8 -o enp0s3 -j ACCEPT
    iptables -A FORWARD -i enp0s3 -o enp0s8 -m state --state ESTABLISHED,RELATED -j ACCEPT

Ya con eso verificamos las reglas que tenemos configuradas con el siguiente comando:

    iptables-save

en terminal dio lo siguiente:

root@dtanatos01:~# iptables-save
# Generated by iptables-save v1.8.7 on Fri May  6 13:30:55 2022
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A FORWARD -i enp0s8 -o enp0s3 -j ACCEPT
-A FORWARD -i enp0s3 -o enp0s8 -m state --state RELATED,ESTABLISHED -j ACCEPT
COMMIT
# Completed on Fri May  6 13:30:55 2022
# Generated by iptables-save v1.8.7 on Fri May  6 13:30:55 2022
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -o enp0s3 -j MASQUERADE
COMMIT
# Completed on Fri May  6 13:30:55 2022

Y por último las guardamos de manera persistente con el siguiente comando:

    service netfilter-persistent save

en terminal dio lo siguiente:

root@dtanatos01:~# service netfilter-persistent save
Saving netfilter rules...run-parts: executing /usr/share/netfilter-persistent/plugins.d/15-ip4tables save
run-parts: executing /usr/share/netfilter-persistent/plugins.d/25-ip6tables save
done.

Se adjuntó el archivo rules.v4

Procedimiento de forwarder DNS#

Este procedimiento se sigue haciendo dentro de la máquina virtual Debian.

Primero configuramos el dnsmasq, para ello tenemos que instalar lo siguiente:

    apt -qy install dnsmasq

Luego creamos una copia del archivo original dnsmasq.conf creado al instalar lo anterior, con el siguiente comando:

    cp -v /etc/dnsmasq.conf ~/dnsmasq.conf.orig

Y ahora modificamos las siguientes líneas en ese archivo:

Nota: Nosotros usamos 192.168.57.Y en las direcciones pues nuestro adaptador Host-Only tiene esa IP.

# https://linux.die.net/man/8/dnsmasq

# Archivo que contiene las reglas para resolver DNS
# El archivo puede tener cualquier nombre
resolv-file=/etc/resolv-upstream.conf

# Asigna una dirección IP a un nombre DNS arbitrario
address=/gateway.local/192.168.57.254
address=/dns.local/192.168.57.254

# Especificar la red por donde escuchará
# Al ser un DNS local será la interfaz interna
interface=eth0
bind-interfaces

Quedando así el siguiente archivo.

Luego creamos el archivo /etc/resolv-upstream.conf con las siguientes líneas:

# https://linux.die.net/man/5/resolv.conf
# dnsmasq envía las consultas DNS a los servidores externos
nameserver  1.1.1.1
nameserver  8.8.8.8
nameserver  9.9.9.9

Quedando así el siguiente archivo.

Luego reiniciamos y verificamos el servicio de red con los siguientes comandos:

    systemctl restart dnsmasq
    systemctl status dnsmasq

Ahora debemos configurar la resolución local de DNS, para ello debemos modificar el archivo /etc/resolv.conf cambiando la IP del nameserver por 127.0.0.1, dando así el siguiente archivo.

Y por último verificamos la resolución de DNS con los siguientes comandos:

Resolver usando el servidor DNS local

    dig example.com. @127.0.0.

    dig gateway.local. @127.0.0.1

Salida en terminal:

bryandt01@dtanatos01:~$ dig example.com. @127.0.0.1

; <<>> DiG 9.16.27-Debian <<>> example.com. @127.0.0.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 32111
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;example.com.           IN  A

;; ANSWER SECTION:
example.com.        20806   IN  A   93.184.216.34

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Fri May 06 14:12:31 CDT 2022
;; MSG SIZE  rcvd: 56

bryandt01@dtanatos01:~$ dig gateway.local @127.0.0.1

; <<>> DiG 9.16.27-Debian <<>> gateway.local @127.0.0.1
;; global options: +cmd
;; Got answer:
;; WARNING: .local is reserved for Multicast DNS
;; You are currently testing what happens when an mDNS query is leaked to DNS
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 6321
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;gateway.local.         IN  A

;; ANSWER SECTION:
gateway.local.      0   IN  A   192.168.57.254

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Fri May 06 14:12:35 CDT 2022
;; MSG SIZE  rcvd: 58

Resolver usando algunos de los servidores DNS listados en el archivo resolv-upstream.conf

    dig example.com. @1.1.1.1

    dig gateway.local. @1.1.1.1

Salida en terminal:

bryandt01@dtanatos01:~$ dig example.com. @1.1.1.1

; <<>> DiG 9.16.27-Debian <<>> example.com. @1.1.1.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 64227
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;example.com.           IN  A

;; ANSWER SECTION:
example.com.        75621   IN  A   93.184.216.34

;; Query time: 43 msec
;; SERVER: 1.1.1.1#53(1.1.1.1)
;; WHEN: Fri May 06 14:13:01 CDT 2022
;; MSG SIZE  rcvd: 56

bryandt01@dtanatos01:~$ dig gateway.local @1.1.1.1

; <<>> DiG 9.16.27-Debian <<>> gateway.local @1.1.1.1
;; global options: +cmd
;; Got answer:
;; WARNING: .local is reserved for Multicast DNS
;; You are currently testing what happens when an mDNS query is leaked to DNS
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 54299
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;gateway.local.         IN  A

;; AUTHORITY SECTION:
.           86400   IN  SOA a.root-servers.net. nstld.verisign-grs.com. 2022050601 1800 900 604800 86400

;; Query time: 43 msec
;; SERVER: 1.1.1.1#53(1.1.1.1)
;; WHEN: Fri May 06 14:13:08 CDT 2022
;; MSG SIZE  rcvd: 117
bryandt01@dtanatos01:~$ dig example.com. @8.8.8.8

; <<>> DiG 9.16.27-Debian <<>> example.com. @8.8.8.8
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12708
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;example.com.           IN  A

;; ANSWER SECTION:
example.com.        14002   IN  A   93.184.216.34

;; Query time: 11 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Fri May 06 14:14:47 CDT 2022
;; MSG SIZE  rcvd: 56

bryandt01@dtanatos01:~$ dig gateway.local @8.8.8.8

; <<>> DiG 9.16.27-Debian <<>> gateway.local @8.8.8.8
;; global options: +cmd
;; Got answer:
;; WARNING: .local is reserved for Multicast DNS
;; You are currently testing what happens when an mDNS query is leaked to DNS
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 1150
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;gateway.local.         IN  A

;; AUTHORITY SECTION:
.           86377   IN  SOA a.root-servers.net. nstld.verisign-grs.com. 2022050601 1800 900 604800 86400

;; Query time: 35 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Fri May 06 14:14:57 CDT 2022
;; MSG SIZE  rcvd: 117

bryandt01@dtanatos01:~$ dig example.com. @9.9.9.9

; <<>> DiG 9.16.27-Debian <<>> example.com. @9.9.9.9
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 11517
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;example.com.           IN  A

;; ANSWER SECTION:
example.com.        43200   IN  A   93.184.216.34

;; Query time: 75 msec
;; SERVER: 9.9.9.9#53(9.9.9.9)
;; WHEN: Fri May 06 14:15:07 CDT 2022
;; MSG SIZE  rcvd: 56

bryandt01@dtanatos01:~$ dig gateway.local @9.9.9.9

; <<>> DiG 9.16.27-Debian <<>> gateway.local @9.9.9.9
;; global options: +cmd
;; Got answer:
;; WARNING: .local is reserved for Multicast DNS
;; You are currently testing what happens when an mDNS query is leaked to DNS
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 18343
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;gateway.local.         IN  A

;; AUTHORITY SECTION:
.           2304    IN  SOA a.root-servers.net. nstld.verisign-grs.com. 2022050601 1800 900 604800 86400

;; Query time: 43 msec
;; SERVER: 9.9.9.9#53(9.9.9.9)
;; WHEN: Fri May 06 14:15:17 CDT 2022
;; MSG SIZE  rcvd: 117

Una de las principales diferencias entre el DNS local y uno de los que está contenido en el archivo es que en el comando:

    dig gateway.local. @[]

La parte de la respuesta fue distinta pues en local dio un ANSWER SECTION y en las contenidas en el archivo AUTHORITY SECTION.

Procedimiento de servidor DHCP#

Este procedimiento sigue siendo dentro de la máquina virtual Debian.

Primero instalamos el servicio DHCP con el siguiente comando:

    apt -qy install isc-dhcp-server

Luego creamos una copia del archivo original dhcpd.conf creado al instalar lo anterior, con el siguiente comando:

    cp -v /etc/dhcp/dhcpd.conf ~/dhcpd.conf.orig

Dentro de ese archivo modifamos las siguientes líneas:

# https://linux.die.net/man/5/dhcpd.conf
# https://linux.die.net/man/5/dhcp-options

option  domain-name  "ciencias.local"
option  domain-name-servers  192.168.57.254;

# No se dará servicio en la red externa (NAT de VirtualBox)
subnet 10.0.2.0 netmask 255.255.255.0 {
}

# Rango de direcciones a asignar
subnet  192.168.57.0  netmask  255.255.255.0 {
    range  192.168.57.100  192.168.57.200;
    option  routers  192.168.57.254;
}

Quedando así el siguiente archivo.

Luego que hay que especificar la interfaz de red que brindará el servido DHCP, modificando la siguiente línea en el archivo /etc/default/isc-dhcp-server:

    INTERFACESv4="enp0s8"

Quedando así el siguiente archivo

Y por último ya solo reniciamos el servicio de red y verificamos que esté en ejecución con lo siguientes comandos:

    service isc-dhcp-server restart
    systemctl status isc-dhcp-server

Pruebas de conectividad en el cliente#

Esto se hará dentro de la máquina CentOS, en está también hay dos interfaces de red una es la de NAT (enp0s3) y otra es la de Host-Only (enp0s8), para estas prueba solo se tendrá encendida las red Host-Only.

Primero reiniciamos la red enp0s8 para obtener una nueva dirección por DHCP con lo siguientes comandos:

    ifdown enp0s8
    ifup enp0s8

Para lo siguiente necesitamos las utilerias de red, estas se instalan con el siguiente comando:

    yum -y install net-tools elinks

Ahora veremos la configuracion de la red con los siguientes comandos:

    ifconfig -a
    route -n
    cat /etc/resolv.conf

La salida de estos se encuentra aquí

Y el archivo resolv.conf se encuentra aquí

Y por ultimo verificamos la conectividad de red con los siguientes comandos:

Conectividad local

    ping -c 4 192.168.57.254
    ping -c 4 gateway.local
    ping -c 4 dns.local

Resolución de DNS

    dig example.com. @192.168.57.254
    dig example.com. @dns.local
    dig example.com.

Conectividad externa

    ping -c 4 1.1.1.1
    ping -c 4 example.com.
    links -dump http://example.com/

La salida de estos comandos se encuentra aquí

Procedimiento para reservar una dirección IP en el servidor DHCP#

Este se hará tanto en la máquina virtual Debian como en la de Alpine.

Primero hay que conocer la dirección MAC de la interfaz Host-Only de Alpine con el siguiente comando:

    ip link

Dando así como dirección MAC de *eth0 a 08:00:27:9c:bd:19.

Luego configuremos un dirección reservada en DHCP dentro de Debian, esto se hará modificando el archivo dhcpd.conf agregando las siguientes líneas:

host alpine {
  hardware ethernet 08:00:27:9c:bd:19;
  fixed-address 192.168.57.200;
  option host-name "alpine.ciencias.local";
}

Dando así el siguiente archivo

Y por último ya solo reniciamos el servicio de red y verificamos que esté en ejecución con lo siguientes comandos:

    service isc-dhcp-server restart
    systemctl status isc-dhcp-server

Ahora regresando a Alpine tenemos que verificar la dirección reservada en el cliente.

Primero levantamos la interfaz de red con el siguiente comando:

    ip link set eth0 up

Luego pedimos una nueva dirección IP al servidor DHCP:

    udhcpc -i eth0

Y verificamos la interfaz de red:

    ip addr
Configuración Alpine

Después verificamos la conectividad de Alpine con lo siguiente comandos:

Conectividad local

    ping -c 4 192.168.57.254
    ping -c 4 192.168.57.100
    ping -c 4 dns.local

Conectividad externa

    ping -c 4 1.1.1.1
    ping -c 4 example.com.
    wget -qcO - http://example.com/ | egrep '<!--?title-->'
Conectividad de Red 1
Conectividad de Red 2

Captura de tráfico#

Para esto se tenían las 3 máquinas virtuales encendidas.

Se hicieron capturas en wireshark de:

  • Debian: Todas las interfaces de red (enp0s3, enp0s8)
  • CentOS: Solo interfaz Host-Only (enp0s8)

Con el siguiente filtro:

arp or icmp or port (53 or 67 or 68)

Y las acciones que se hicieron fueron las siguientes:

  • Limpia la tabla ARP de las máquinas Debian, CentOS y Alpine.

  • Pide una nueva dirección IP en las máquinas CentOS y Alpine.

  • Haz pruebas de conectividad al dominio example.com en las máquinas CentOS y Alpine.

Las capturas de Debian son enp0s3 (NAT), enp0s8 (Host-Only).

La captura de CentOS es enp0s8 (Host-Only)

La tabla de rutas y ARP de CentOS es archivo

Tabla de rutas y ARP de Alpine

Conclusiones#

Comparando las capturas de red, responderemos las siguientes preguntas:

  • ¿Hay alguna diferencia en el tráfico de las capturas de red?

Pues en la captura de NAT de Debian se pueden observar cuando se hacía una conectividad externa y no local y esta interfaz respondía a la interfaz Host-Only y su vez esta respondía ya sea a Alpine o a CentOS.

  • ¿Qué parte de tráfico de DHCP es broadcast y unicast?

La parte de broadcast es cuando cliente hace una petición DHCP a toda la red completa para poder conocer su IP, cuando este llega al servidor DHCP este le contesta directamente (unicast) al cliente que solicito su IP.

  • ¿Cómo es que funciona ARP?

De un dispositivo que esté conectado a la red se envian un paquete broadcast preguntando por la dirección MAC para poder crear una ruta al equipo al que le solicitamos su dirección MAC.

  • ¿Cómo es que llega una petición y respuesta de PING desde la máquina CentOS hasta un servidor en Internet?

Primero el paquete llegará a la Red Host-Only, este llegará al router que es Debian, como es una solicitud por fuera mandará el paquete por su Red NAT y esta hará el PING hacia Internet, y su regreso será a la inversa, Primero llegará a NAT, este se transportará a Host-Only y se enviará a CentOS, esto se lleva a cabo por las configuraciones de Debian.