Asus RT-AC68U: Asignar IP fija a clientes VPN

13 minutos de lectura

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

 1 /tmp/home/root# setuprsa.sh /mnt/sdc/
 2
 3 Destination dir: /mnt/sdc//easy-rsa
 4
 5 easy-rsa scripts copied to /mnt/sdc//easy-rsa.
 6
 7Enter /mnt/sdc//easy-rsa/, and edit the 'vars' file as needed.
 8Then, execute it to setup your environment:
 9 source vars
10
11Finally, initialize things with the following command:
12 ./clean-all
13
14Read the easy-rsa documentation on how to use it to generate your certs/keys.
15/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

 1/tmp/home/root# ls -lh /mnt/sdc/easy-rsa/
 2-rwxr-xr-x    1 user   root         119 Oct  7 19:33 build-ca
 3-rwxr-xr-x    1 user   root         352 Oct  7 19:33 build-dh
 4-rwxr-xr-x    1 user   root         188 Oct  7 19:33 build-inter
 5-rwxr-xr-x    1 user   root         163 Oct  7 19:33 build-key
 6-rwxr-xr-x    1 user   root         157 Oct  7 19:33 build-key-pass
 7-rwxr-xr-x    1 user   root         249 Oct  7 19:33 build-key-pkcs12
 8-rwxr-xr-x    1 user   root         268 Oct  7 19:33 build-key-server
 9-rwxr-xr-x    1 user   root         213 Oct  7 19:33 build-req
10-rwxr-xr-x    1 user   root         158 Oct  7 19:33 build-req-pass
11-rwxr-xr-x    1 user   root         428 Oct  7 19:33 clean-all
12-rwxr-xr-x    1 user   root        1.4K Oct  7 19:33 inherit-inter
13drwxrwxrwx    2 user   root        4.0K Oct 20 23:10 keys
14-rwxr-xr-x    1 user   root         295 Oct  7 19:33 list-crl
15-rwxr-xr-x    1 user   root        8.0K Oct  7 19:33 openssl-1.0.0.cnf
16-rwxr-xr-x    1 user   root       12.4K Oct  7 19:33 pkitool
17-rwxr-xr-x    1 user   root         918 Oct  7 19:33 revoke-full
18-rwxr-xr-x    1 user   root         178 Oct  7 19:33 sign-req
19-rwxr-xr-x    1 user   root        2.0K Oct  7 19:33 vars
20-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

1
2- export KEY_COUNTRY="ES"
3- export KEY_PROVINCE="MA"
4- export KEY_CITY="Pinto"
5- export KEY_ORG="Organizacion Ltd."
6- export KEY_EMAIL="direccion@correo"
7- export KEY_OU="Casa"
8- export KEY_CN="Asus"

Preparamos el entorno

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

Inicializamos el entorno

1/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:

 1/tmp/mnt/sdc/easy-rsa# source ./vars
 2NOTE: If you run ./clean-all, I will be doing a rm -rf on /mnt/sdc/easy-rsa/keys
 3/tmp/mnt/sdc/easy-rsa# ./build-ca
 4Generating a 1024 bit RSA private key
 5...................+++++
 6................................+++++
 7writing new private key to 'ca.key'
 8-----
 9You are about to be asked to enter information that will be incorporated
10into your certificate request.
11What you are about to enter is what is called a Distinguished Name or a DN.
12There are quite a few fields but you can leave some blank
13For some fields there will be a default value,
14If you enter '.', the field will be left blank.
15-----
16Country Name (2 letter code) [ES]:
17State or Province Name (full name) [MA]:
18Locality Name (eg, city) [Pinto]:
19Organization Name (eg, company) [Organizacion Ltd.]:
20Organizational Unit Name (eg, section) [Casa]:
21Common Name (eg, your name or your server's hostname) [Asus]:
22Name [EasyRSA]:
23Email Address [direccion@correo]:
24/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)

 1/tmp/mnt/sdc/easy-rsa# ./build-key-server servidor
 2Generating a 1024 bit RSA private key
 3..+++++
 4......+++++
 5writing new private key to 'servidor.key'
 6-----
 7You are about to be asked to enter information that will be incorporated
 8into your certificate request.
 9What you are about to enter is what is called a Distinguished Name or a DN.
