Apartamento En Familia

Apartamento En Familia
Apartamento de playa para vacaciones. http://www.apartamentoenfamilia.es. Número registro HUTT-005768

lunes, 19 de abril de 2010

Instalar un servidor y cliente OpenVPN en Ubuntu

OpenVPN es una solución de conectividad basada en software: SSL (Secure Sockets Layer) VPN Virtual Private Network (red virtual privada), OpenVPN ofrece conectividad punto-a-punto con validación jerárquica de usuarios y host conectados remotamente, resulta una muy buena opción en tecnologías Wi-Fi (redes inalámbricas EEI 802.11) y soporta una amplia configuración, entre ellas balanceo de cargas entre otras. Está publicado bajo la licencia GPL, de software libre.

Ninguna otra solución ofrece una mezcla semejante de seguridad a nivel empresarial, seguridad, facilidad de uso y riqueza de características.
Es una solución multiplataforma que ha simplificado mucho la configuración de VPN's dejando atrás los tiempos de otras soluciones difíciles de configurar como IPsec y haciéndola más accesible para gente inexperta en este tipo de tecnología.
Supongamos que necesitamos comunicar diferentes sucursales de una organización. A continuación veremos algunas soluciones que se han ofrecido como respuesta a este tipo de necesidades.
En el pasado las comunicaciones se realizaban por correo, teléfono o fax. Hoy en día hay factores que hacen necesaria la implementación de soluciones más sofisticadas de conectividad entre las oficinas de las organizaciones a lo largo del mundo.
Dichos factores son:
  • La aceleración de los procesos de negocios y su consecuente aumento en la necesidad de intercambio flexible y rápido de información.
  • Muchas organizaciones tienen varias sucursales en diferentes ubicaciones así como también tele trabajadores remotos desde sus casas, quienes necesitan intercambiar información sin ninguna demora, como si estuvieran físicamente juntos.
  • La necesidad de las redes de computación de cumplir altos estándares de seguridad que aseguren la autenticidad, integridad y disponibilidad.
 (Fuente Wikipedia)

Instalación

Primero definamos algunos puntos:
Servidor: es el equipo que aceptará las conexiones de los clientes a través de la VPN. En mi ejemplo usará el IP x.y.z.w (reemplaza por el IP público de tu servidor) y tiene como nombre servo.
Cliente: el equipo que se conectará al servidor a través de la VPN. Lo llamaremos cliento.
Red privada: la red que definiremos en nuestra VPN, usaremos 10.8.0.0 por lo que tendremos IP's como 10.8.0.1, 10.8.0.2, etc.
Todos los comandos deben ser ejecutados por root o través de sudo.
Los comandos que debes escribir están en negrita.
Para comentar una línea en openvpn.conf usa # al inicio de la línea.
Lo primero es instalar OpenVPN:
sudo apt-get install openvpn
OpenVPN se instala tanto en el cliente como en el servidor, el archivo de configuración que usaremos al iniciar OpenVPN más adelante definirá el rol de cada equipo.
Ahora comenta todas las líneas en /etc/default/openvpn y añade:
AUTOSTART="openvpn"
Esto le dice a OpenVPN cuál archivo de configuración predeterminado utilizará al iniciar el servicio. Los archivos de configuración se guardan en /etc/openvpn y usan la extensión .conf por lo que la instrucción de arriba le dice a OpenVPN que use /etc/openvpn/openvpn.conf, es un archivo que aún no existe y que crearemos en un momento.
Ahora el servicio OpenVPN puede ser iniciado, detenido o reiniciado en la forma usual, veamos:
Iniciar OpenVPN:
/etc/init.d/openvpn start
Detener OpenVPN:
/etc/init.d/openvpn stop
Reiniciar OpenVPN:
/etc/init.d/openvpn restart
Cada vez que se cambian parámetros en /etc/openvpn/openvpn.conf se debe reiniciar OpenVPN.
Crear claves y certificados
Pero antes de continuar crearemos los certificados y claves de seguridad. Todo esto se hace en el servidor como root. Ejecuta:
cd /etc/openvpn/
Y ahora copia el directorio easy-rsa a /etc/openvpn:
cp -r /usr/share/doc/openvpn/examples/easy-rsa/ .
Recuerda que seguimos en el directorio /etc/openvpn. Ahora editaré el archivo vars con nuestro editor favorito (reemplaza vi con el que tú prefieras):
vi easy-rsa/vars
Comenta esta línea:
#export D=`pwd`
Añade esta:
export D=/etc/openvpn/easy-rsa
Y modifica los siguientes parámetros:
export KEY_COUNTRY=PE
export KEY_PROVINCE=LI
export KEY_CITY=Lima
export KEY_ORG="Nombre-OpenVPN"
export KEY_EMAIL="tu-nombre@example.com"
Graba y cierra el archivo.
Ahora ejecuta:
../vars
Importante, eso es un punto, un espacio y luego otro punto y seguido por /vars. Muchos lo olvidan. A continuación:
./clean-all
El siguiente comando crea la autoridad de certificados (CA) usando los parámetros arriba definidos, solo deberás añadir Common Name, yo usé OpenVPN-CA. Este paso usa OpenSSL y si no lo tenías en tu servidor deberás instalarlo primero con:
sudo apt-get install openssl
Ahora sí:
./build-ca
Ahora creamos las claves, primero para el servidor:
./build-key-server server
Esta parte es muy importante. Cuando build-key-server te solicite Common Name escribe server, el mismo parámetro que le diste al comando. Hay dos preguntas más: Sign the certificate? [y/n] y 1 out of 1 certificate requests certified, commit? [y/n], responde afirmativamente en ambos casos. Y ahora la clave para el cliente:
./build-key client1
Recuerda usar client1 como Common Name, al igual que el parámetro que usaste para build-key. Si vas a tener más clientes puedes repetir este último paso para client2, client3, etc. Ahora genera parámetros Diffie Hellman:
./build-dh
Ahora debes tener un nuevo directorio con claves y certificados en tu servidor: /etc/openvpn/easy-rsa/keys. Para configurar tu primer cliente copia los siguientes archivos de servidor a cliente:
  • ca.crt
  • client1.crt
  • client1.key
