Tras haber instalado Debian GNU/Linux en nuestro Servidor, vamos a proceder a configurar y securizar nuestra red doméstica. La primera tarea que debemos de realizar es encontrar el nombre de nuestro identificador de red y el rango de la misma. Este comando nos dara la información esperada:

ip a

Y entre los valores que muestra el comando me quedo con la siguiente información:

2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master state UP group default qlen 1000
        link/ether xx:xx:xx:xx:xx:xx brd xx:xx:xx:xx:xx:xx
        inet 192.168.1.250/24 brd 192.168.1.255 scope global ens33
        valid_lft forever preferred_lft forever

Ahora se que mi dispositivo de red cableada esta identificado como ens33 y que la IP en mi red es 192.168.1.250 rango DHCP.

IPV4 Forward + BR0

Vamos a habilitar la redicción de puertos sobre IPv4 que posteriormente usaremos para entre otros configurar debidamente la VPN.

sudo nano /etc/sysctl.conf

Buscamos el siguiente apartado en el documento:

#net.ipv4.ip_forward=1

Y lo dejamos de la siguiente forma, como veras solamente has de eliminar la # inicial:

net.ipv4.ip_forward=1

Guardamos los cambios (Ctrl+O), salimos del editor de texto (Ctrl+X) y pasamos a configurar una red Bridge con IP estática:

sudo apt-get update && sudo apt-get -y install bridge-utils net-tools ifupdown && sudo mv /etc/network/interfaces /etc/network/interfaces.bak && sudo nano /etc/network/interfaces

En el documento en blanco que se nos abre, lo configuro con mi nombre de red (ens33) y la ip estática que le voy a configurar (192.168.1.90):

# LO
auto lo
iface lo inet loopback

# Bridge
auto br0
iface br0 inet static
        address 192.168.1.90
        netmask 255.255.255.0
        network 192.168.1.0
        gateway 192.168.1.1
        bridge_ports ens33
        bridge_stp off
        bridge_fd 0
        bridge_maxwait 0

Guardamos los cambios (Ctrl+O), salimos del editor de texto (Ctrl+X) y nos queda corregir un posible fallo aunque no es común, en el fichero de resolución de DNS:

sudo mv /etc/resolv.conf /etc/resolv.conf.bak && echo "nameserver 9.9.9.9" | sudo tee -a /etc/resolv.conf

Para evitar que NetworkManager entre en juego editaremos su configuración, para deshabilitar que juegue con redes configuradas:

sudo nano /etc/NetworkManager/NetworkManager.conf

Y dejamos el fichero con el siguiente contenido:

[main]
plugins=ifupdown,keyfile
dns=none

[ifupdown]
managed=false

Guardamos los cambios (Ctrl+O), salimos del editor de texto (Ctrl+X) y a continuación debemos de reiniciar el servidor para aplicar los nuevos cambios producidos en el dispositivo de red:

sudo reboot

Tras reiniciar nuevamente comprobamos la nueva configuración de red:

ip a

Y vemos los cambios realizados:

3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
        link/ether xx:xx:xx:xx:xx:xx brd xx:xx:xx:xx:xx:xx
        inet 192.168.1.90/24 brd 192.168.1.255 scope global br0
        valid_lft forever preferred_lft forever

A partir de este momento nuestra red cableada la identificaremos con el nombre de br0 y la IP de nuestro servidor en casa sera 192.168.1.90.

DNS Pública

Como sabras tu IP doméstica no es tu IP pública y al igual que en un comienzo tu IP doméstica era DHCP lo mismo ocurre con la IP pública. Por tanto para poder redireccionar servicios, necesitamos disponer de IP pública estática. La forma más sencilla es usar un proveedor de DNS públicas de calidad como por ejemplo NoIP o Duck DNS. Por sencillez de configuración recomiendo usar Duck DNS.

Opción 1: NoIP

