User Tools

Site Tools


informatica:linux:openvpn

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Last revisionBoth sides next revision
informatica:linux:openvpn [2013/07/03 09:02] – external edit 127.0.0.1informatica:linux:openvpn [2018/01/05 10:18] – [Procedimiento generico] javi
Line 1: Line 1:
-====== OpenVPN ======+======= OpenVPN =======
  
  
  
-===== Routed VPN =====+====== Routed VPN ====== 
 + 
 +===== Instalacion y configuracion =====
  
 Esta configuración nos permite conectividad punto a punto entre los distintos clientes y el servidor VPN Esta configuración nos permite conectividad punto a punto entre los distintos clientes y el servidor VPN
Line 13: Line 15:
   sudo aptitude install openvpn openssl   sudo aptitude install openvpn openssl
  
-2. Generate the master Certificate Authority (CA) certificate & key+2. Creamos el archivo vacío donde se almacenarán los certificados revocados: 
 + 
 +  sudo touch /etc/openvpn/crl.pem 
 + 
 +3. Generate the master Certificate Authority (CA) certificate & key
  
 <code> <code>
-cd /usr/share/doc/openvpn/examples/easy-rsa/2.0+cd /usr/share/easy-rsa
 sudo su sudo su
 vim vars vim vars
Line 26: Line 32:
 export KEY_PROVINCE="BC" export KEY_PROVINCE="BC"
 export KEY_CITY="Barcelona" export KEY_CITY="Barcelona"
-export KEY_ORG="Jamgo+export KEY_ORG="example.com
-export KEY_EMAIL="info@jamgo.es" +export KEY_EMAIL="info@example.com"
-export KEY_EMAIL=info@jamgo.es+
 export KEY_CN=cn export KEY_CN=cn
 export KEY_NAME=name export KEY_NAME=name
Line 41: Line 46:
 </code> </code>
  
-3. Generate certificate & key for server+Error:
  
-  ./build-key-server server+<code> 
 +grep: /usr/share/easy-rsa/openssl.cnf: No such file or directory 
 +pkitool: KEY_CONFIG (set by the ./vars script) is pointing to the wrong 
 +version of openssl.cnf: /usr/share/easy-rsa/openssl.cnf 
 +The correct version should have a comment that says: easy-rsa version 2.x 
 +</code>
  
-4. Generate certificates & keys for a client+Solución:
  
-  ./build-key client1+  ln -s openssl-1.0.0.cnf openssl.cnf
  
-5. Generate Diffie Hellman parameters+Y volver a intentar:
  
-  ./build-dh+  ./build-ca 
 +   
 +Error:
  
-6Mover llaves+<code> 
 +unable to find 'distinguished_name' in config 
 +problems making Certificate Request 
 +1995425184:error:0E06D06A:configuration file routines:NCONF_get_string:no conf or environment variable:../crypto/conf/conf_lib.c:272: 
 +</code>
  
-6.1 Servidor (todavia como root)+Desconozco el motivo, pero se resuleve editando las lineas en las que se le asigna un valor a la variable "subjectAltName", en mi caso 2 veces:
  
-  mkdir -p /etc/openvpn/keys/server +  vim openssl.cnf 
-  cd /usr/share/doc/openvpn/examples/easy-rsa/2.0 +   
-  cp keys/ca.crt /etc/openvpn/keys/server; mv keys/server.* /etc/openvpn/keys/server; mv keys/client1.* /etc/openvpn/keys/ ; mv keys/dh1024.pem /etc/openvpn/keys/server+Y cambio los valores:
  
-6.2 Cliente+<code> 
 +# anyadido 
 +#subjectAltName=$ENV::KEY_ALTNAMES 
 +subjectAltName=email:copy 
 +</code> 
 + 
 +Y volver a intentar: 
 + 
 +  ./build-ca 
 + 
 +Ahora a contestar las preguntas y pulsar "enter" al final de cada una:
  
 <code> <code>
