Asus RT-AC68U: Asignar IP fija a clientes VPN
2019-04-11
Índice
- Preparando el entorno
- Creación Autoridad Certificadora (CA)
- Creación certificados servidor
- Creación certificados clientes
- Generar archivo parametros DH (Diffie Hellman)
- Configuración del router
- Asignando IP fija del cliente
- Añadiendo autenticación con usuarios y contraseña
- Configuración de los clientes
- Conexión con el servidor VPN
- Permitir acceso a red interna
- Consideraciones finales:
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
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
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
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:
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 e iniciarlo como un servicio del sistema
root@OMV1:/etc/openvpn# sudo systemctl enable [email protected]
root@OMV1:/etc/openvpn# sudo systemctl start [email protected]
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 …