Herramientas de usuario

Herramientas del sitio


servidores:general:openvpn_serverandclients

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anterior Revisión previa
Próxima revisión
Revisión previa
servidores:general:openvpn_serverandclients [2009/10/31 21:15]
fmolinuevo
servidores:general:openvpn_serverandclients [2014/08/20 13:56]
fmolinuevo [Configuración de Shorewall para el caso que el servidor OpenVPN esté en el propio firewall]
Línea 1: Línea 1:
 +====== OpenVPN: configuración ======
 +
 +//Por Félix Molinuevo, [[fmsi>​|FMSI Sistemas de Informática]]//​
 +
 +
 +===== Introducción =====
 +
 +Este tutorial explica cómo configurar un servidor OpenVPN utilizando el método de routing en vez de bridging, [[http://​openvpn.net/​faq.html#​bridge1|por las razones expuestas aquí]].
 +
 +Se hará uso de **easy-rsa**. Esto es una colección de scripts que facilitan el manejo de certificados,​ tanto del servidor como de los clientes. Dicho directorio easy-rsa/ deberá ser copiado de la ubicación original instalada por el paquete OpenVPN al directorio de configuración en /​etc/​openvpn.
 +
 +  cp -iva /​usr/​share/​doc/​openvpn/​examples/​easy-rsa/​2.0 /​etc/​openvpn/​easy-rsa
 +
 +Tal como se menciona en la documentación y por las razones allí indicadas, se muestran aquí --y se recomienda usar-- direcciones IP de clase A para el túnel (10.8.0.0/​24) y de clase B para la intranet (172.16.10.0/​24).
 +
 +===== Instalación de paquetes =====
 +
 +Para OpenVPN, se instalaron los siguientes paquetes:
 +
 +  * openvpn
 +  * openssl
 +  * bridge-utils
 +
 +  aptitude install openvpn openssl bridge-utils
 +
 +
 +===== Creación del certificado y la clave Certificate Authority (CA) =====
 +
 +Los scripts para trabajar con certificados estarán en /​etc/​openvpn/​easy-rsa luego de copiar dicho directorio tal como se explica más arriba.
 +
 +En Lenny, Easy-RSA viene en las versiones 1.0 y 2.0. Se usará 2.0 en este tutorial.
 +
 +**Recordar editar las variables del archivo "​vars"​** con los valores correctos para el servidor en cuestión. Adicionalmente,​ si se desea generar un CA con contraseña,​ tipear el parámetro "​--pass"​ para el script build-ca
 +
 +  cd /​etc/​openvpn/​easy-rsa/​
 +  . ./vars
 +  ./clean-all
 +  ./build-ca --pass
 +
 +  ./​build-key-server server
 +
 +===== Generación de los parámetros Diffie Hellman =====
 +
 +  ./build-dh
 +
 +===== Creación de los certificados y claves de cada cliente =====
 +
 +Sin contraseña:​
 +
 +  . ./vars
 +  ./build-key client1
 +  ./build-key client2
 +  ./build-key client3
 +
 +Con contraseña:​
 +
 +  . ./vars
 +  ./​build-key-pass client1
 +  ./​build-key-pass client2
 +  ./​build-key-pass client3
 +
 +En cada cliente, se deben copiar en el directorio config/ los siguientes archivos: **ca.crt** (el CA parte pública del servidor), **client1.crt**,​ **client1.key** y **client1.csr**.
 +
 +Si se usan varios servidores OpenVPN distintos, se puede cambiar los nombres de cada uno, para diferenciarlos,​ reflejando dichos cambios en los archivos de configuración del cliente; estos archivos de configuración del cliente también pueden ser varios. El cliente OpenVPN GUI luego mostrará un menú con los distintos servidores para los cuales está configurado,​ permitiendo establecer uno o más túneles simultáneamente o no.
 +
 +==== Creación del archivo crl.pem (Certificate Revocation List) y permisos ====
 +
 +Para generar el archivo crl.pem, necesario para la revocación de certificados,​ se debe crear un certificado y revocarlo para que dicho archivo se cree y OpenVPN funcione correctamente,​ pero antes se debe comentar en el openssl.cnf (ya sea el easy-rsa o el de OpenSSL instalado en el servidor) la sección PKCS (si no se utiliza) tal como se describe al final de este tutorial:
 +
 +  . ./vars
 +  ./build-key client1
 +  ./​revoke-full client1
 +
 +Adicionalmente,​ como OpenVPN según esta configuración es ejecutado con el uid y gid "​nobody",​ se deben cambiar los permisos del directorio keys para que pueda leer el archivo "​crl.pem":​
 +
 +  chmod o+x keys/
 +
 +===== Revocación de certificados =====
 +
 +Para revocar un certificado se utiliza el siguiente comando:
 +
 +  . ./vars
 +  ./​revoke-full <​common-name>​
 +
 +<​common-name>​ es simplemente el nombre del cliente tal como se creó, según se muestra más arriba. La revocación toma validez inmediatamente:​
 +
 +<​code>​
 +...
 +error 23 at 0 depth lookup:​certificate revoked
 +</​code>​
 +
 +Notar el "error 23" la última línea. Esto es correcto, e indica que la verificación del certificado revocado falló, tal como se desea.
 +
 +Si el usuario ya está conectado, se debe desconectarlo con:
 +
 +  <​Completar>​
 +
 +===== Configuración del servidor =====
 +
 +server.conf:​
 +
 +<​code>​
 +port 1194
 +proto udp
 +dev tun
 +
 +ca /​etc/​openvpn/​easy-rsa/​keys/​ca.crt
 +crl-verify /​etc/​openvpn/​easy-rsa/​keys/​crl.pem
 +cert /​etc/​openvpn/​easy-rsa/​keys/​server.crt
 +key /​etc/​openvpn/​easy-rsa/​keys/​server.key ​ # This file should be kept secret
 +dh /​etc/​openvpn/​easy-rsa/​keys/​dh1024.pem
 +
 +server 10.8.0.0 255.255.255.0
 +
 +ifconfig-pool-persist ipp.txt
 +
 +keepalive 10 120
 +
 +comp-lzo
 +
 +user nobody
 +group nobody
 +
 +persist-key
 +persist-tun
 +
 +status /​var/​log/​openvpn-status.log
 +
 +verb 3
 +
 +push "route 172.16.10.0 255.255.255.0"​
 +push "​dhcp-option WINS 172.16.10.1"​
 +push "​dhcp-option DNS 172.16.10.1"​
 +push "​dhcp-option DOMAIN dominio"​
 +</​code>​
 +
 +Estos comandos "​push"​ le inyectan al cliente la configuración de la ruta, el DNS, el WINS y el dominio, y deben ser los correspondientes a la red que el servidor OpenVPN está sirviendo.
 +
 +===== Cambios en el archivo easy-rsa/​openssl.cnf =====
 +
 +Si no se usa PKCS, la siguiente sección debe estar comentada:
 +
 +<​code>​
 +#pkcs11 = pkcs11_section
 +
 +# [ pkcs11_section ]
 +# engine_id = pkcs11
 +# dynamic_path = /​usr/​lib/​engines/​engine_pkcs11.so
 +# MODULE_PATH = $ENV::​PKCS11_MODULE_PATH
 +# PIN = $ENV::​PKCS11_PIN
 +# init = 0
 +</​code>​
 +
 +Esto es necesario para que la línea "​crl-verify /​etc/​openvpn/​easy-rsa/​keys/​crl.pem"​ del archivo de configuración del servidor no provoque un error e impida iniciar OpenVPN. Dicha línea es necesaria para que la revocación de los certificados funcione.
 +
 +
 +===== Reglas necesarias en el firewall que protege al servidor OpenVPN =====
 +
 +Las siguientes reglas Iptables permiten que Netfilter acepte conexiones entrantes en la interfaz TUN y reenvíe las peticiones hacia dentro de la red:
 +
 +<​code>​
 +iptables -I INPUT -i tun+ -j ACCEPT
 +iptables -I FORWARD -i tun+ -s 10.8.0.0/24 -d 172.16.10.0/​24 -j ACCEPT
 +</​code>​
 +
 +==== Configuración de Shorewall para el caso que el servidor OpenVPN esté en el propio firewall ====
 +
 +En /​etc/​shorewall/​interfaces:​
 +
 +  vpn       tun+
 +
 +En /​etc/​shorewall/​policy:​
 +
 +  vpn       ​loc ​          ​ACCEPT
 +  loc       ​vpn ​          ​ACCEPT
 +  vpn       ​$FW ​          ​ACCEPT
 +  $FW       ​vpn ​          ​ACCEPT
 +
 +En /​etc/​shorewall/​tunnels (aaa.bbb.ccc.ddd es la IP externa del servidor OpenVPN):
 +
 +  openvpn:​1194 ​ net            0.0.0.0/0
 +
 +En /​etc/​shorewall/​zones:​
 +
 +  vpn       ipv4
 +
 +==== Configuración de Shorewall para el caso que el servidor OpenVPN sea interno ====
 +
 +En /​etc/​shorewall/​policy:​
 +
 +  vpn             ​all ​            ​ACCEPT ​         -
 +
 +En /​etc/​shorewall/​rules:​
 +
 +  DNAT            net                     ​loc:​192.168.1.1 ​                ​udp ​            1194
 +
 +En /​etc/​shorewall/​zones:​
 +
 +  vpn     ipv4
 +
 +=== Si se necesita llegar a otros equipos internos en este caso ===
 +
 +Se debe activar IP forwarding en el servidor que está ejecutando el servicio OpenVPN, y generar una regla Netfilter para que realice masquerading (enmascaramiento):​
 +
 +  * En /​etc/​sysctl.conf poner lo siguiente: <​code>​
 +net.ipv4.ip_forward=1
 +</​code>​ y ejecutar sysctl -p
 +  * Agregar la regla con Iptables: <​code>​
 +iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
 +</​code>​ donde 10.8.0.0/24 es la red que corresponde a OpenVPN y eth0 la interfaz interna
 +
 +==== Configuración de Shorewall para road warriors y OpenVPN corriendo en el firewall ====
 +
 +
 +En /​etc/​shorewall/​zones:​
 +
 +  #ZONE   ​TYPE ​  ​OPTIONS ​                ​IN ​                     OUT
 +  #                                      OPTIONS ​                ​OPTIONS
 +  road    ipv4
 +
 +En /​etc/​shorewall/​interfaces:​
 +
 +  #ZONE      INTERFACE ​       BROADCAST ​    ​OPTIONS
 +  road       tun+
 +
 +En /​etc/​shorewall/​tunnels:​
 +
 +  #TYPE               ​ZONE ​          ​GATEWAY ​       GATEWAY ZONE
 +  openvpnserver:​1194 ​ net            0.0.0.0/0
 +
 +Para que los sistemas remotos (road warriors) tengan acceso a la red local, se debe permitir su acceso en /​etc/​shorewall/​policy (asumiendo que la red local haya sido llamada zona "​loc"​):​
 +
 +  #​SOURCE ​     DESTINATION ​       POLICY
 +  road         ​loc ​               ACCEPT
 +
 +
 +===== Configuración del cliente =====
 +
 +En Windows, instalar [[http://​openvpn.se/​|OpenVPN GUI]]. Se deben copiar los archivos del servidor "​ca.crt",​ y los archivos específicos para ese cliente creados en el servidor, por ejemplo "​client1.crt",​ "​client1.csr"​ y "​client1.key",​ al directorio config/, junto con el archivo de configuración que figura a continuación.
 +
 +client.ovpn:​
 +
 +<​code>​
 +client
 +proto udp
 +dev tun
 +remote aaa.bbb.ccc.ddd 1194
 +resolv-retry infinite
 +nobind
 +persist-key
 +persist-tun
 +ca ca.crt
 +cert client1.crt
 +key client1.key
 +comp-lzo
 +verb 3
 +ns-cert-type server
 +</​code>​
 +
 +aaa.bbb.ccc.ddd es la dirección IP del servidor OpenVPN. Se deben cambiar también los valores ca, cert, y key por los correspondientes al cliente.
 +
 +Se puede tener tantos archivos de configuración de cliente .ovpn como se necesiten, simplemente poniéndoles distintos nombres, dejando la misma extensión, y cambiando internamente los valores mencionados.
 +
 +===== Resolución de problemas =====
 +
 +En ocasiones, cuando las redes tienen problemas con el MTU, se puede limitar este valor usando en el servidor algo como:
 +
 +  mssfix 1300
 +  fragment 1300
 +
 +y en el cliente:
 +
 +  fragment 1300
 +
 +Los valores tienen que ser iguales para las tres líneas, tanto en el servidor como en el cliente. Valores comunes son 1200, 1300 o 1400. Se puede probar cuál anda mejor.
 +
 +===== Notas finales =====
 +
 +Esta configuración ha sido probada sobre conexiones de módem 56Kbps, a través de redes inalámbricas,​ y a través de NAT, incluso desde máquinas virtuales Qemu, mostrando siempre funcionar a la perfección.
 +
 +La ventana de estado de OpenVPN GUI tiene un útil botón "​Reconnect"​ que permite reconectar rápidamente la VPN; esto mostró ser muy práctico en las pruebas, ya que cambiábamos de una conexión a otra, y simplemente el pulsar ese botón reconectaba el túnel.
 +
 +===== Bibliografía =====
 +
 +  -OpenVPN Home: http://​openvpn.net/​
 +  -OpenVPN HOWTO: http://​openvpn.net/​howto.html
 +  -OpenVPN Windows HowTo: http://​www.runpcrun.com/​howtoopenvpn
 +  -How to install OpenVPN: http://​www.thebakershome.net/​openvpn_tutorial
 +  -OpenVPN Howto: http://​people.mandriva.com/​~ybourhis/​openvpn/​index.html
 +  -OpenVPN tunnels and bridges: http://​www.shorewall.net/​OPENVPN.html
  
servidores/general/openvpn_serverandclients.txt · Última modificación: 2014/08/20 13:56 por fmolinuevo