Asus RT-AC68U: Asignar IP fija a clientes VPN

Introducción

Si has configurado el servidor VPN en el router, te habrás dado cuenta de que el servidor va asignando de forma aleatoria una IP diferente a los clientes que se conectan a el. Puede darse el caso que necesites que un cliente tenga siempre la misma IP.

Para poder realizar esto vamos a necesitar crear un certificado por cada cliente y de esta forma, el servidor VPN podrá asignar siempre la misma IP al mismo CN del certificado.

Preparando el entorno

Vamos a preparar el entorno para la creación de los certificados, vamos a necesitar un disco USB formateado en ext2, ext3 o ext4. Copiaremos los scripts easy-rsa al disco USB, en el ejemplo /dev/sdc

/tmp/home/root# setuprsa.sh /mnt/sdc/

Destination dir: /mnt/sdc//easy-rsa

easy-rsa scripts copied to /mnt/sdc//easy-rsa.

Enter /mnt/sdc//easy-rsa/, and edit the 'vars' file as needed.
Then, execute it to setup your environment:
 source vars

Finally, initialize things with the following command:
 ./clean-all

Read the easy-rsa documentation on how to use it to generate your certs/keys.
/tmp/home/root#

Ahora tendremos una carpeta en /dev/sdc llamada easy-rsa, con todos los scripts necesarios para la creación de los certificados

/tmp/home/root# ls -lh /mnt/sdc/easy-rsa/
-rwxr-xr-x    1 user   root         119 Oct  7 19:33 build-ca
-rwxr-xr-x    1 user   root         352 Oct  7 19:33 build-dh
-rwxr-xr-x    1 user   root         188 Oct  7 19:33 build-inter
-rwxr-xr-x    1 user   root         163 Oct  7 19:33 build-key
-rwxr-xr-x    1 user   root         157 Oct  7 19:33 build-key-pass
-rwxr-xr-x    1 user   root         249 Oct  7 19:33 build-key-pkcs12
-rwxr-xr-x    1 user   root         268 Oct  7 19:33 build-key-server
-rwxr-xr-x    1 user   root         213 Oct  7 19:33 build-req
-rwxr-xr-x    1 user   root         158 Oct  7 19:33 build-req-pass
-rwxr-xr-x    1 user   root         428 Oct  7 19:33 clean-all
-rwxr-xr-x    1 user   root        1.4K Oct  7 19:33 inherit-inter
drwxrwxrwx    2 user   root        4.0K Oct 20 23:10 keys
-rwxr-xr-x    1 user   root         295 Oct  7 19:33 list-crl
-rwxr-xr-x    1 user   root        8.0K Oct  7 19:33 openssl-1.0.0.cnf
-rwxr-xr-x    1 user   root       12.4K Oct  7 19:33 pkitool
-rwxr-xr-x    1 user   root         918 Oct  7 19:33 revoke-full
-rwxr-xr-x    1 user   root         178 Oct  7 19:33 sign-req
-rwxr-xr-x    1 user   root        2.0K Oct  7 19:33 vars
-rwxr-xr-x    1 user   root         715 Oct  7 19:33 whichopensslcnf

Modificamos los valores que por defecto se usaran para la creación de los certificados editando el fichero var

- export KEY_COUNTRY="ES"
- export KEY_PROVINCE="MA"
- export KEY_CITY="Pinto"
- export KEY_ORG="Organizacion Ltd."
- export KEY_EMAIL="direccion@correo"
- export KEY_OU="Casa"
- export KEY_CN="Asus"

Preparamos el entorno

/tmp/mnt/sdc/easy-rsa# source ./vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /mnt/sdc/easy-rsa/keys

Inicializamos el entorno

/tmp/mnt/sdc/easy-rsa#./clean-all

Ahora ya estamos preparados para generar los certificados

Creación Autoridad Certificadora (CA)

Necesitamos generar nuestra Autoridad de Certificación (CA). Será la clave “maestra” y el certificado, se utilizará para firmar todos los certificados de clientes o para revocar su acceso.

Como medida de seguridad procuraremos guardar la llave maestra un lugar fuera del router. Para generar el par CA:

