{"id":480,"date":"2011-04-11T08:50:13","date_gmt":"2011-04-11T13:50:13","guid":{"rendered":"https:\/\/rafael.bonifaz.ec\/blog\/?p=480"},"modified":"2011-04-11T08:50:13","modified_gmt":"2011-04-11T13:50:13","slug":"openvpn-how-to-1","status":"publish","type":"post","link":"https:\/\/rafael.bonifaz.ec\/blog\/2011\/04\/openvpn-how-to-1\/","title":{"rendered":"OpenVPN how to 1"},"content":{"rendered":"<h2>Introducci\u00f3n<\/h2>\n<p>Una<strong> Red Privada Virtual <\/strong>(VPN por sus siglas en ingl\u00e9s) sirve para crear una conexi\u00f3n encriptada entre 2 o m\u00e1s puntos a trav\u00e9s de Internet. Un caso de uso t\u00edpico puede ser permitir al acceso a servicios de una intranet de forma segura desde Internet. \u00a0Otro caso t\u00edpico de uso es interconectar redes locales de 2 \u00f3 m\u00e1s sucrusales a trav\u00e9s de Internet. En este art\u00edculo haremos la primera opci\u00f3n y en un futuro cercano publicar\u00e9 c\u00f3mo interconectar 2 redes.<\/p>\n<p>Existen varias implementaciones de VPN y en el mundo de software libre una de las m\u00e1s populares es OpenVPN. \u00a0Una de sus grandes ventajas, es que se pueden tener clientes en distintos sistemas operativos com GNU\/Linux, Windows, Mac y seguro que en todas las versiones BSD.<\/p>\n<h2>Instalaci\u00f3n<\/h2>\n<p>OpenVPN viene por defecto en la mayor\u00eda de las distribuciones GNU\/Linux. En mi caso suelo utilizar Debian o Ubuntu. La instalaci\u00f3n la hice con aptitude:<\/p>\n<p style=\"padding-left: 30px;\"><code>aptitude install openvpn<\/code><\/p>\n<p>En distros basadas en RPM la instalaci\u00f3n se la hace con yum:<\/p>\n<p style=\"padding-left: 30px;\"><code>yum install openvpn<\/code><\/p>\n<p>Listo , as\u00ed de f\u00e1cil y de sencillo.<!--more--><\/p>\n<h2>Crear los certificados digitales<\/h2>\n<p>OpenVPN autentica sus clientes a trav\u00e9s de llaves p\u00fablicas y privadas. De esta manera cada cliente tiene su llave privada y debe enviar su llave p\u00fablica al servidor. Estas llaves son creadas con un certificado conocido como \u00ab<em>Certificado de Autoridad<\/em>\u00ab. De esta forma cuando el servidor recibe una llave p\u00fablica este revisa si esta firmado con el certificado de autoridad. Sino esta no aceptar\u00e1 la conexi\u00f3n.<\/p>\n<p>La forma m\u00e1s f\u00e1cil de crear estos certificados es utilizando la utilidad easy-rsa que viene en el paquete de OpenVPN. En el caso de debian esta aplicaci\u00f3n se encuentra en: <em>\/usr\/share\/doc\/openvpn\/examples\/easy-rsa\/2.0\/ easy-rsa<\/em>. Otras distribuciones tendr\u00e1n una ruta similar.<\/p>\n<p>Copiamos la aplicaci\u00f3n a una ruta m\u00e1s f\u00e1cil de recordar. Personalmente opt\u00e9 por un subdirectorio dentro de \/etc\/openvpn. Para tener las cosas ordenadas:<\/p>\n<p style=\"padding-left: 30px;\"><code>cp -r \/usr\/share\/doc\/openvpn\/examples\/easy-rsa\/2.0\/ \/etc\/openvpn\/easy-rsa<br \/>\n<\/code><\/p>\n<p>Ahora ingresamos al directorio para crear las claves:<\/p>\n<p style=\"padding-left: 30px;\"><code>cd \/etc\/openvpn\/easy-rsa\/ <\/code><\/p>\n<p>Dentro de esta carpeta tenemos un archivo que almacena algunas variables importantes. Recomiendo revisar este archivo y de ser el caso modificar algunas variables.<\/p>\n<p style=\"padding-left: 30px;\"><code>vim vars<\/code><\/p>\n<p>En mi caso personalice la siguiente parte para que cuando cree los certificados los valores por defecto tengan que ver con mi realidad:<\/p>\n<p style=\"padding-left: 30px;\"><code>export KEY_COUNTRY=\"EC\"<br \/>\nexport KEY_PROVINCE=\"Pichicha\"<br \/>\nexport KEY_CITY=\"Cayambe\"<br \/>\nexport KEY_ORG=\"Mi empresa\"<br \/>\nexport KEY_EMAIL=\"yo@midominio.com\" <\/code><\/p>\n<p>Guardamos y cerramos el archivo. Si no queremos no modificamos el archivo, es algo netamente opcional.<\/p>\n<p>Cargamos las variables de este archivo al shell que estamos utilizando:<\/p>\n<p style=\"padding-left: 30px;\"><code>. vars<\/code><\/p>\n<p>Borramos las claves previamete creados en caso de existir. Hacer esto solo si es la primera vez que vamos a crear los certificados y las claves.<\/p>\n<p style=\"padding-left: 30px;\"><code>.\/clean-all <\/code><\/p>\n<p>Creamos el certificado de autoridad:<\/p>\n<p style=\"padding-left: 30px;\"><code>.\/build-ca<\/code><\/p>\n<p>Si modificaron las variables, se dar\u00e1n cuenta que ahora las estaremos utilizando.<\/p>\n<p>Certificado y clave privada para el servidor<\/p>\n<p style=\"padding-left: 30px;\"><code>\/build-key-server servidor <\/code><\/p>\n<p>Esto generara los archivos servidor.crt y servidor.key. donde el archivo .key es la llave privada y .crt es la p\u00fablica.<\/p>\n<p>Generamos los par\u00e1metros\u00a0<a href=\"http:\/\/en.wikipedia.org\/wiki\/Diffie%E2%80%93Hellman_key_exchange\"> Diffie Helman<\/a><\/p>\n<p style=\"padding-left: 30px;\"><a href=\"http:\/\/en.wikipedia.org\/wiki\/Diffie%E2%80%93Hellman_key_exchange\"><\/a><span style=\"font-family: monospace;\">.\/build-dh<\/span><\/p>\n<p>Generamos las claves de los clientes.<\/p>\n<p style=\"padding-left: 30px;\"><code>.\/build-key cliente1<br \/>\n.\/build-key cliente2<br \/>\n.\/build-key cliente3<br \/>\n<\/code><\/p>\n<p>De manera similar al servidor se crear\u00e1n las claves *.key y *.crt que ser\u00e1n las claves privadas y p\u00fablicas respectivamente. Las 2 claves las deberemos copiar al cliente.<\/p>\n<p>Listo, hemos creado todos los certificados necesarios y estamos listos para configurar los clientes y el servidor. Es importante sacar un respaldo del directorio \/etc\/openvpn\/easy-rsa ya que ah\u00ed est\u00e1n todas las claves, incluido el certificado de autoridad que nos permitir\u00e1 crear nuevas claves a futuro.<\/p>\n<h3>Resumen de las claves y certificados creados:<\/h3>\n<table border=\"1\">\n<tbody>\n<tr>\n<th>Archivo<\/th>\n<th>Utilizado en<\/th>\n<th>Descripci\u00f3n<\/th>\n<th>Secreto<\/th>\n<\/tr>\n<tr>\n<td>ca.ca<\/td>\n<td>Servidor y todos los clientes<\/td>\n<td>Certificado de Autoridad<\/td>\n<td>no<\/td>\n<\/tr>\n<tr>\n<td>ca.crt<\/td>\n<td>M\u00e1quina donde se crean los certificados<\/td>\n<td>Llave del certificado CA principal<\/td>\n<td>s\u00ed<\/td>\n<\/tr>\n<tr>\n<td>dh{n}.pem<\/td>\n<td>Servidor<\/td>\n<td>Par\u00e1metros Diffie Hellman<\/td>\n<td>no<\/td>\n<\/tr>\n<tr>\n<td>servidor.crt<\/td>\n<td>Servidor<\/td>\n<td>Certificado del servidor<\/td>\n<td>no<\/td>\n<\/tr>\n<tr>\n<td>servidor.key<\/td>\n<td>Servidor<\/td>\n<td>Llave privada del certificado del servidor<\/td>\n<td>s\u00ed<\/td>\n<\/tr>\n<tr>\n<td>clienteX.crt<\/td>\n<td>Solo en el cliente X<\/td>\n<td>Certificado del Cliente X<\/td>\n<td>no<\/td>\n<\/tr>\n<tr>\n<td>clienteX.key<\/td>\n<td>Solo en el cliente X<\/td>\n<td>Llave privado del certificado del cliente X<\/td>\n<td>no<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p style=\"padding-left: 30px;\"><strong>Nota:<\/strong> en clienteX, X quiere decir el n\u00famero del cliente. En este ejemplo estamos trabajamos con 3 clientes para la VPN pr lo que deber\u00ed\u00e1mos tener 3 pares de claves .crt y .key.<\/p>\n<h2>Configurar el Servidor<\/h2>\n<p>Copiamos los archivos que corresponden al servidor en una carpeta dentro del mismo. En mi caso copie la configuraci\u00f3n en \/etc\/openvpn\/claves. Si generamos las claves en una m\u00e1quina que no es el servidor debemos usar <a href=\"https:\/\/rafael.bonifaz.ec\/blog\/2011\/01\/copiar-archivos-con-scp-ssh\/\">scp<\/a> u otra aplicaci\u00f3n para subirlas a nuestro servidor.<br \/>\nCopiamos un archivo de ejemplo de configuraci\u00f3n del servidor y la adaptamos a nuestras necesidades.<\/p>\n<p style=\"padding-left: 30px;\"><code>cd \/etc\/openvpn<br \/>\ncp \/usr\/share\/doc\/openvpn\/examples\/sample-config-files\/server.conf.gz .<br \/>\ngunzip server.conf.gz<br \/>\nvim server.conf<br \/>\n<\/code><\/p>\n<p>Dentro del archivo modificamos algunas variables para que funcione. Aqu\u00ed expico algunas:<br \/>\nProtocolo a utilizar:<\/p>\n<p style=\"padding-left: 30px;\"><code># TCP or UDP server?<br \/>\nproto udp<br \/>\n<\/code><\/p>\n<p>Vamos a configurar la vpn utilizando el protocolo UDP ya que esto nos dar\u00e1 un mejor rendimiento. No tiene sentido trabajar en TCP ya que dentro de nuestra vpn se correra el protocolo IP donde de ser necesario se volver a utilizar el protocolo TCP y no tiene sentido utilizar 2 veces este protocolo. En otras palabras, utilizar TCP solo cuando no lo puedan hacer con UDP.<\/p>\n<p>Definimos las rutas a los certifiados. Recordar que en este ejemplo estamos utilizando \/etc\/openvpn\/claves<\/p>\n<p style=\"padding-left: 30px;\"><code> ca claves\/ca.crt<br \/>\ncert claves\/servidor.crt<br \/>\nkey claves\/servidor.key<br \/>\ndh dh1024.pem<br \/>\n<\/code><\/p>\n<p>Por \u00faltimo, en el mismo archivo, decimos a que redes queremos que los clientes vpn puedan acceder.<\/p>\n<p style=\"padding-left: 30px;\"><code>push \"route 192.168.45.0 255.255.255.0\" <\/code><\/p>\n<p>Listo podremos iniciar el servidor:<\/p>\n<p style=\"padding-left: 30px;\"><code>\/etc\/init.d\/openvpn start<\/code><\/p>\n<p>En caso de necesitar corregir errores se puede iniciar el servicio as\u00ed:<\/p>\n<p style=\"padding-left: 30px;\"><code>openvpn &lt;archivo de configuraci\u00f3n&gt;<\/code><\/p>\n<p><strong>Nota<\/strong>: El servidor VPN deber\u00eda poder trabajar como ruteador por lo que debemos activar esto a nivel del kernel:<\/p>\n<p style=\"padding-left: 30px;\">echo 1 &gt; \/proc\/sys\/net\/ipv4\/ip_forward<\/p>\n<p>Para que la configuraci\u00f3n quede grabada y no se pierda al reiniciar la m\u00e1quina se debe editar el archivo \/etc\/sysctl.conf y poner el valor de 1 a la variable correspondiente:<\/p>\n<p style=\"padding-left: 30px;\"><code>net.ipv4.ip_forward=1<\/code><\/p>\n<h2>Configuraci\u00f3n de un Cliente<\/h2>\n<p>Instalar OpenVPN en el cliente. En el caso de usar Linux, la instalaci\u00f3n es igual a como se instala el servidor.<br \/>\nCopiamos los archivos correspondientes al cliente dentro de la m\u00e1quina del mismo (Ver la tabla de arriba). En mi caso los copie en \/etc\/openvpn\/claves<\/p>\n<p>Una vez que tenemos las claves, copiamos un archivo de configuraci\u00f3n de ejemplo para cliente y lo configuramos para nuestras necesidades:<\/p>\n<p style=\"padding-left: 30px;\"><code>cp \/usr\/share\/doc\/openvpn\/examples\/sample-config-files\/client.conf \/etc\/openvpn\/<br \/>\nvim client.conf<\/code><\/p>\n<p>Definimos el protocolo como UDP igual que en el servidor:<\/p>\n<p style=\"padding-left: 30px;\"><code>proto udp<br \/>\n<\/code><\/p>\n<p>De manera similar al servidor, editamos las varialbes <strong>ca, cr y key<\/strong>:<\/p>\n<p style=\"padding-left: 30px;\"><span style=\"font-family: monospace;\">ca claves\/ca.crt<br \/>\n<\/span><span style=\"font-family: monospace;\">cert claves\/clienteX.crt<br \/>\n<\/span><span style=\"font-family: monospace;\">key claves\/clientX.key<\/span><\/p>\n<p>El cliente debe saber a que servidor se debe conectar. Para esto debemos utilizar un nombre de dominio o el IP p\u00fablico y el puerto a conectarse. Por defecto OpeVPN corre en el puerto 1194.<\/p>\n<p style=\"padding-left: 30px;\"><code> remote miservidor.com\u00a01194<\/code><\/p>\n<p>Iniciamos OpenVPN en el cliente<\/p>\n<p style=\"padding-left: 30px;\"><span style=\"font-family: monospace;\">\/etc\/init.d\/openvpn start<\/span><\/p>\n<p>En caso de tener errores podemos probar con<\/p>\n<p style=\"padding-left: 30px;\"><code>openvpn &lt;archivo de configuracion&gt;<\/code><\/p>\n<p>Para probar la conectividad podemos hacer ping al ip 10.8.0.1 que es el ip de nuestro servidor. Si lo hacemos ya estamos con la VPN arriba. en caso de haber puesto la sentencia push podr\u00edamos hacer ping a ips dentro de la red LAN donde se encuentra la VPN. Ojo que las m\u00e1quinas de la red LAN deber\u00edan saber como llegar a la red 10.8.0.0\/24, para esto deber\u00edamos ver la configuraci\u00f3n del servidor.<\/p>\n<h2>Referencias Adicionales<\/h2>\n<ul>\n<li><a href=\"http:\/\/openvpn.net\/index.php\/open-source\/documentation\/howto.html\">How to OpenVPN<\/a><\/li>\n<\/ul>\n<h3 class='related_post_title'>Art\u00edculos relacionados<\/h3><ul class='related_post'><li><a href=\"https:\/\/rafael.bonifaz.ec\/blog\/2013\/03\/chat-encriptado-con-pidgin-y-otr\/\" title=\"Chat Encriptado con Pidgin y OTR\">Chat Encriptado con Pidgin y OTR<\/a><\/li><li><a href=\"https:\/\/rafael.bonifaz.ec\/blog\/2017\/01\/todos-a-encriptar-chao-http-hola-https\/\" title=\"Todos a encriptar: chao HTTP hola HTTPS\">Todos a encriptar: chao HTTP hola HTTPS<\/a><\/li><li><a href=\"https:\/\/rafael.bonifaz.ec\/blog\/2016\/11\/subgraph-os-para-la-privacidad-y-anonimato\/\" title=\"Subgraph OS para la privacidad y anonimato\">Subgraph OS para la privacidad y anonimato<\/a><\/li><\/ul>","protected":false},"excerpt":{"rendered":"<p>Introducci\u00f3n Una Red Privada Virtual (VPN por sus siglas en ingl\u00e9s) sirve para crear una conexi\u00f3n encriptada entre 2 o m\u00e1s puntos a trav\u00e9s de Internet. Un caso de uso t\u00edpico puede ser permitir al acceso a servicios de una intranet de forma segura desde Internet. \u00a0Otro caso t\u00edpico de uso es interconectar redes locales [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":4,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"","footnotes":""},"categories":[10,70,7,1],"tags":[178,100,101,172],"class_list":["post-480","post","type-post","status-publish","format-standard","hentry","category-asle","category-comos","category-flisol","category-general","tag-comos","tag-openvpn","tag-seguridades","tag-software-libre"],"_links":{"self":[{"href":"https:\/\/rafael.bonifaz.ec\/blog\/wp-json\/wp\/v2\/posts\/480","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rafael.bonifaz.ec\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rafael.bonifaz.ec\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rafael.bonifaz.ec\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rafael.bonifaz.ec\/blog\/wp-json\/wp\/v2\/comments?post=480"}],"version-history":[{"count":2,"href":"https:\/\/rafael.bonifaz.ec\/blog\/wp-json\/wp\/v2\/posts\/480\/revisions"}],"predecessor-version":[{"id":482,"href":"https:\/\/rafael.bonifaz.ec\/blog\/wp-json\/wp\/v2\/posts\/480\/revisions\/482"}],"wp:attachment":[{"href":"https:\/\/rafael.bonifaz.ec\/blog\/wp-json\/wp\/v2\/media?parent=480"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rafael.bonifaz.ec\/blog\/wp-json\/wp\/v2\/categories?post=480"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rafael.bonifaz.ec\/blog\/wp-json\/wp\/v2\/tags?post=480"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}