¡Bienvenido a una nueva entrada!
En esta sección, te proporcionaré una guía paso a paso para configurar un servidor OpenVPN en routers EdgeOS. El objetivo principal es acceder de forma segura a la red de tu casa, oficina o empresa desde el exterior.
Este modelo concreto de router es el Ubiquiti EdgeRouter-X, que ejecuta la versión 1.10.9 de EdgeOS.
Certificados y generación de claves
El primer paso es acceder por SSH a nuestro router y actualizar la contraseña del usuario root para poder configurar la vpn correctamente.
ssh ubnt@<router-ip>
sudo su -
El segundo paso es crear una CA(Autoridad de Certificación) para crear los certificados que utilizarán los clientes (dispositivos) para conectarse a nuestro router servidor vpn desde el exterior.
cd /usr/lib/ssl/misc/
./CA.sh -newca
Para crear la AC, tenemos que rellenar los siguientes campos:
PEM Passphrase: Abc123
Country Name: ES
State Or Province Name: Malaga
Locality Name: Malaga
Organization Name: Jeronimo Diaz
Organizational Unit Name:
Common Name: UBNT Server
Email Address: [email protected]
Tras crear la CA, es hora de generar el certificado que el servidor VPN servirá a los clientes.
./CA.sh -newreq
Los campos que hay que rellenar son muy similares a los necesarios para crear la AC.
Country Name: ES
State Or Province Name: Malaga
Locality Name: Malaga
Organization Name: Jeronimo Diaz
Organizational Unit Name:
Common Name: Server
Email Address: [email protected]
El servidor VPN debe reconocer el nuevo certificado como válido. El nuevo certificado debe estar firmado por la CA.
./CA.sh -sign
Una vez firmado, es hora de copiar todos los archivos a la ruta desde donde los leerá el servidor VPN.
cp /usr/lib/ssl/misc/demoCA/cacert.pem /config/auth/
cp /usr/lib/ssl/misc/demoCA/private/cakey.pem /config/auth/
mv /usr/lib/ssl/misc/newcert.pem /config/auth/server.pem
mv /usr/lib/ssl/misc/newkey.pem /config/auth/server.key
Para transmitir datos de forma segura desde el cliente (que está fuera de la red doméstica) al servidor (nuestro router), necesitamos configurar algo llamado clave Diffie-Hellman. Utilizando este método de encriptación, nos aseguramos de que cualquier información enviada desde el cliente al servidor se encripta antes de salir del cliente y se desencripta una vez que llega al servidor. Esto impide que terceros puedan leer los datos transmitidos.
Generar esta clave llevará algún tiempo. Por favor, ten paciencia cuando ejecutes el siguiente comando:
openssl dhparam -out /config/auth/dh2048.pem -2 2048
El siguiente paso es descifrar la clave que se ha creado al crear el certificado que sirve el servidor vpn.
openssl rsa -in /config/auth/server.key -out /config/auth/server-decrypted.key
mv /config/auth/server-decrypted.key /config/auth/server.key
Aunque ahora mismo no hay ningún cliente configurado, en el futuro puede que queramos revocar un certificado (prohibir a algún cliente que se conecte al servidor VPN). Necesitamos crear un archivo que contenga una lista de clientes que deben ser bloqueados. Esta lista debe regenerarse periódicamente y cada vez que haya que bloquear a un cliente. Por defecto, debe regenerarse cada 30 días; sin embargo, si el certificado de un cliente se revoca antes de que hayan transcurrido 30 días desde la última regeneración, el archivo también debe regenerarse.
openssl ca -gencrl -out crl.pem
cp crl.pem /config/auth
Para comprobar cuándo hay que renovar un certificado, se puede ejecutar el siguiente comando:
openssl crl -in /config/auth/crl.pem -noout -text
Antes de pasar a configurar el servidor VPN, para securizar un poco más el servidor, se puede generar una clave TLS adicional para que el servidor VPN sólo responda a las peticiones que presenten esta clave TLS.
openvpn --genkey --secret ta.key
cp ta.key /config/auth
Configuración VPN
Una vez generadas las claves y los certificados para el servidor VPN, es hora de configurarlo:
configure
set interfaces openvpn vtun0 mode server
set interfaces openvpn vtun0 server subnet X.X.X.X/X
set interfaces openvpn vtun0 server push-route X.X.X.X/X
set interfaces openvpn vtun0 server name-server X.X.X.X
set interfaces openvpn vtun0 tls ca-cert-file /config/auth/cacert.pem
set interfaces openvpn vtun0 tls cert-file /config/auth/server.pem
set interfaces openvpn vtun0 tls key-file /config/auth/server.key
set interfaces openvpn vtun0 tls dh-file /config/auth/dh2048.pem
set interfaces openvpn vtun0 tls crl-file /config/auth/crl.pem
set interfaces openvpn vtun0 description "OpenVPN server"
set interfaces openvpn vtun0 encryption aes256
set interfaces openvpn vtun0 hash sha256
set interfaces openvpn vtun0 openvpn-option "--port 1194"
set interfaces openvpn vtun0 openvpn-option --tls-server
set interfaces openvpn vtun0 openvpn-option "--tls-auth /config/auth/ta.key 0"
set interfaces openvpn vtun0 openvpn-option "--comp-lzo yes"
set interfaces openvpn vtun0 openvpn-option --persist-key
set interfaces openvpn vtun0 openvpn-option --persist-tun
set interfaces openvpn vtun0 openvpn-option "--keepalive 10 120"
set interfaces openvpn vtun0 openvpn-option "--user nobody"
set interfaces openvpn vtun0 openvpn-option "--group nogroup"
set interfaces openvpn vtun0 openvpn-option "--ifconfig-pool-persist /var/log/ipp.txt"
set interfaces openvpn vtun0 openvpn-option "--status /var/log/openvpn-status.log"
set service dns forwarding listen-on vtun0
Ten en cuenta:
subred: Rango de red que se utilizará para asignar IPs a los clientes que se conecten al servidor VPN
push-route: Rangos de red a los que tendrán acceso los clientes que se conecten al servidor VPN
name-server: IP de la puerta de enlace de la subred designada para los clientes que se conecten al servidor VPN
Una vez configurado el servidor VPN, hay que configurar las reglas del cortafuegos para que acepte conexiones entrantes cuyo destino sea el servidor VPN
set firewall name WAN_LOCAL rule 30 action accept
set firewall name WAN_LOCAL rule 30 description OpenVPN
set firewall name WAN_LOCAL rule 30 destination port 1194
set firewall name WAN_LOCAL rule 30 protocol udp
commit
save
exit
En este punto, el servidor VPN está configurado. El siguiente paso es generar un certificado para el cliente. Ten en cuenta que los pasos siguientes deben ejecutarse cada vez que queramos configurar un nuevo cliente en el servidor VPN.
cd /usr/lib/ssl/misc
./CA.sh -newreq
./CA.sh -sign
mv newcert.pem /config/auth/client1.pem
mv newkey.pem /config/auth/client1.key
openssl rsa -in /config/auth/client1.key -out /config/auth/client1-decrypted.key
mv /config/auth/client1-decrypted.key /config/auth/client1.key
Durante la creación del certificado de cliente, se pedirán algunos parámetros. Esos parámetros se incluirán en el certificado de cliente. Ten en cuenta que el atributo Nombre Común (CN) debe ser único por cliente.
Ficha de cliente
Para que los clientes puedan conectarse al servidor VPN, necesitan tener un archivo que utilice la extensión ovpn. Las líneas siguientes muestran un archivo de ejemplo para un cliente. Ten en cuenta que algunas líneas deben sustituirse por el contenido de algunos archivos.
client
dev tun
proto udp
remote dominio\ip 1194
cipher AES-256-CBC
redirect-gateway def1
auth SHA256
resolv-retry infinite
nobind
comp-lzo yes
persist-key
persist-tun
user nobody
group nogroup
verb 3
key-direction 1
<ca>
PASTE /config/auth/cacert.pem content
</ca>
<cert>
PASTE /config/auth/client.pem content
</cert>
<key>
PASTE /config/auth/client.key content
</key>
<tls-auth>
PASTE /config/auth/ta.key content
</tls-auth>
El archivo anterior debe enviarse al cliente para que pueda configurar la conexión por su parte.
Revocar un certificado
Los certificados se identifican mediante el atributo CN. Para revocar un certificado, se debe conocer este atributo. Todos los certificados que se han generado para el servidor VPN se almacenan en un archivo.
cat /usr/lib/ssl/misc/demoCA/index.txt
V 231101212507Z 89A35FBCB65F3220 unknown /C=ES/ST=Malaga/O=Jeronimo Diaz/CN=UBNT Jeronimo Diaz Server/emailAddress=xxxxxxxx
V 211101213123Z 89A35FBCB65F3221 unknown /C=ES/ST=Malaga/L=Malaga/O=Jeronimo Diaz/CN=VPN Server/emailAddress=xxxxxxxxxx
V 211101213503Z 89A35FBCB65F3222 unknown /C=ES/ST=Malaga/L=Malaga/O=Jeronimo Diaz/CN=Example Common Name/emailAddress=xxxxxxxx
Una vez que sabemos cuál es el certificado que queremos revocar (CN=Nombre común del ejemplo), debemos copiar el ID (89A35FBCB65F3222) del cliente para poder revocarlo. Para revocar el certificado se utiliza el siguiente comando:
cd /usr/lib/ssl/misc
openssl ca -revoke demoCA/newcerts/<id_certificado>.pem # En nuestro caso 89A35FBCB65F3222
Cada vez que se revoca un certificado, hay que generar la lista de certificados revocados y copiarla en la ruta donde la busca el servidor VPN.
openssl ca -gencrl -out crl.pem
cp crl.pem /config/auth
Eso es todo lo que necesitas saber para configurar un servidor VPN en rutas EdgeOS y crear/revocar certificados de cliente.
Espero que pueda serte útil. No dudes en hacer cualquier pregunta en la sección de comentarios.
¡Nos vemos en el próximo post!
