{"id":246,"date":"2020-11-08T18:53:53","date_gmt":"2020-11-08T17:53:53","guid":{"rendered":"https:\/\/blog.jeronimodiaz.com\/en\/configuracion-de-openvpn-edgeos\/"},"modified":"2025-07-05T23:09:01","modified_gmt":"2025-07-05T22:09:01","slug":"configuracion-de-openvpn-edgeos","status":"publish","type":"post","link":"https:\/\/blog.jeronimodiaz.com\/es\/configuracion-de-openvpn-edgeos\/","title":{"rendered":"Configuraci\u00f3n de OpenVPN EdgeOS"},"content":{"rendered":"\n<p>\u00a1Bienvenido a una nueva entrada!<\/p>\n\n<p>En esta secci\u00f3n, te proporcionar\u00e9 una gu\u00eda 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. <\/p>\n\n<p>Este modelo concreto de router es el Ubiquiti EdgeRouter-X, que ejecuta la versi\u00f3n 1.10.9 de EdgeOS.<\/p>\n\n<h4 class=\"wp-block-heading\">Certificados y generaci\u00f3n de claves<\/h4>\n\n<p>El primer paso es acceder por SSH a nuestro router y actualizar la contrase\u00f1a del usuario root para poder configurar la vpn correctamente.<\/p>\n\n<pre class=\"wp-block-code\"><code>ssh ubnt@&lt;router-ip>\nsudo su -<\/code><\/pre>\n\n<p>El segundo paso es crear una CA(Autoridad de Certificaci\u00f3n) para crear los certificados que utilizar\u00e1n los clientes (dispositivos) para conectarse a nuestro router servidor vpn desde el exterior.<\/p>\n\n<pre class=\"wp-block-code\"><code>cd \/usr\/lib\/ssl\/misc\/\n.\/CA.sh -newca<\/code><\/pre>\n\n<p>Para crear la AC, tenemos que rellenar los siguientes campos:<\/p>\n\n<pre class=\"wp-block-code\"><code>PEM Passphrase: Abc123\nCountry Name: ES\nState Or Province Name: Malaga\nLocality Name: Malaga\nOrganization Name: Jeronimo Diaz\nOrganizational Unit Name:\nCommon Name: UBNT Server\nEmail Address: contact@jeronimodiaz.com<\/code><\/pre>\n\n<p>Tras crear la CA, es hora de generar el certificado que el servidor VPN servir\u00e1 a los clientes.<\/p>\n\n<pre class=\"wp-block-code\"><code>.\/CA.sh -newreq<\/code><\/pre>\n\n<p>Los campos que hay que rellenar son muy similares a los necesarios para crear la AC.<\/p>\n\n<pre class=\"wp-block-code\"><code>Country Name: ES\nState Or Province Name: Malaga\nLocality Name: Malaga\nOrganization Name: Jeronimo Diaz\nOrganizational Unit Name:\nCommon Name: Server\nEmail Address: email@example.com<\/code><\/pre>\n\n<p>El servidor VPN debe reconocer el nuevo certificado como v\u00e1lido. El nuevo certificado debe estar firmado por la CA. <\/p>\n\n<pre class=\"wp-block-code\"><code>.\/CA.sh -sign<\/code><\/pre>\n\n<p>Una vez firmado, es hora de copiar todos los archivos a la ruta desde donde los leer\u00e1 el servidor VPN.<\/p>\n\n<pre class=\"wp-block-code\"><code>cp \/usr\/lib\/ssl\/misc\/demoCA\/cacert.pem \/config\/auth\/\ncp \/usr\/lib\/ssl\/misc\/demoCA\/private\/cakey.pem \/config\/auth\/\nmv \/usr\/lib\/ssl\/misc\/newcert.pem \/config\/auth\/server.pem\nmv \/usr\/lib\/ssl\/misc\/newkey.pem \/config\/auth\/server.key<\/code><\/pre>\n\n<p>Para transmitir datos de forma segura desde el cliente (que est\u00e1 fuera de la red dom\u00e9stica) al servidor (nuestro router), necesitamos configurar algo llamado clave Diffie-Hellman. Utilizando este m\u00e9todo de encriptaci\u00f3n, nos aseguramos de que cualquier informaci\u00f3n 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.  <\/p>\n\n<p>Generar esta clave llevar\u00e1 alg\u00fan tiempo. Por favor, ten paciencia cuando ejecutes el siguiente comando: <\/p>\n\n<pre class=\"wp-block-code\"><code>openssl dhparam -out \/config\/auth\/dh2048.pem -2 2048<\/code><\/pre>\n\n<p>El siguiente paso es descifrar la clave que se ha creado al crear el certificado que sirve el servidor vpn.<\/p>\n\n<pre class=\"wp-block-code\"><code>openssl rsa -in \/config\/auth\/server.key -out \/config\/auth\/server-decrypted.key\nmv \/config\/auth\/server-decrypted.key \/config\/auth\/server.key<\/code><\/pre>\n\n<p>Aunque ahora mismo no hay ning\u00fan cliente configurado, en el futuro puede que queramos revocar un certificado (prohibir a alg\u00fan 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\u00f3dicamente y cada vez que haya que bloquear a un cliente. Por defecto, debe regenerarse cada 30 d\u00edas; sin embargo, si el certificado de un cliente se revoca antes de que hayan transcurrido 30 d\u00edas desde la \u00faltima regeneraci\u00f3n, el archivo tambi\u00e9n debe regenerarse.   <\/p>\n\n<pre class=\"wp-block-code\"><code>openssl ca -gencrl -out crl.pem\ncp crl.pem \/config\/auth<\/code><\/pre>\n\n<p>Para comprobar cu\u00e1ndo hay que renovar un certificado, se puede ejecutar el siguiente comando:<\/p>\n\n<pre class=\"wp-block-code\"><code>openssl crl -in \/config\/auth\/crl.pem -noout -text<\/code><\/pre>\n\n<p>Antes de pasar a configurar el servidor VPN, para securizar un poco m\u00e1s el servidor, se puede generar una clave TLS adicional para que el servidor VPN s\u00f3lo responda a las peticiones que presenten esta clave TLS.<\/p>\n\n<pre class=\"wp-block-code\"><code>openvpn --genkey --secret ta.key\ncp ta.key \/config\/auth<\/code><\/pre>\n\n<h4 class=\"wp-block-heading\">Configuraci\u00f3n VPN<\/h4>\n\n<p>Una vez generadas las claves y los certificados para el servidor VPN, es hora de configurarlo:<\/p>\n\n<pre class=\"wp-block-code\"><code>configure\nset interfaces openvpn vtun0 mode server\nset interfaces openvpn vtun0 server subnet X.X.X.X\/X\nset interfaces openvpn vtun0 server push-route X.X.X.X\/X\nset interfaces openvpn vtun0 server name-server X.X.X.X\nset interfaces openvpn vtun0 tls ca-cert-file \/config\/auth\/cacert.pem\nset interfaces openvpn vtun0 tls cert-file \/config\/auth\/server.pem\nset interfaces openvpn vtun0 tls key-file \/config\/auth\/server.key\nset interfaces openvpn vtun0 tls dh-file \/config\/auth\/dh2048.pem\nset interfaces openvpn vtun0 tls crl-file \/config\/auth\/crl.pem\nset interfaces openvpn vtun0 description \"OpenVPN server\"\nset interfaces openvpn vtun0 encryption aes256\nset interfaces openvpn vtun0 hash sha256\nset interfaces openvpn vtun0 openvpn-option \"--port 1194\"\nset interfaces openvpn vtun0 openvpn-option --tls-server\nset interfaces openvpn vtun0 openvpn-option \"--tls-auth \/config\/auth\/ta.key 0\"\nset interfaces openvpn vtun0 openvpn-option \"--comp-lzo yes\"\nset interfaces openvpn vtun0 openvpn-option --persist-key\nset interfaces openvpn vtun0 openvpn-option --persist-tun\nset interfaces openvpn vtun0 openvpn-option \"--keepalive 10 120\"\nset interfaces openvpn vtun0 openvpn-option \"--user nobody\"\nset interfaces openvpn vtun0 openvpn-option \"--group nogroup\"\nset interfaces openvpn vtun0 openvpn-option \"--ifconfig-pool-persist \/var\/log\/ipp.txt\"\nset interfaces openvpn vtun0 openvpn-option \"--status \/var\/log\/openvpn-status.log\"\nset service dns forwarding listen-on vtun0<\/code><\/pre>\n\n<p>Ten en cuenta:<br\/><br\/><em>subred: Rango de red que se utilizar\u00e1 para asignar IPs a los clientes que se conecten al servidor VPN<\/em><br\/><em>push-route: Rangos de red a los que tendr\u00e1n acceso los clientes que se conecten al servidor VPN<\/em><br\/><em>name-server: IP de la puerta de enlace de la subred designada para los clientes que se conecten al servidor VPN<\/em><\/p>\n\n<p>Una vez configurado el servidor VPN, hay que configurar las reglas del cortafuegos para que acepte conexiones entrantes cuyo destino sea el servidor VPN<\/p>\n\n<pre class=\"wp-block-code\"><code>set firewall name WAN_LOCAL rule 30 action accept\nset firewall name WAN_LOCAL rule 30 description OpenVPN\nset firewall name WAN_LOCAL rule 30 destination port 1194\nset firewall name WAN_LOCAL rule 30 protocol udp\ncommit\nsave\nexit<\/code><\/pre>\n\n<p>En este punto, el servidor VPN est\u00e1 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.   <\/p>\n\n<pre class=\"wp-block-code\"><code>cd \/usr\/lib\/ssl\/misc\n.\/CA.sh -newreq\n.\/CA.sh -sign\nmv newcert.pem \/config\/auth\/client1.pem\nmv newkey.pem \/config\/auth\/client1.key\nopenssl rsa -in \/config\/auth\/client1.key -out \/config\/auth\/client1-decrypted.key\nmv \/config\/auth\/client1-decrypted.key \/config\/auth\/client1.key<\/code><\/pre>\n\n<p>Durante la creaci\u00f3n del certificado de cliente, se pedir\u00e1n algunos par\u00e1metros. Esos par\u00e1metros se incluir\u00e1n en el certificado de cliente. Ten en cuenta que el atributo Nombre Com\u00fan (CN) debe ser \u00fanico por cliente.  <\/p>\n\n<h4 class=\"wp-block-heading\">Ficha de cliente<\/h4>\n\n<p>Para que los clientes puedan conectarse al servidor VPN, necesitan tener un archivo que utilice la extensi\u00f3n ovpn. Las l\u00edneas siguientes muestran un archivo de ejemplo para un cliente. Ten en cuenta que algunas l\u00edneas deben sustituirse por el contenido de algunos archivos.  <\/p>\n\n<pre class=\"wp-block-code\"><code>client\ndev tun\nproto udp\nremote dominio\\ip 1194\ncipher AES-256-CBC\nredirect-gateway def1\nauth SHA256\nresolv-retry infinite\nnobind\ncomp-lzo yes\npersist-key\npersist-tun\nuser nobody\ngroup nogroup\nverb 3\nkey-direction 1\n&lt;ca>\nPASTE \/config\/auth\/cacert.pem content\n&lt;\/ca>\n&lt;cert>\nPASTE \/config\/auth\/client.pem content\n&lt;\/cert>\n&lt;key>\nPASTE \/config\/auth\/client.key content\n&lt;\/key>\n&lt;tls-auth>\nPASTE \/config\/auth\/ta.key content\n&lt;\/tls-auth><\/code><\/pre>\n\n<p>El archivo anterior debe enviarse al cliente para que pueda configurar la conexi\u00f3n por su parte.<\/p>\n\n<h4 class=\"wp-block-heading\">Revocar un certificado<\/h4>\n\n<p>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.  <\/p>\n\n<pre class=\"wp-block-code\"><code>cat \/usr\/lib\/ssl\/misc\/demoCA\/index.txt\n\nV       231101212507Z           89A35FBCB65F3220        unknown \/C=ES\/ST=Malaga\/O=Jeronimo Diaz\/CN=UBNT Jeronimo Diaz Server\/emailAddress=xxxxxxxx\nV       211101213123Z           89A35FBCB65F3221        unknown \/C=ES\/ST=Malaga\/L=Malaga\/O=Jeronimo Diaz\/CN=VPN Server\/emailAddress=xxxxxxxxxx\nV       211101213503Z           89A35FBCB65F3222        unknown \/C=ES\/ST=Malaga\/L=Malaga\/O=Jeronimo Diaz\/CN=Example Common Name\/emailAddress=xxxxxxxx<\/code><\/pre>\n\n<p>Una vez que sabemos cu\u00e1l es el certificado que queremos revocar (CN=Nombre com\u00fan del ejemplo), debemos copiar el ID (89A35FBCB65F3222) del cliente para poder revocarlo. Para revocar el certificado se utiliza el siguiente comando: <\/p>\n\n<pre class=\"wp-block-code\"><code>cd \/usr\/lib\/ssl\/misc\nopenssl ca -revoke demoCA\/newcerts\/&lt;id_certificado&gt;.pem # En nuestro caso 89A35FBCB65F3222<\/code><\/pre>\n\n<p>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.<\/p>\n\n<pre class=\"wp-block-code\"><code>openssl ca -gencrl -out crl.pem\ncp crl.pem \/config\/auth<\/code><\/pre>\n\n<p>Eso es todo lo que necesitas saber para configurar un servidor VPN en rutas EdgeOS y crear\/revocar certificados de cliente.<\/p>\n\n<p>Espero que pueda serte \u00fatil. No dudes en hacer cualquier pregunta en la secci\u00f3n de comentarios. <\/p>\n\n<p>\u00a1Nos vemos en el pr\u00f3ximo post!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u00a1Bienvenido a una nueva entrada! En esta secci\u00f3n, te proporcionar\u00e9 una gu\u00eda paso a paso para configurar un servidor OpenVPN en routers EdgeOS. El objetivo principal es acceder de forma&hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[97],"tags":[110,99,108,106,109],"class_list":["post-246","post","type-post","status-publish","format-standard","hentry","category-red","tag-certificado-es","tag-edgeos-es","tag-openvpn-es","tag-servidor-es","tag-vpn-es"],"_links":{"self":[{"href":"https:\/\/blog.jeronimodiaz.com\/es\/wp-json\/wp\/v2\/posts\/246","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.jeronimodiaz.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.jeronimodiaz.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jeronimodiaz.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jeronimodiaz.com\/es\/wp-json\/wp\/v2\/comments?post=246"}],"version-history":[{"count":5,"href":"https:\/\/blog.jeronimodiaz.com\/es\/wp-json\/wp\/v2\/posts\/246\/revisions"}],"predecessor-version":[{"id":323,"href":"https:\/\/blog.jeronimodiaz.com\/es\/wp-json\/wp\/v2\/posts\/246\/revisions\/323"}],"wp:attachment":[{"href":"https:\/\/blog.jeronimodiaz.com\/es\/wp-json\/wp\/v2\/media?parent=246"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jeronimodiaz.com\/es\/wp-json\/wp\/v2\/categories?post=246"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jeronimodiaz.com\/es\/wp-json\/wp\/v2\/tags?post=246"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}