Entramos en la web y creamos una cuenta gratuita en la cual registraremos nuestro dominio, ejemplo: ejemplo.ddns.net. Importante recordar que al ser una cuenta gratuita el periodo de renovación es cada 30 días via notificación email. Ahora debemos descargarnos el cliente y descomprimirlo para que nuestro PC se pueda comunicar con el proveedor:

cd ~/ && wget -O noip.tar.gz http://www.noip.com/client/linux/noip-duc-linux.tar.gz && tar -zxvf noip.tar.gz && rm noip.tar.gz && cd ~/noip*

Tras la descompresión nos quedaría compilarlo e instalarlo.

make && sudo make install

Durante la instalación nos pedirá el correo y la contraseña con la que nos hemos registrado. El periodo de actualización lo dejamos en 30min (valor por defecto) y a la pregunta que nos plantea le respondemos N (NO). Para que el cliente se siga comunicando con el servidor tras un reinicio y/o arranque del sistema lo debemos de ejecutar cada vez que iniciamos y para ello usaremos rc.local:

sudo nano /etc/rc.local

Añadiendo la linea a ejecutar antes de la sentencia exit 0

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
#
# DNS
/usr/local/bin/noip2  & >/dev/null 2>&1
# SALIR
exit 0

Opción 2: Duck DNS (Recomendada)

Entramos en la web y creamos una cuenta gratuita en la cual registraremos nuestro dominio, ejemplo: ejemplo.duckdns.org. Y el procedimiento de instalación en nuestra red es vía cron. Adjunto tutorial de configuración en GNU/Linux.

Luego ya nos decantemos por NoIP/DuckDNS o ambas tenemos que configurar nuestro hosts para agregar nuestra DNS Pública:

sudo nano /etc/hosts

Buscamos la línea:

127.0.0.1 localhost

Y la modificamos si hemos creado una cuenta en DuckDNS:

127.0.0.1 localhost ejemplo.duckdns.org

O bien la modificamos si hemos creado una cuenta en NoIP:

127.0.0.1 localhost ejemplo.ddns.net

O como otra posible opción si hemos creado ambas:

127.0.0.1 localhost ejemplo.ddns.net ejemplo.duckdns.org

Guardamos los cambios (Ctrl+O) y salimos del editor de texto (Ctrl+X).

OPENVPN

Teniendo ya fijada una DNS Pública, una IP estática interna y la redirección de puertos, ya podemos proceder a configurar de forma sencilla el acceso mediante VPN. Vamos a bajar un cliente asistente donde configuramemos nuestra red VPN:

cd ~/ && wget https://git.io/vpn -O openvpn-install.sh && chmod 755 openvpn-install.sh && sudo ./openvpn-install.sh

Durante la instalación nos solicitara unos parametros de nuestros pasos previos:

  • IPv4 (automatically detected, if not enter the local IPv4 address): 192.168.1.90
  • Public IP (enter your public IP address): ejemplo.duckdns.org
  • Protocol: UDP
  • Port (change to your desired port): 2194
  • DNS: Current system resolvers
  • Client name: Lordpedal

Vamos a afinar la configuración de la VPN con capas extras de personalización, ahora debemos de conocer la IP de la nuestra red virtual TUN0

sudo ifconfig tun0 | grep 'inet'

En mi caso el valor de referencia es: 10.8.0.1. Vamos a editar la configuración del servidor de OpenVPN:

sudo nano /etc/openvpn/server/server.conf

Buscamos la linea donde el codigo empieza por (suele ser una única línea en según que casos alguna duplicada):

push "dhcp-option DNS

Y sustituimos la linea o si existen varias dejamos una sola que haga referencia al codigo push dhcp-option con lo siguiente:

push "dhcp-option DNS 10.8.0.1"

Guardamos los cambios (Ctrl+O), salimos del editor de texto (Ctrl+X) y reiniciamos el servicio OpenVPN:

sudo systemctl restart openvpn

Recordad que el fichero OVPN generado en nuestro caso se llamaba Lordpedal lo tendremos que pasar a nuestra carpeta de usuario.