10There are quite a few fields but you can leave some blank
11For some fields there will be a default value,
12If you enter '.', the field will be left blank.
13-----
14Country Name (2 letter code) [ES]:
15State or Province Name (full name) [MA]:
16Locality Name (eg, city) [Pinto]:
17Organization Name (eg, company) [Organizacion Ltd.]:
18Organizational Unit Name (eg, section) [Casa]:
19Common Name (eg, your name or your server's hostname) [servidor]:
20Name [EasyRSA]:
21Email Address [direccion@correo]:
22
23Please enter the following 'extra' attributes
24to be sent with your certificate request
25A challenge password []:
26An optional company name []:
27Using configuration from /mnt/sdc/easy-rsa/openssl-1.0.0.cnf
28Check that the request matches the signature
29Signature ok
30The Subject's Distinguished Name is as follows
31countryName           :PRINTABLE:'ES'
32stateOrProvinceName   :PRINTABLE:'MA'
33localityName          :PRINTABLE:'Pinto'
34organizationName      :PRINTABLE:'Organizacion Ltd.'
35organizationalUnitName:PRINTABLE:'Casa'
36commonName            :PRINTABLE:'Asus'
37name                  :PRINTABLE:'EasyRSA'
38emailAddress          :IA5STRING:'direccion@correo'

Debemos firmar el certificado

1Certificate is to be certified until Oct 17 22:37:11 2028 GMT (3650 days)
2Sign the certificate? [y/n]:y
3
4
51 out of 1 certificate requests certified, commit? [y/n]y
6Write out database with 1 new entries
7Data Base Updated
8/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):

 1/tmp/mnt/sdc/easy-rsa# ./build-key cliente-1
 2Generating a 1024 bit RSA private key
 3.....................+++++
 4.......................................+++++
 5writing new private key to 'cliente-1.key'
 6-----
 7You are about to be asked to enter information that will be incorporated
 8into your certificate request.
 9What you are ab
10./build-key client1
11out to enter is what is called a Distinguished Name or a DN.
12There are quite a few fields but you can leave some blank
13For some fields there will be a default value,
14If you enter '.', the field will be left blank.
15-----
16Country Name (2 letter code) [ES]:
17State or Province Name (full name) [MA]:
18Locality Name (eg, city) [Pinto]:
19Organization Name (eg, company) [Organizacion Ltd.]:
20Organizational Unit Name (eg, section) [Casa]:
21Common Name (eg, your name or your server's hostname) [cliente-1]:Asus
22Name [EasyRSA]:
23Email Address [direccion@correo]:
24
25Please enter the following 'extra' attributes
26to be sent with your certificate request
27A challenge password []:
28An optional company name []:
29Using configuration from /mnt/sdc/easy-rsa/openssl-1.0.0.cnf
30Check that the request matches the signature
31Signature ok
32The Subject's Distinguished Name is as follows
33countryName           :PRINTABLE:'ES'
34stateOrProvinceName   :PRINTABLE:'MA'
35localityName          :PRINTABLE:'Pinto'
36organizationName      :PRINTABLE:'Organizacion Ltd.'
37organizationalUnitName:PRINTABLE:'Casa'
38commonName            :PRINTABLE:'Asus'
39name                  :PRINTABLE:'EasyRSA'
40emailAddress          :IA5STRING:'direccion@correo'
41Certificate is to be certified until Oct 17 23:03:36 2028 GMT (3650 days)
42Sign the certificate? [y/n]:y
43
44
451 out of 1 certificate requests certified, commit? [y/n]y
46Write out database with 1 new entries
47Data 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:

1/tmp/mnt/sdc/easy-rsa# ./build-dh
2Generating DH parameters, 1024 bit long safe prime, generator 2
3This is going to take a long time
4................................................................+.....................................+....+.............................+.....+...............................................................................................................................+...........................................+........+..........+..............+.................................................................................................................+.........................+.+....................+...............+....................+...........................................++*++*++*++*++*
5/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

1/tmp/mnt/sdc# ls -lh easy-rsa/keys/servidor.*
2-rw-rw-rw-    1 user   root        4.0K Oct 20 23:37 easy-rsa/keys/servidor.crt
3-rw-rw-rw-    1 user   root         720 Oct 20 23:37 easy-rsa/keys/servidor.csr
4-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

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

Y el fichero DH

1-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

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

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

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

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

1mkdir /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

1ifconfig-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

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

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.

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)

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),

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:

 1sudo openvpn ./cliente-1.ovpn
 2Sun 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
 3Sun Oct 21 13:01:45 2018 library versions: OpenSSL 1.1.1  11 Sep 2018, LZO 2.10
 4[sudo] password for user:
 5Enter Auth Username: cliente-1
 6Enter Auth Password: ********
 7Sun Oct 21 13:02:01 2018 TCP/UDP: Preserving recently used remote address: [AF_INET]xxx.xxx.xxx.xxx:41194
 8Sun Oct 21 13:02:01 2018 UDP link local: (not bound)
 9Sun Oct 21 13:02:01 2018 UDP link remote: [AF_INET]xx.xxx.xxx.xxx:41194