Lo ideal es usar un canal seguro, yo prefiero scp con autenticación RSA (tema para otro artículo), ejecutando algo como esto en el cliente:
scp alexis@servo:ca.crt .
scp alexis@servo:client1.crt .
scp alexis@servo:client1.key .
Estos comandos asumen que copiaste los archivos al directorio personal del usuario alexis en el servidor y les asignaste permisos de lectura. Luego debes moverlos a /etc/openvpn en el cliente. Los archivos de configuración: openvpn.conf Aún en el cliente crea un archivo llamado openvpn.conf en /etc/openvpn y escribe lo siguiente en él:
dev tun
client
proto tcp
remote x.y.z.w 1194
resolv-retry infinite
nobind
user nobody
group nogroup
# Try to preserve some state across restarts.
persist-key
persist-tun
ca ca.crt
cert client1.crt
key client1.key
comp-lzo
# Set log file verbosity.
verb 3 
No olvides reemplazar x.y.z.w por el IP público de tu servidor.
Ahora en el servidor crea un archivo openvpn.conf en /etc/openvpn y escribe lo siguiente en él:
dev tun
proto tcp
port 1194
ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/server.crt
key /etc/openvpn/easy-rsa/keys/server.key
dh /etc/openvpn/easy-rsa/keys/dh1024.pem
user nobody
group nogroup
server 10.8.0.0 255.255.255.0
persist-key
persist-tun
#status openvpn-status.log
#verb 3
client-to-client
push "redirect-gateway def1"
#log-append /var/log/openvpn
comp-lzo 
En mi primeras pruebas tuve conexiones muy lentas y me ayudó desactivar la compresión en cliente y servidor comentando esta línea:
#comp-lzo
Y finalmente configura IP forwarding e iptables para NAT en el servidor:
echo 1 > /proc/sys/net/ipv4/ip_forward
sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
Puedes verificar que la regla fue escrita correctamente con un listado:
sudo iptables -L -t nat
Si tienes un Firewall deberás desactivarlo para probar y luego crear reglas que permitan que el tráfico de tu VPN pase.
Si quieres remover todas las reglas si cometiste un error con:
sudo iptables -F -t nat
Reiniciar OpenVPN en ambos equipos, cliente y servidor, y deberías estar listo.
Si ahora ejecutas ifconfig y route -n deberías ver una nueva interfaz, tun0, en cliente y servidor.
Puedes confirmar que hay conexíon haciendo ping entre ambos usando los IP de las interfaces tun0, por ejemplo:
ping 10.8.0.1
Ahora tu cliente está conectado al servidor a través de OpenVPN y puedes navegar en forma segura a través del IP del servidor (y usar Hulu y Pandora).


OpenVPN Auth-LDAP Plugin