sudo cp /root/Lordpedal.ovpn /home/pi && sudo chown pi:pi /home/pi/Lordpedal.ovpn

Ahora ya podremos pasar el fichero OVPN a nuestro Smartphone/Tablet/Pendrive/… para poder conectarnos en remoto previa configuración router. Recuerda abrir el Puerto 2194 a la IP 192.168.1.90 con Protocolo UDP si has seguido la configuración que detallo paso a paso.

PiHOLE

Bajo este curioso nombre, se unen una serie de aplicaciones de entornos GNU/Linux, que van a darnos lugar a proveer una capa extra de seguridad en la web, desde el punto de bloqueo de publicidad y entornos maliciosos de la red. El procedimiento de instalación al igual que en el caso de la VPN se ha simplificado al punto de un asistente:

sudo curl -sSL https://install.pi-hole.net | bash

Nos realizara un chequeo del sistema y nos saldra un asistente en pantalla, donde nos solicitara algunas confirmaciones que debemos de ir rellenando en el caso de la prueba:

Choose an interface: br0

Select protocols to block: IPV4 & IPV6

Do you want to use your current network settings … : Yes

Select upstream DNS Provider … : Google (da igual cual elijamos pués después las modificaremos)

Do you want to install interface web … : Yes

Al terminar la instalacion nos habra creado una contraseña para la gestión consola web, pero recomiendo cambiarla. Ejecutamos en la terminal para definir el cambio:

pihole -a -p

Debido a que en el momento de escribir esta entrada, PiHOLE no esta plenamente soportado en Debian Buster, te podras encontrar con un pequeño bug en dhcpcd5. La solución es bien sencilla:

sudo systemctl disable dhcpcd

Cuando se de soporte oficial a Buster modificare esta entrada.

DNSCrypt-Proxy

Para navegar por Internet es necesario usar los servidores DNS, ya que estos servidores traducen los nombres de dominio a las direcciones IP de los servidores. Los servidores DNS utilizan una base de datos distribuída y jerárquica, almacenando la información de los nombres de dominio. La consulta de los DNS se realiza típicamente bajo el protocolo UDP por el puerto 53, sin ningún tipo de cifrado y por tanto, sin ninguna seguridad de que un atacante pueda interceptar y modificar la información.

DNScrypt-proxy nos proporciona cifrado y autenticación de las solicitudes mediante el protocolo DNSCrypt para posteriormente pasarlos a un servidor superior (organización jerárquica). DNSCrypt utiliza criptografía para cifrar el contenido de las solicitudes DNS, lo que lo hace ser muy rápido y seguro. De la misma forma que TLS/SSL cifra el tráfico HTTP bajo el protocolo HTTPS, DNSCrypt hace lo propio con DNS.

Aunque este método no proporciona seguridad de punto a punto de la comunicación, sí protege el entorno de nuestra red local donde normalmente se realizan los ataques MITM (Man In The Middle). Un lugar típico donde se podría usar estos DNS seguros es en las redes Wi-Fi públicas, aunque en este último caso lo más recomendable es usar nuestra VPN para cifrar todo el tráfico y protegernos de otros ataques típicos contra las redes locales.

Vamos a crear un entorno de trabajo y configurar la aplicación:

cd /opt && sudo wget https://github.com/jedisct1/dnscrypt-proxy/releases/download/2.0.25/dnscrypt-proxy-linux_x86_64-2.0.25.tar.gz && sudo tar -xf dnscrypt-proxy-linux_x86_64-2.0.25.tar.gz && sudo rm dnscrypt-proxy-linux_x86_64-2.0.25.tar.gz && sudo mv linux-x86_64 dnscrypt-proxy && cd dnscrypt-proxy && sudo cp example-dnscrypt-proxy.toml dnscrypt-proxy.toml && sudo nano dnscrypt-proxy.toml

En el editor debemos de buscar la línea que hace referencia al puerto de escucha:

listen_addresses = ['127.0.0.1:53', '[::1]:53']