10Sun Oct 21 13:02:01 2018 WARNING: this configuration may cache passwords in memory -- use the auth-nocache option to prevent this
11Sun Oct 21 13:02:01 2018 [OpenVpn_Server] Peer Connection Initiated with [AF_INET]192.168.1.1:41194
12Sun Oct 21 13:02:02 2018 TUN/TAP device tun0 opened
13Sun Oct 21 13:02:02 2018 do_ifconfig, tt->did_ifconfig_ipv6_setup=0
14Sun Oct 21 13:02:02 2018 /usr/bin/ip link set dev tun0 up mtu 1500
15Sun Oct 21 13:02:02 2018 /usr/bin/ip addr add dev tun0 10.8.0.5/24 broadcast 10.8.0.255
16Sun Oct 21 13:02:02 2018 Initialization Sequence Completed
17Sun Oct 21 13:02:07 2018 event_wait : Interrupted system call (code=4)
18Sun Oct 21 13:02:07 2018 /usr/bin/ip addr del dev tun0 10.8.0.5/24
19Sun 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

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

El contenido del fichero login.txt

1usuario
2contraseña

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

 1sudo openvpn ./cliente-1.conf
 2Sun 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
 3Sun Oct 21 13:04:26 2018 library versions: OpenSSL 1.1.1  11 Sep 2018, LZO 2.10
 4Sun Oct 21 13:04:26 2018 TCP/UDP: Preserving recently used remote address: [AF_INET]xx.xx.xx.xx:41194
 5Sun Oct 21 13:04:26 2018 UDP link local: (not bound)
 6Sun Oct 21 13:04:26 2018 UDP link remote: [AF_INET]xx.xx.xx.xx:41194
 7Sun Oct 21 13:04:26 2018 WARNING: this configuration may cache passwords in memory -- use the auth-nocache option to prevent this
 8Sun Oct 21 13:04:26 2018 [OpenVpn_Server] Peer Connection Initiated with [AF_INET]192.168.1.1:41194
 9Sun Oct 21 13:04:28 2018 TUN/TAP device tun0 opened
10Sun Oct 21 13:04:28 2018 do_ifconfig, tt->did_ifconfig_ipv6_setup=0
11Sun Oct 21 13:04:28 2018 /usr/bin/ip link set dev tun0 up mtu 1500
12Sun Oct 21 13:04:28 2018 /usr/bin/ip addr add dev tun0 10.8.0.5/24 broadcast 10.8.0.255
13Sun Oct 21 13:04:28 2018 Initialization Sequence Completed

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

1root@OMV1:/etc/openvpn# sudo systemctl enable openvpn@cliente-1.service
2
3root@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

1nano firewall-start

Añadimos la regla

1#!/bin/sh
2
3/usr/sbin/iptables -t nat -A POSTROUTING -s "10.8.0.0/24" -j MASQUERADE

Damos permisos de ejecución

1chmod 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…