Descripció:
El Plugin OpenVPN Auth-LDAP implementa una autenticación mediante  nombre_usuario/contraseña via LDAP para el OpenVPN 2.x.

Características:
* User authentication against LDAP.
   * Simple Apache-style configuration file.
   * LDAP group-based access restrictions.
   * Integration with the OpenBSD packet filter, supporting adding and removing VPN clients from PF tables based on group membership.
   * Tested against OpenLDAP, the plugin will authenticate against any LDAP server that supports LDAP simple binds -- including Active Directory. 
Requerimientos para la compilación:
* OpenLDAP Headers and Library
   * GNU Objective-C Compiler
   * OpenVPN Plugin Header (included with the OpenVPN sources)
   * re2c (used for the configuration file lexer) 

Para compilarlo necesitaras configurar las fuentes apropiadamente:

./configure --prefix=/usr/local --with-openldap=/usr/local --with-openvpn=/usr/ports/security/openvpn/work/openvpn-2.0.2

El módulo se compilara en src/openvpn-auth-ldap.so y se instalará en ${prefix}/lib/openvpn-auth-ldap.so.

Uso:
Añaderi lo siguiente en tu configuración de OpenVPN: (la ruta puede variar)
plugin /usr/local/lib/openvpn-auth-ldap.so ""



El fichero de configuración del plugin es:

/etc/openvpn/ldap-openvpn

Las directivas interesantes son las que le indican el servidor LDAP y la base del directorio donde tiene que valida a los usuarios:

#LDAP server URL
URL     ldap://mi_server_ldap



#Base DN

BaseDN    "dn=dn_name,dc=dc_name"

También podemos indicar el servidor secundario de ldap.

Los logs se guardan en: /etc/openvpn/openvpn-status.log



Para instalar el cliente openvpn simplemente tenemos que hacerlo del siguiente modo:




apt-get install openvpn

6 comentarios:

  1. Hola Eduardo... me parece excelente tu tutorial... una consulta... yo tengo el ubuntu 10.04 y dentro del directorio /easy-rsa no esta ningún archivo "vars" sino que existen dos directorios... el "1.0" y el "2.0" y dentro de cada uno de esos directorios si esta el "vars"... con cual de los dos trabajo??
    gracias por tu ayuda...

    ResponderEliminar
  2. usa el 2.0 amigo,
    y una cosa mas eduardo segui tu tutorial y todo me salio bien, hice ping con 10.8.0.1 mi vpn consta de dos equipos con ubuntu 9, los dos tienen instalado el servidor samba y el cliente samba mi pregunta es puedo desde la barra de direcciones de el cliente vpn escribir smb://10.8.0.1 y acceder al los archivos compartidos en el servidor

    ResponderEliminar
  3. No me funciono, ni siquiera me levanto el servicio en el servidor

    ResponderEliminar
  4. Werner:
    puedes usar el que quieras, pero el 2.0 puede estar bien.

    Eduardo: En tu barra de direcciones, si usas el navegador de archivos Nautilus (el que viene por defecto en Ubuntu) puedes acceder sin problemas a smb://10.8.0.1 . El enrutado te mandará por la VPN y saldrás por samba. Si tu samba esta configurado para aceptar (host allow en smb.conf) la red VPN, y el iptables también acepta estas peticiones, no deberias tener ningun problema.

    Angelita_caida_traviesa: Dame más datos (distribucion, version, problema, etc). En principio el paquete viene en los repositorios oficiales. Si lo levantas con "sudo" no deberias tener problemas.

    Saludos a los 3.

    ResponderEliminar
  5. Este turorial estaba pensado para la version 7.10 de Ubuntu Pero ahora en la 10.4 no me funciona. Faltan cosas com el parámetro KEYDIR= y otras, ¿Lo has probado realmente con las distribuciones nuevas?

    ResponderEliminar
  6. Se instaló directamente en un Ubuntu 8.04 y luego, pasado un año se pasó a un 10.04.1 (que es donde corre actualmente).


    root@xxxx:~# lsb_release -a
    No LSB modules are available.
    Distributor ID: Ubuntu
    Description: Ubuntu 10.04.1 LTS
    Release: 10.04
    Codename: lucid
    root@xxxx:~# ps fax | grep openvpn | grep sbin
    32659 ? Ss 155:18 /usr/sbin/openvpn --writepid /var/run/openvpn.server.pid --daemon ovpn-server --cd /etc/openvpn --config /etc/openvpn/server.conf --script-security 2

    ResponderEliminar


That u don't know what you've got 'til it's gone