-cd /etc/openvpn/keys +Country Name (2 letter code) [US]:ES 
-tar cvfj client1.tar.bz2 client1.key client1.crt ca.crt +State or Province Name (full name) [BC]: 
-scp client1.tar.bz2  user@client.machine.com:/tmp/ +Locality Name (eg, city) [Barcelona]: 
-rm -fr client1.tar.bz2+Organization Name (eg, company) [Contrabanda FM]: 
 +Organizational Unit Name (eg, section) [Tècnica]: 
 +Common Name (eg, your name or your server's hostname) [ContrabandaFM]: 
 +Name [EasyRSA]: 
 +Email Address [admin@example.com]:
 </code> </code>
  
-On the client machine:+4. Generar claves del servidor (solo 1 vez) 
 + 
 +4.1. Generate certificate & key for server 
 + 
 +  ./build-key-server server 
 + 
 +Ahora a contestar las preguntas y pulsar "enter" al final de cada una:
  
 <code> <code>
-sudo su +Country Name (2 letter code) [US]:ES 
-mkdir /etc/openvpn/company1 +State or Province Name (full name) [BC]: 
-mv /tmp/client1.tar.bz2 /etc/openvpn/company1 +Locality Name (eg, city) [Barcelona]: 
-cd /etc/openvpn/company1 +Organization Name (eg, company) [Contrabanda FM]: 
-tar xvfj client1.tar.bz2+Organizational Unit Name (eg, section) [Tècnica]: 
 +Common Name (eg, your name or your server's hostname) [ContrabandaFM]: 
 +Name [EasyRSA]: 
 +Email Address [admin@example.com]:
 </code> </code>
  
-7. Creating configuration files for server and clients+Las contraseñas las dejo en blanco:
  
-7.Server+  A challenge password []: 
 +  An optional company name []: 
 + 
 +Y aquí hay que pulsar "y" más "enter": 
 + 
 +  Sign the certificate? [y/n]: 
 +  out of 1 certificate requests certified, commit? [y/n] 
 + 
 +4.2. Generate Diffie Hellman parameters 
 + 
 +**OJO**: puede llevar mucho tiempo, unos 15 minutos: 
 +  
 +  ./build-dh 
 + 
 +4.3. Mover llaves (revisar, no estoy seguro de que haya que mover en lugar de copiar nada): 
 + 
 +  mkdir -p /etc/openvpn/keys/server 
 +  cp keys/ca.crt /etc/openvpn/keys/server; mv keys/server.* /etc/openvpn/keys/server; mv keys/dh1024.pem /etc/openvpn/keys/server 
 + 
 +5. Crear el archivo de configuracion:
  
 <code> <code>
Line 90: Line 148:
 vim server.conf vim server.conf
 </code> </code>
 +
 +Yo lo he dejado asi:
  
 <code> <code>
-... +port 443 
-ca /etc/openvpn/keys/ca.crt +proto tcp 
-cert /etc/openvpn/keys/server.crt +dev tun 
-key /etc/openvpn/keys/server.key +ca /etc/openvpn/keys/server/ca.crt 
-dh /etc/openvpn/keys/dh1024.pem+cert /etc/openvpn/keys/server/server.crt 
 +key /etc/openvpn/keys/server/server.key  
 +dh /etc/openvpn/keys/server/dh2048.pem 
 +server 172.16.0.0 255.255.255.0 
 +ifconfig-pool-persist ipp.txt 
 +push "route 10.0.0.0 255.255.255.0" 
 +push "route 10.7.13.0 255.255.255.0" 
 +push "dhcp-option DNS 10.0.0.10" 
 +push "dhcp-option DOMAIN local.example.com"
 client-to-client client-to-client
 +keepalive 10 120
 +comp-lzo
 user nobody user nobody
 group nogroup group nogroup
 +persist-key
 +persist-tun
 +status openvpn-status.log
 +log         /var/log/openvpn.log
 +log-append  /var/log/openvpn.log
 +verb 3
 crl-verify /etc/openvpn/crl.pem crl-verify /etc/openvpn/crl.pem
-... 
 </code> </code>
  
-Creamos el archivo vacío donde se almacenarán los certificados revocados:+Hay muchas opciones ("port", "proto" y "dev" por ejemplo) que tienen que concordar con las que se especifiquen en el archivo de configuracion del cliente.
  
-  sudo touch /etc/openvpn/crl.pem+===== Generar claves de los clientes =====
  
-7.2 Client 
  
-On the client machine:+ 
 +==== Procedimiento generico ==== 
 + 
 +Para cada nuevo cliente se tiene que repetir este proceso completo. 
 + 
 +1. Convertirse en root y entrar en el directorio: 
 + 
 +  sudo su 
 +  cd /usr/share/easy-rsa 
 + 
 +2. Reiniciar vars: 
 + 
 +  source ./vars 
 + 
 +3. Generar certificado y llave para el cliente "cliente1" 
 + 
 +  ./build-key client1 
 + 
 +Contestar las preguntas, presionar "enter" para aceptar los valores propuestos:
  
 <code> <code>
-cd /usr/share/doc/openvpn/examples/sample-config-files +Country Name (2 letter code) [US]:ES 
-cp client.conf /etc/openvpn/company1.conf +State or Province Name (full name) [BC]: 
-vim /etc/openvpn/company1.conf+Locality Name (eg, city) [Barcelona]: 
 +Organization Name (eg, company) [Contrabanda FM]: 
 +Organizational Unit Name (eg, section) [Tècnica]: 
 +Common Name (eg, your name or your server's hostname) [client1]: 
 +Name [EasyRSA]: 
 +Email Address [admin@example.com]:
 </code> </code>
 +
 +Las contraseñas las dejo en blanco:
 +
 +  A challenge password []:
 +  An optional company name []:
 +
 +Y aquí hay que pulsar “y” más “enter”:
 +
 +  Sign the certificate? [y/n]:
 +  1 out of 1 certificate requests certified, commit? [y/n]
 +
 +
 +4. Mover las llaves y copiar la clave publica de la CA a un directorio:
 +
 +  mkdir -p ~/openvpn/client1
 +  user="client1" && cp keys/ca.crt ~/openvpn/$user/ && cp keys/$user.crt keys/$user.key ~/openvpn/$user/
 +
 +5. Crear el archivo de configuracion del cliente (hay un ejemplo en /usr/share/doc/openvpn/examples/sample-config-files
 +):
 +
 +  user="client1" && vim ~/openvpn/$user/$user.conf
 +  
 +Con el siguiente contenido:
 +
 +5.1.1. Si queremos que el cliente OpenVPN tome el servidor DNS del servidor VPN:
  
 <code> <code>
-... +client 
-ca /etc/openvpn/company1/ca.crt +dev tun 
-cert /etc/openvpn/company1/client1.crt +proto tcp 
-key /etc/openvpn/company1/client1.key +remote vpn.example.com 443 
-remote vpn.server.com 1194 +resolv-retry infinite 
-...+nobind 
 +user nobody 
 +group nogroup 
 +persist-key 
 +persist-tun 
 +ca /etc/openvpn/client1/ca.crt 
 +cert /etc/openvpn/client1/client1.crt 
 +key /etc/openvpn/client1/client1.key 
 +ns-cert-type server 
 +comp-lzo 
 +verb 4 
 +log         /var/log/openvpn/client1.log 
 +log-append  /var/log/openvpn/client1.log 
 + 
 +# If we want to get DNS server from VPN 
 +script-security 2 
 +up /etc/openvpn/update-resolv-conf 
 +down /etc/openvpn/update-resolv-conf
 </code> </code>
  
-**IMPORTANTE**: hay variables que tienen que ser idénticas en el archivo de configuración del servidor y de todos los clientes, como "port", "proto", etc...+En este caso el servidor se llama "vpn.example.com" y escucha en el puerto TCP 443.
  
-8Starting up the VPN and testing for initial connectivity+5.1.2. Crear el script para tomar el servidor DNS al conectarse al servidor VPN:
  
-8.1 (Opcional) Abrir el puerto y protocolo definido en el archivo de configuración en el firewall (UDP 1194 por defecto)+  vim ~/openvpn/client1/update-resolv-conf 
 +   
 +Con el siguiente contenido:
  
-8.2 (Opcional) Si se quiere que los clientes puedan acceder además de al servidor VPN a otras máquinas que estén en la red privada (LAN) de éste, y si el gateway de esa LAN NO es el servidor VPN, en el servidor VPN hay que activar masquerade.+<code> 
 +#!/bin/bash 
 +#  
 +# Parses DHCP options from openvpn to update resolv.conf 
 +# To use set as 'up' and 'down' script in your openvpn *.conf: 
 +# up /etc/openvpn/update-resolv-conf 
 +# down /etc/openvpn/update-resolv-conf 
 +
 +# Used snippets of resolvconf script by Thomas Hood and Chris Hanson. 
 +# Licensed under the GNU GPL.  See /usr/share/common-licenses/GPL.  
 +#  
 +# Example envs set from openvpn: 
 +
 +#     foreign_option_1='dhcp-option DNS 193.43.27.132' 
 +#     foreign_option_2='dhcp-option DNS 193.43.27.133' 
 +#     foreign_option_3='dhcp-option DOMAIN be.bnc.ch' 
 +
 + 
 +[ -x /sbin/resolvconf ] || exit 0 
 +[ "$script_type" ] || exit 0 
 +[ "$dev" ] || exit 0 
 + 
 +split_into_parts() 
 +
 + part1="$1" 
 + part2="$2" 
 + part3="$3" 
 +
 + 
 +case "$script_type" in 
 +  up) 
 + NMSRVRS="" 
 + SRCHS="" 
 + for optionvarname in ${!foreign_option_*} ; do 
 + option="${!optionvarname}" 
 + echo "$option" 
 + split_into_parts $option 
 + if [ "$part1" = "dhcp-option" ] ; then 
 + if [ "$part2" = "DNS" ] ; then 
 + NMSRVRS="${NMSRVRS:+$NMSRVRS }$part3" 
 + elif [ "$part2" = "DOMAIN" ] ; then 
 + SRCHS="${SRCHS:+$SRCHS }$part3" 
 + fi 
 + fi 
 + done 
 + R="" 
 + [ "$SRCHS" ] && R="search $SRCHS 
 +
 + for NS in $NMSRVRS ; do 
 +        R="${R}nameserver $NS 
 +
 + done 
 + echo -n "$R" | /sbin/resolvconf -a "${dev}.openvpn" 
 + ;; 
 +  down) 
 + /sbin/resolvconf -d "${dev}.openvpn" 
 + ;; 
 +esac 
 +</code> 
 + 
 +5.1.1. Si **NO** queremos que el cliente OpenVPN tome el servidor DNS del servidor VPN: 
 + 
 +<code> 
 +client 
 +dev tun 
 +proto tcp 
 +remote vpn.example.com 443 
 +resolv-retry infinite 
 +nobind 
 +user nobody 
 +group nogroup 
 +persist-key 
 +persist-tun 
 +ca /etc/openvpn/client1/ca.crt 
 +cert /etc/openvpn/client1/client1.crt 
 +key /etc/openvpn/client1/client1.key 
 +ns-cert-type server 
 +comp-lzo 
 +verb 4 
 +log         /var/log/openvpn/client1.log 
 +log-append  /var/log/openvpn/client1.log 
 +</code> 
 + 
 +En este caso el servidor se llama "vpn.example.com" y escucha en el puerto TCP 443. 
 + 
 +6. Empaquetar todos los archivos para poder transferirlos comodamente al cliente: 
 + 
 +  cd ~/openvpn/client1 
 +  tar cvfj ~/openvpn/client1.tar.bz2 * 
 +   
 +7. Copiar del servidor al cliente el archivo comprimido y luego eliminarlo: 
 + 
 +  scp ~/openvpn/client1.tar.bz2 user@client1.example.com:/tmp/ 
 +  rm -fr ~/openvpn 
 +   
 +8. (Maquina cliente) Asumo que ya esta instalado el paquete "openvpn". Descomprimir archivos, moverlos y darles permisos 
 + 
 +  sudo mv /tmp/client1.tar.bz2 /etc/openvpn 
 +  sudo tar xvfj client1.tar.bz2 
 +  sudo chown root:root client1* 
 +  sudo chmod 0700 client1 
 +  sudo chmod 0600 client1/* 
 +   
 +Si optamos por tomar las DNS del servidor VPN: 
 + 
 +  sudo chmod 0700 update-resolv-conf 
 + 
 +9. Starting up the VPN and testing for initial connectivity 
 + 
 +9.1 (Opcional) Abrir el puerto y protocolo definido en el archivo de configuración en el firewall (UDP 1194 por defecto) 
 + 
 +9.2 (Opcional) Si se quiere que los clientes puedan acceder además de al servidor VPN a otras máquinas que estén en la red privada (LAN) de éste, y si el gateway de esa LAN NO es el servidor VPN, en el servidor VPN hay que activar masquerade. 
 + 
 +9.3 Arrancar (mismo comando en el servidor y en todos los clientes): 
 + 
 +  sudo service openvpn start 
 +   
 +==== Migracion a openvpn >=2.3 ====
  
-8.3 Arrancar:+**IMPORTANTE**: realizar los siguientes pasos **UNA** sola vez, en caso de migrar a openvpn >=2.3
  
-  sudo /etc/init.d/openvpn start+0Instalar paquete, ahora ya NO es parte de openvpn
  
 +  sudo aptitude install easy-rsa
  
 +1. **IMPORTANTE**: mover certificados de la CA, lista de revocados, etc... a nueva ubicacion:
  
 +  cd /usr/share/easy-rs
 +  mv keys keys.old
 +  sudo mv /usr/share/doc/openvpn/examples/easy-rsa/2.0/keys/ /usr/share/easy-rsa
  
-===== Acceso desde el cliente a la LAN del servidor VPN (gateway de la LAN y servidor VPN son distintos) =====+====== Acceso desde el cliente a la LAN del servidor VPN (gateway de la LAN y servidor VPN son distintos) ======
  
 Queremos que desde el cliente se llegue no solo al servidor VPN, sino también a la LAN de ese servidor. La particularidad es que el servidor VPN es una máquina virtual detrás de un Hipervisor KVM. Además el Hipervisor KVM está detrás de un router ADSL casero en modo DMZ, de forma que TODO el tráfico lo redirige hacia el Hipervisor. Queremos que desde el cliente se llegue no solo al servidor VPN, sino también a la LAN de ese servidor. La particularidad es que el servidor VPN es una máquina virtual detrás de un Hipervisor KVM. Además el Hipervisor KVM está detrás de un router ADSL casero en modo DMZ, de forma que TODO el tráfico lo redirige hacia el Hipervisor.
Line 295: Line 558:
   ping 10.0.0.12   ping 10.0.0.12
  
-===== Configurar DNS en el cliente =====+====== Configurar DNS en el cliente ======
  
 Para que el cliente reciba del servidor VPN parámetros como servidor DNS o Dominio de búsqueda necesitamos configuración tanto en el servidor como en el cliente, y un script en el lado cliente. Si la máquina es Windows el script no es necesario. Para que el cliente reciba del servidor VPN parámetros como servidor DNS o Dominio de búsqueda necesitamos configuración tanto en el servidor como en el cliente, y un script en el lado cliente. Si la máquina es Windows el script no es necesario.
Line 418: Line 681:
 </code> </code>
  
-===== Revocar certificados =====+====== Revocar certificados ======
  
 http://openvpn.net/index.php/open-source/documentation/howto.html#revoke http://openvpn.net/index.php/open-source/documentation/howto.html#revoke
Line 475: Line 738:
 </code> </code>
  
-====== Receta 2 (parcialmente incompleta) ======+======= Receta 2 (parcialmente incompleta) =======
  
-===== Instalar OPENVPN =====+====== Instalar OPENVPN ======
   # apt-get install openvpn   # apt-get install openvpn
-===== Crear certificados =====+====== Crear certificados ======
  
-==== Generar la CA para firmar los certificados ====+===== Generar la CA para firmar los certificados =====
 Copiamos el directorio de ejemplo en la carpeta de configuración de OpenVPN: Copiamos el directorio de ejemplo en la carpeta de configuración de OpenVPN:
   #/usr/share/doc/openvpn/examples# cp -R easy-rsa/ /etc/openvpn/   #/usr/share/doc/openvpn/examples# cp -R easy-rsa/ /etc/openvpn/
Line 528: Line 791:
   -rw-r--r-- 1 root root    3 Nov  6 21:20 serial   -rw-r--r-- 1 root root    3 Nov  6 21:20 serial
  
-===== Creación de Certificado y llaves para Servidor =====+====== Creación de Certificado y llaves para Servidor ======
  
  
Line 577: Line 840:
  
  
-===== Generar Certificado para los clientes =====+====== Generar Certificado para los clientes ======
  
   ./build-key client1   ./build-key client1
Line 607: Line 870:
   Please enter the following 'extra' attributes   Please enter the following 'extra' attributes
   to be sent with your certificate request   to be sent with your certificate request
-  A challenge password []:fermin99+  A challenge password []:mysecretpassword
   An optional company name []:   An optional company name []:
   Using configuration from /etc/openvpn/easy-rsa/2.0/openssl.cnf   Using configuration from /etc/openvpn/easy-rsa/2.0/openssl.cnf
Line 630: Line 893:
  
  
-===== Generate Diffie Hellman parameters =====+====== Generate Diffie Hellman parameters ======
 Diffie Hellman parameters must be generated for the OpenVPN server. On Linux/BSD/Unix: Diffie Hellman parameters must be generated for the OpenVPN server. On Linux/BSD/Unix:
  
Line 636: Line 899:
  
  
-===== Ficheros de configuración =====+====== Ficheros de configuración ======
   donquixot:/etc/openvpn# cp -R /usr/share/doc/openvpn/examples/sample-config-files/ config-files   donquixot:/etc/openvpn# cp -R /usr/share/doc/openvpn/examples/sample-config-files/ config-files
  
  
-===== Habilitar para máquinas virtuales contenedores openvz =====+====== Habilitar para máquinas virtuales contenedores openvz ======
   vzctl set 101 --devnodes net/tun:rw --save   vzctl set 101 --devnodes net/tun:rw --save
  
Line 698: Line 961:
 Y la ruta 10.8.0.0/24 -> 10.139.67.103 (ip del servidor vpn) Y la ruta 10.8.0.0/24 -> 10.139.67.103 (ip del servidor vpn)
  
-===== Autenticación LDAP =====+====== Autenticación LDAP ======
  
   /etc/openvpn/auth/auth-ldap.conf   /etc/openvpn/auth/auth-ldap.conf
informatica/linux/openvpn.txt · Last modified: 2018/01/05 14:20 by javi