/tmp/mnt/sdc/easy-rsa# source ./vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /mnt/sdc/easy-rsa/keys
/tmp/mnt/sdc/easy-rsa# ./build-ca
Generating a 1024 bit RSA private key
...................+++++
................................+++++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [ES]:
State or Province Name (full name) [MA]:
Locality Name (eg, city) [Pinto]:
Organization Name (eg, company) [Organizacion Ltd.]:
Organizational Unit Name (eg, section) [Casa]:
Common Name (eg, your name or your server's hostname) [Asus]:
Name [EasyRSA]:
Email Address [direccion@correo]:
/tmp/mnt/sdc/easy-rsa#

Creación certificados servidor

El Nombre Común (CN) es el campo mas importante ya que sera el que identifica a nuestro router.

Construimos el par certificado/clave del router, recuerda que cuando nos pregunte por el Nombre Común (Common Name) tenemos que poner el mismo que pusimos antes (Asus)

/tmp/mnt/sdc/easy-rsa# ./build-key-server servidor
Generating a 1024 bit RSA private key
..+++++
......+++++
writing new private key to 'servidor.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [ES]:
State or Province Name (full name) [MA]:
Locality Name (eg, city) [Pinto]:
Organization Name (eg, company) [Organizacion Ltd.]:
Organizational Unit Name (eg, section) [Casa]:
Common Name (eg, your name or your server's hostname) [servidor]:
Name [EasyRSA]:
Email Address [direccion@correo]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /mnt/sdc/easy-rsa/openssl-1.0.0.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'ES'
stateOrProvinceName   :PRINTABLE:'MA'
localityName          :PRINTABLE:'Pinto'
organizationName      :PRINTABLE:'Organizacion Ltd.'
organizationalUnitName:PRINTABLE:'Casa'
commonName            :PRINTABLE:'Asus'
name                  :PRINTABLE:'EasyRSA'
emailAddress          :IA5STRING:'direccion@correo'

Debemos firmar el certificado

Certificate is to be certified until Oct 17 22:37:11 2028 GMT (3650 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
/tmp/mnt/sdc/easy-rsa#

Creación certificados clientes

A continuación, vamos a construir el par certificado/clave de los clientes.

El procedimiento es el mismo que hemos realizado antes, el Nombre Común (CN) debe coincidir con el nombre que hemos especificando antes, (Asus):

/tmp/mnt/sdc/easy-rsa# ./build-key cliente-1
Generating a 1024 bit RSA private key
.....................+++++
.......................................+++++
writing new private key to 'cliente-1.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are ab
./build-key client1
out to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [ES]:
State or Province Name (full name) [MA]:
Locality Name (eg, city) [Pinto]:
Organization Name (eg, company) [Organizacion Ltd.]:
Organizational Unit Name (eg, section) [Casa]:
Common Name (eg, your name or your server's hostname) [cliente-1]:Asus
Name [EasyRSA]:
Email Address [direccion@correo]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /mnt/sdc/easy-rsa/openssl-1.0.0.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'ES'
stateOrProvinceName   :PRINTABLE:'MA'
localityName          :PRINTABLE:'Pinto'
organizationName      :PRINTABLE:'Organizacion Ltd.'
organizationalUnitName:PRINTABLE:'Casa'
commonName            :PRINTABLE:'Asus'
name                  :PRINTABLE:'EasyRSA'
emailAddress          :IA5STRING:'direccion@correo'
Certificate is to be certified until Oct 17 23:03:36 2028 GMT (3650 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

Puedes crear tantos pares de llaves de clientes como necesitemos.

Generar archivo parametros DH (Diffie Hellman)

Necesitamos generar los parámetros de Diffie Hellman (archivo DH), que se utilizan para asegurar el intercambio de claves entre el cliente y el router.

Ejecutamos el siguiente comando:

/tmp/mnt/sdc/easy-rsa# ./build-dh
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
................................................................+.....................................+....+.............................+.....+...............................................................................................................................+...........................................+........+..........+..............+.................................................................................................................+.........................+.+....................+...............+....................+...........................................++*++*++*++*++*
/tmp/mnt/sdc/easy-rsa#

Todos los archivos generados se almacenan en la carpeta keys, sobra decir que estos ficheros los copiaremos a otro lugar fuera del router.

Configuración del router

Necesitamos instalar los certificados del servidor que hemos creado en los pasos anteriores y asignar que IP tendrá cada cliente. Vamos a empezar por instalar los certificados

Si miras dentro de la carpeta easy veremos las claves que generamos para el servidor son las siguientes

/tmp/mnt/sdc# ls -lh easy-rsa/keys/servidor.*
-rw-rw-rw-    1 user   root        4.0K Oct 20 23:37 easy-rsa/keys/servidor.crt
-rw-rw-rw-    1 user   root         720 Oct 20 23:37 easy-rsa/keys/servidor.csr
-rw-------    1 user   root         916 Oct 20 23:37 easy-rsa/keys/servidor.key

Además debemos de tener el certificado de la CA que también generamos antes

/tmp/mnt/sdc# ls -lh easy-rsa/keys/ca*
-rw-rw-rw-    1 user   root        1.3K Oct 20 23:32 ca.crt
-rw-------    1 user   root         916 Oct 20 23:32 ca.key

Y el fichero DH

-rw-rw-rw-    1 user   root         245 Oct 21 00:11 dh1024.pem

Desde la pantalla de administración de la VPN debemos ir a las opciones avanzadas

asus-vpn-fija8.png.

En el el campo Keys and certificates pulsamos en el boton Edit

asus-vpn-fija1.png.

En el campo Certificate Authority borramos el contenido y pegamos el contenido del fichero ca.crt y en el campo Server certificate borramos su contenido y pegamos el contenido del fichero servidor.crt

asus-vpn-fija2.png.

En el campo Server key y Diffie Hellman parmeters borramos y pegamos el contenido de los ficheros servidor.key y dh1024.pem respectivamente y guardamos los cambios..

.

Para terminar solo nos quedara exportar y guardas el fichero de configuración que van a utilizar los clientes

asus-vpn-fija6.png.

asus-vpn-fija7.png.

Asignando IP fija del cliente

Para asignar una IP en concreto a un cliente, primero debemos de crear la carpeta ccd1 dentro de /jffs/configs/openvpn/ e ir creando un fichero por cada cliente con la IP que le queremos asignar

mkdir /jffs/configs/openvpn/ccd1/

Recuerda que creamos un cliente llamado cliente-1, por lo que deberemos crear un fichero dentro de la carpeta /jffs/configs/openvpn/ccd1/ llamado cliente-1 y tiene que contener en su interior comando

ifconfig-push 10.8.0.5 255.255.255.0

Añadiendo autenticación con usuarios y contraseña

Si además de necesitar el certificado queremos que se autentifiquen en el servidor VPN con usuario y contraseña, debemos de dar de alta a los usuarios en el servidor.

Para ello nuevamente desde la pestaña Servidor VPN seleccionamos en Detalles de VPN General

asus-ovpn-c-c9.png.

Iremos agregando lo usuarios y contraseñas que necesitemos, no olvides pulsar en el boton + para cada nuevo usuarios y aplicar los cambios

asus-vpn-fija9.png.

En las opciones generales marcamos Si en Username/Password Authentication y No en _Solo autentificacion mediante nombre de usuario y contraseña, de esta forma, además de solicitar un usuario y contraseña para acceder al servidor, cada cliente necesitara del certificado que el hemos generado anteriormente.

asus-vpn-fija5.png.

Marcamos Si en Admmistrar opciones especificas del cliente para poder añadir opciones en la configuración de los clientes, como por ejemplo push "dhcp-option DNS 10.8.0.1", que va a forzar a los clientes a utilizar las DNS del router (10.8.0.1)

asus-vpn-fija4.png.

Configuración de los clientes

Para configurar los clientes debemos de editar el fichero de configuración que hemos exportado desde el router en el paso anterior para añadir el certificado y la llave de cada cliente (cliente-1.crt y cliente-1.key),

asus-vpn-fija10.png.

Conexión con el servidor VPN

En este articulo explique la forma de conectar con el servidor VPN con un cliente Android, y desde un cliente Linux bastara con ejecutar:

sudo openvpn ./cliente-1.ovpn
Sun Oct 21 13:01:45 2018 OpenVPN 2.4.6 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Apr 24 2018
Sun Oct 21 13:01:45 2018 library versions: OpenSSL 1.1.1  11 Sep 2018, LZO 2.10
[sudo] password for user:
Enter Auth Username: cliente-1
Enter Auth Password: ********
Sun Oct 21 13:02:01 2018 TCP/UDP: Preserving recently used remote address: [AF_INET]xxx.xxx.xxx.xxx:41194
Sun Oct 21 13:02:01 2018 UDP link local: (not bound)
Sun Oct 21 13:02:01 2018 UDP link remote: [AF_INET]xx.xxx.xxx.xxx:41194
Sun Oct 21 13:02:01 2018 WARNING: this configuration may cache passwords in memory -- use the auth-nocache option to prevent this
Sun Oct 21 13:02:01 2018 [OpenVpn_Server] Peer Connection Initiated with [AF_INET]192.168.1.1:41194
Sun Oct 21 13:02:02 2018 TUN/TAP device tun0 opened
Sun Oct 21 13:02:02 2018 do_ifconfig, tt->did_ifconfig_ipv6_setup=0
Sun Oct 21 13:02:02 2018 /usr/bin/ip link set dev tun0 up mtu 1500
Sun Oct 21 13:02:02 2018 /usr/bin/ip addr add dev tun0 10.8.0.5/24 broadcast 10.8.0.255
Sun Oct 21 13:02:02 2018 Initialization Sequence Completed
Sun Oct 21 13:02:07 2018 event_wait : Interrupted system call (code=4)
Sun Oct 21 13:02:07 2018 /usr/bin/ip addr del dev tun0 10.8.0.5/24
Sun Oct 21 13:02:07 2018 SIGINT[hard,] received, process exiting

Aparte de las credenciales para sudo , nos pide las de acceso a la VPN tal y como lo configuramos en el router y emos como el servidor le asigna la ip 10.8.0.5 que fue la que hemos forzado en el servidor mediante el fichero /jffs/configs/openvpn/ccd1/cliente-1

Podemos automatizar este paso editando el fichero de configuración cliente-1.ovpn e indicándole que el usuario y la contraseña se encuentran guardados en el fichero login.txt

keepalive 15 60
auth-user-pass login.txt
remote-cert-tls server

El contenido del fichero login.txt

usuario
contraseña

Ahora ya no pide usuario/contraseña para realzar.

sudo openvpn ./cliente-1.conf
Sun Oct 21 13:04:26 2018 OpenVPN 2.4.6 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Apr 24 2018
Sun Oct 21 13:04:26 2018 library versions: OpenSSL 1.1.1  11 Sep 2018, LZO 2.10
Sun Oct 21 13:04:26 2018 TCP/UDP: Preserving recently used remote address: [AF_INET]xx.xx.xx.xx:41194
Sun Oct 21 13:04:26 2018 UDP link local: (not bound)
Sun Oct 21 13:04:26 2018 UDP link remote: [AF_INET]xx.xx.xx.xx:41194
Sun Oct 21 13:04:26 2018 WARNING: this configuration may cache passwords in memory -- use the auth-nocache option to prevent this
Sun Oct 21 13:04:26 2018 [OpenVpn_Server] Peer Connection Initiated with [AF_INET]192.168.1.1:41194
Sun Oct 21 13:04:28 2018 TUN/TAP device tun0 opened
Sun Oct 21 13:04:28 2018 do_ifconfig, tt->did_ifconfig_ipv6_setup=0
Sun Oct 21 13:04:28 2018 /usr/bin/ip link set dev tun0 up mtu 1500
Sun Oct 21 13:04:28 2018 /usr/bin/ip addr add dev tun0 10.8.0.5/24 broadcast 10.8.0.255
Sun Oct 21 13:04:28 2018 Initialization Sequence Completed

También podemos añadirlo inicarlo como un servicio del sistema

root@OMV1:/etc/openvpn# sudo systemctl enable openvpn@cliente-1.service

root@OMV1:/etc/openvpn# sudo systemctl start openvpn@cliente-1.service

Permitir acceso a red interna

Puedes forzar que los clientes tengan acceso a la red interna desde la VPN añadiendo una regla en iptables, para ello utilizaremos el script firewall.start, dentro de /jffs/scripts ​ Editamos el fichero

nano firewall-start

​Añadimos la regla

#!/bin/sh

/usr/sbin/iptables -t nat -A POSTROUTING -s "10.8.0.0/24" -j MASQUERADE

Damos permisos de ejecución

chmod 755 ./firewall-start

Reiniciamos el router para comprobar que funcione.

Consideraciones finales:

  • Nunca accedas a tu red local directamente desde la WAN (Internet), utiliza siempre una VPN para conectarte a ella
  • Utiliza siempre certificado mas usuario y contraseña para las conexiones con el servidor, sera mas difícil de hackear
  • Utiliza un puerto no estándar para el servidor, a ser posible de un rango alto, muchos escaners no llegan tan alto

Referencias:

Espero que te haya gustado, pasa un buen día…