Y la cambiamos por la siguiente para que no entre en conlifcto con dnsmasq que usa PiHole, sustituyendo el puerto 53 por el 40:

listen_addresses = ['127.0.0.1:40', '[::1]:40']

Otro parametro a modificar es el requerir usar servidores DNS con filtro dnssec por defecto inactivo:

require_dnssec = false

Lo activamos sustituyendo false por true

require_dnssec = true

Este paso es opcional pero recomiendo cambiarlo por filtrar más si cabe la seguridad de los servidores. Por defecto busca en su base de datos de forma random servidores de dns:

#server_names = ['scaleway-fr', 'google', 'yandex', 'cloudflare']

Si queremos buscar en unos rangos especificios quitamos la # inicial y añado los servers que uso para salir a la red:

server_names = ['dnscrypt.eu-dk', 'dnscrypt.eu-nl', 'scaleway-fr', 'sfw.scaleway-fr', 'dnscrypt.nl-ns0','dnscrypt.nl-ns0-doh', 'cloudflare']

Guardamos los cambios (Ctrl+O), salimos del editor de texto (Ctrl+X) y nos queda instalar el nuevo servicio y arrancarlo:

sudo ./dnscrypt-proxy -service install && sudo ./dnscrypt-proxy -service start

COMBINANDO POTENCIAL: PiHOLE + DNSCrypt + OPENVPN

Llegados a este punto ya tenemos el 99% del trabajo realizado, en tema de seguridad de red. Solamente nos queda unificar el potencial de los servicios, para que cada consulta que realicemos/recibamos a la red sea filtrada y encriptada. Tenemos que configurar los parametros de PiHole para que todos trabajen en armonia, es el responsable de unificar la tarea:

sudo nano /etc/pihole/setupVars.conf

Recordamos que durante la instalación de PiHole elegimos las DNS de Google, si elegimos otras nos saldran en este punto de configuración:

PIHOLE_DNS_1=8.8.8.8
PIHOLE_DNS_2=8.8.4.4

Y las cambiamos por las nuestras propias que seran las de DNSCrypt-Proxy quedando de la siguiente forma:

PIHOLE_DNS_1=127.0.0.1#40
PIHOLE_DNS_2=::1#40

Guardamos los cambios (Ctrl+O), salimos del editor de texto (Ctrl+X) y pasamos a comprobar que nuestro rc.local este debidamente configurado:

sudo nano /etc/rc.local

Comprobamos que la VPN ha quedado configurada con los parametros anteriores de la siguiente forma (IP´s, Puerto UDP):

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
#
# DNS
/usr/local/bin/noip2  & >/dev/null 2>&1
# OPENVPN configurado en openvpn-iptables.service
#iptables -I FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
#iptables -I FORWARD -s 10.8.0.0/24 -j ACCEPT
#iptables -I INPUT -p udp --dport 2194 -j ACCEPT
#iptables -t nat -A POSTROUTING -s 10.8.0.0/24 ! -d 10.8.0.0/24 -j SNAT --to 192.168.1.90
# SALIR
exit 0

Guardamos los cambios (Ctrl+O), salimos del editor de texto (Ctrl+X) y debemos de activar la escucha de Pi-hole en todas las interfaces de red:

pihole -a -i local

Tras finalizar, reiniciamos nuestro servidor:

sudo reboot

Tras el reinicio nuestra VPN sera cifrada y filtrada, las conexiones del servidor cifradas y filtradas. Si queremos extenderlo a los demas dispositivos de la red ya sean Wifi o Cableados (PC´s, Tablet´s, TV´s,Smartphone´s,…) en el apartado DNS de su respectiva configuración le dariamos la IP DNS 192.168.1.90 que es nuestro servidor. Con este paso lograremos que el dispositivo trabaje en la red pasando por los filtros del servidor.

Recuerda que para navegar por la consola web de Pi-hole, en cualquier navegador web de tu red o VPN tecleas la IP del Servidor (192.168.1.90) y añades el perfil /admin

http://192.168.1.90/admin