jueves, 14 de junio de 2007

Openvpn HOWTO Red Hat EL 5

Openvpn HOWTO


1 Introduccion

¿Qué es una VPN?

La VPN es una tecnología de red que permite una extensión de la red local sobre una red pública o no controlada, como por ejemplo Internet.

El ejemplo más común es la posibilidad de conectar dos o más sucursales de una empresa utilizando como vínculo Internet, permitir a los miembros del equipo de soporte técnico la conexión desde su casa al centro de cómputo, o que un usuario pueda acceder a su equipo doméstico desde un sitio remoto, como por ejemplo un hotel. Todo esto utilizando la infraestructura de Internet.

Para hacerlo posible de manera segura es necesario proveer los medios para garantizar la autenticación, integridad y confidencialidad de toda la comunicación:

Autenticación y autorización: ¿Quién está del otro lado? Usuario/equipo y qué nivel de acceso debe tener.

Integridad: La garantía de que los datos enviados no han sido alterados.

Confidencialidad: Dado que los datos viajan a través de un medio potencialmente hostil como Internet, los mismos son susceptibles de interceptación, por lo que es fundamental el cifrado de los mismos. De este modo, la información no debe poder ser interpretada por nadie más que los destinatarios de la misma.

Tipos de VPN

VPN de acceso remoto

Éste es quizás el modelo más usado actualmente y consiste en usuarios o proveedores que se conectan con la empresa desde sitios remotos (oficinas comerciales, domicilios, hotel, aviones, etcétera) utilizando Internet como vínculo de acceso. Una vez autenticados tienen un nivel de acceso muy similar al que tienen en la red local de la empresa. Muchas empresas han reemplazado con esta tecnología su infraestructura dialup (módems y líneas telefónicas), aunque por razones de contingencia todavía conservan sus viejos modems.

VPN punto a punto

Este esquema se utiliza para conectar oficinas remotas con la sede central de organización. El servidor VPN, que posee un vínculo permanente a Internet, acepta las conexiones vía Internet provenientes de los sitios y establece el túnel VPN. Los servidores de las sucursales se conectan a Internet utilizando los servicios de su proveedor local de Internet, típicamente mediante conexiones de banda ancha. Esto permite eliminar los costosos vínculos punto a punto tradicionales, sobre todo en las comunicaciones internacionales.... es mas comun el anterior punto. tambien llamada tecnologia de tunel o tunneling

VPN interna

Este esquema es el menos difundido pero uno de los más poderosos para utilizar dentro de la empresa. Es una variante del tipo "acceso remoto" pero, en vez de utilizar Internet como medio de conexión, emplea la misma red de área local (LAN) de la empresa. Sirve para aislar zonas y servicios de la red interna. Esta capacidad lo hace muy conveniente para mejorar las prestaciones de seguridad de las redes inalámbricas (WiFi).

Un ejemplo muy clásico es un servidor con información sensible, como las nóminas de sueldos,

ubicado detrás de un equipo VPN, el cual provee autenticación adicional más el agregado del cifrado, haciendo posible que sólo el personal de RRHH habilitado pueda acceder a la información.

Certificado digital

Un Certificado Digital es un documento digital mediante el cual un tercero confiable (una autoridad de certificación) garantiza la vinculación entre la identidad de un sujeto o entidad y su clave pública.Si bien existen varios formatos de certificado digital, los más comúnmente empleados se rigen por el estándar UITT X.509v3. El certificado contiene usualmente el nombre de la entidad certificada, un número serial, fecha de expiración, una copia de la clave pública del titular del certificado (utilizada para la verificación de su firma digital), y la firma digital de la autoridad emisora del certificado de forma que el receptor pueda verificar que el esta última ha establecido realmente la asociación.

Formato de Certificado Digital

El certificado digital está formado por:

Clave pública
Clave privada
Información del Propietario
Información del emisor del Certificado

2 Paquetes Necesarios

openvpn2.0.71.el4.rf
lzo1.084.2.el4.rf
openssldevel0.9.7a43.4
openssl0.9.7a43.4

3 Procedimientos

Configurando tu propia Autoridad Certificadora (CA Certificate Authority) y generacion de certificados y par de llaves para el Servidor OpenVPN y un cliente VPN.
El primer paso al construir una VPN con OpenVPN 2.0 es establecer una PKI (Infraestructura de LLave Publica Public Key Infrastructure), esta PKI consiste de:

Un certificado aparte (tambien conocido como llave publica) y una llave privada para el servidor y cada cliente.

Un Certificado Mastro para la Autoridad Certificadora (CA) y su llave la cual es usada para firmar cada certificado de el servidor y el cliente. Generar la llave y el certificado Maestro para la Autoridad Certificadora (CA).

En esta seccion se generaran los certificados/llaves para la CA, el server y el cliente. Para la administracion de la PKI usaremos los scripts que vienen con OpenVPN (easyrsa) pero en este caso usaremos la nueva version que tiene muchas mejoras, es esta easyrsa 2.0.

Estos scripts de la version 2.0 de easyrsa estan en: /usr/doc/openvpn2.0.6/easy

rsa/2.0/

Se recomienda copiar el contenido de dicho directorio por ejemplo a /etc/openvpn/easyrsa V2.0.

Entonces haremos:
# cd /etc/openvpn
# mkdir easyrsaV2.0
# cp r /usr/doc/openvpn2.0.6/easyrsa/2.0/* /etc/openvpn/easyrsa V2.0
# cd /etc/openvpn/easyrsaV2.0
Ahora editaremos el archivo vars lo primero que se hara es definir la ruta para la variable KEY_DIR que por default estara asi: /etc/openvpn/easyrsaV2.0/keys, pero dicho directorio no existe por lo que primero lo crearemos:

# mkdir p /etc/openvpn/easyrsaV2.0/keys
Es en este directorio donde se almacenaran las llaves privadas, los archivos de requerimiento de certificado (.csr) y los certificados (.crt) y otros archvos e como el serial y el index.txt.

Ahora configuraremos los parametros KEY_COUNTRY, KEY_PROVINCE, KEY_CITY, KEY_ORG y KEY_MAIL, no hay que dejar ninguno de estos parametros vacios, los valores de estas variables seran pasadas de manera determinada a los certificados que crearemos, por ejemplo:

export KEY_COUNTRY="DR"
export KEY_PROVINCE="Santo Domingo"
export KEY_CITY="Distrito Nacional"
export KEY_ORG="Fundacion Codigo Libre"
export KEY_EMAIL="cristhian@codigolibre.org"
Lo siguiente es inicializar la PKI, asi:

# source ./vars

NOTE: If you run ./cleanall, I will be doing a rm rf on

/etc/openvpn/easyrsaV2.0/keys

Si se editaron los parametros correctamente veras algo como lo que salio arriba.
Ahora configuraremos un entorno nuevo.
# ./cleanall

Conforme vayas creando certificados, keys, y requerimientos para firma de certificados, tendras que entender que solo los archivos.key deben de mantenerse confidenciales. Los archivos .crt y .csr pueden ser enviados sobre un canal inseguro como un email en texto plano.

Generando Parametros Diffie Hellman.
Los parametros Diffie Hellman deben de ser generados para el Servidor OpenVPN:

# ./builddh
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
.............................................................................+..
#

Construiremos el certificado/key para la CA: Veremos algo asi:
# ./pkitool initca
Using CA Common Name: Tuxjm CA
Generating a 1024 bit RSA private key
............................++++++
........................++++++
writing new private key to 'ca.key'

Generacion de certificado y llaves para el servidor.

Lo siguiente es generar el certiicado y la llave privada par el servidor:

# ./pkitool server servidor
Generating a 1024 bit RSA private key
...........++++++
...................................................................++
++++
writing new private key to 'servidor.key'

Using configuration from /etc/openvpn/easyrsaV2.0/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'MX'
stateOrProvinceName :PRINTABLE:'Baja California'
localityName :PRINTABLE:'Tijuana'
organizationName :PRINTABLE:'Tuxjm'
commonName :PRINTABLE:'servidor'
emailAddress :IA5STRING:'jmedinaaa@uxjm.net'
Certificate is to be certified until Apr 30 03:50:13 2016 GMT (3650
days)
Write out database with 1 new entries
Data Base Updated
#
Como pudimos ver lo todos los valores fueron tomados de el archivo vars y le agrego el valor de commonName el valor de el argumento que pusimos: ./pkitool server servidor, en este caso le puso servidor.

Generacion de certificado y llave privada para un cliente.
Esto es muy similar a los pasos previos
# ./pkitool cliente1
Generating a 1024 bit RSA private key
.........................................++++++
............................++++++
writing new private key to 'cliente1.key'
Using configuration from /etc/openvpn/easyrsaV2.0/openssl.cnf
DEBUG[load_index]: unique_subject = "yes"
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'MX'
stateOrProvinceName :PRINTABLE:'Baja California'
localityName :PRINTABLE:'Tijuana'
organizationName :PRINTABLE:'Tuxjm'
commonName :PRINTABLE:'cliente1'
emailAddress :IA5STRING:'jmedinaaa@tuxjm.net'
Certificate is to be certified until Apr 30 03:51:59 2016 GMT (3650 days)
Write out database with 1 new entries
Data Base Updated
#

Como pudimos ver lo todos los valores fueron tomados de el archivo vars y le agrego el valor de commonName el valor de el argumento que pusimos: ./pkitool server cliente1, en este caso le puso cliente1.
Ahora crearemos un segundo certiicado para un nuevo cliente:
# source ./vars
NOTE: If you run ./cleanall, I will be doing a rm rf on
/etc/openvpn/easyrsaV2.0/keys
# ./pkitool cliente2
Conforme vayas agregando clientes lo haras con esta misma herramienta (pkitool) no hay que olvidar que cada vez que se vaya a usar el script pkitool se tiene que ejecutar el comando source ./vars antes de crear, o revocar algun certificado.

Bien, ahora lo que sigue es copiar los archivos necesarios a su lugar respectivo, en el caso de: ca.crt, dh1024.pem, servidor.crt y servidor.key van en el servidor, asi que los podemos dejar en donde estan, los archivos ca.crt, cliente1.crt y cliente1.key se tendran que pasar a el cliente, esto tiene que ser por un medio seguro, se puede usar ssh para pasarlos a la maquina cliente.

Suponiendo que aun estamos en /etc/openvpn/easyrsaV2.0
# mkdir archivoscliente1
# cd keys
# cp v ca.crt cliente1.crt cliente1.key ../archivoscliente1/

Y luego:
# cd ..
# chmod R 755 archivoscliente1
$ scp r archivoscliente1 usuario@clientevpn:.

Creando archivos de configuracion para el servidor y el cliente.

Consiguendo los archivos de configuracion de ejemplo.

Es recomendable usar los archivos de configuracion de ejemplo de OpenVPN como un punto inicial para tu propia configuracion. estos pueden ser encontrados en: /usr/doc/openvpn2.0.6/sampleconfigfiles/ Los archivos que necesitaremos son: server.conf y client.conf

Editando el archivo de configuracion de el servidor.

El archivo de configuracion de ejemplo para el servidor es un punto de inicio ideal para la configuracion de un servidor OpenVPN. Creara una VPN usando una interfaz de red virtual TUN (para routed mode), escuchara conexiones de clientes en el puerto UDP 1194 (El numero de puerto oficial de OpenVPN), y distribuira direcciones virtuales de la subred 10.8.0.0/24 para los clientes que se conecten.

Copiamos el archivo de configuracion de el servidor:
# cd /etc/openvpn/
# cp /usr/doc/openvpn2.0.6/sampleconfigfiles/server.conf .
Editar el archivo server.conf y cambiar los valores de las lineas de los parametros: ca, cert, key y dh para que apunten a los archivos generados en la seccion anterior.

Por ejemplo quedaria asi:
ca /etc/openvpn/easyrsaV2.0/keys/ca.crt
cert /etc/openvpn/easyrsaV2.0/keys/servidor.crt
key /etc/openvpn/easyrsaV2.0/keys/servidor.key
dh /etc/openvpn/easyrsaV2.0/keys/dh1024.pem

Editando el archivo de configuracion de el cliente.

En el cliente VPN tambien se deben de seguir los procedimientos de instalacion que se dieron al inicio, una vez que este todo instalado es hora de copiar los archivos que se generaron en el servidor y se copiaron por un medio seguro (ssh/scp), dichos archivos son:

ca.crt cliente1.crt cliente1.key

Y hay que copiarlos de donde esten a /etc/openvpn/ y ponerles los permisos adecuados:

# chmod 644 ca.crt
# chmod 644 cliente1.crt
# chmod 600 cliente1.key

Ahora lo que sigue es usar un archivo de configuracion para el cliente de ejemplo:

# pwd
/etc/openvpn
# cp /usr/doc/openvpn2.0.6/sampleconfigfiles/client.conf .

Entonces en el cliente tendremos:

# pwd
/etc/openvpn
# ls
ca.crt client.conf cliente1.crt cliente1.key

Teniendo estos archivos, lo que sigue es editar el archivo client.conf y cambiar los parametros de ca, cert y key para que apunten a los nombres de archivos que acabamos de copiar, en este caso el valor de ca se deja como esta, y se cambia el valor de cert de client.crt a cliente1.crt y el valor de key de client.key a cliente1.key, hay que recordar que el archivo ca.crt es universal tanto para los clientes y los servidores.

Ahora hay que editar el parametro de remote para puntarlo a el nombre de host o direccion IP y puerto de el servidor OpenVPN.

Por ejemplo:
remote 200.222.111.101 1194
Bien una vez editado el parametro guardar el archivo.


Inicializacion de la VPN y pruebas iniciales de conectividad.

Iniciando el Servidor.
Primero hay que asegurarse que el servidor OpenVPN es accesible desde el Internet, esto quiere decir:
Abrir el puerto UDP 1194 en el firewall o configurar una regla de redireccionamiento de puerto
(port forwarding) de el puerto UDP 1194 desde el gateway/firewall a la maquina servidor OpenVPN.

Lo siguiente es asegurarse que la interfaz TUN no esta firewalleada.

Por simplicidad y para hacer pruebas iniciales, es recomendable iniciar el servidor OpenVPN desde la linea de comando, en lugar de iniciarlo como un servicio (daemon).

# cd /etc/openvpn/
# openvpn server.conf
Tue May 2 21:30:49 2006 OpenVPN 2.0.6 i686pclinux [SSL] [LZO]
built on Apr 29 2006
Tue May 2 21:30:49 2006 DiffieHellman initialized with 1024 bit key
Tue May 2 21:30:49 2006 TLSAuth MTU parms [ L:1542 D:138 EF:38 EB:0
ET:0 EL:0 ]
Tue May 2 21:30:49 2006 TUN/TAP device tun0 opened
Tue May 2 21:30:49 2006 /sbin/ip link set dev tun0 up mtu 1500
Tue May 2 21:30:49 2006 /sbin/ip addr add dev tun0 local 10.8.0.1
peer 10.8.0.2
Tue May 2 21:30:49 2006 /sbin/ip route add 10.8.0.0/24 via 10.8.0.2
Tue May 2 21:30:49 2006 Data Channel MTU parms [ L:1542 D:1450 EF:42
EB:135 ET:0 EL:0 AF:3/1 ]
Tue May 2 21:30:49 2006 UDPv4 link local (bound): [undef]:1194
Tue May 2 21:30:49 2006 UDPv4 link remote: [undef]
Tue May 2 21:30:49 2006 MULTI: multi_init called, r=256 v=256
Tue May 2 21:30:49 2006 IFCONFIG POOL: base=10.8.0.4 size=62
Tue May 2 21:30:49 2006 IFCONFIG POOL LIST
Tue May 2 21:30:49 2006 Initialization Sequence Completed
Si muestra algo similar a lo de arriba significa que en el servidor todo fue bien.
Iniciando el Cliente.
Como en la configuracion de el servidor, es mejor inicializar el cliente desde la linea de comandos.

# cd /etc/openvpn/
# openvpn client.conf
Wed May 3 10:36:32 2006 OpenVPN 2.0.6 i686pclinux [SSL] [LZO]
built on Apr 29 2006
Wed May 3 10:36:32 2006 IMPORTANT: OpenVPN's default port number is
now 1194, based on an official
port number assignment by IANA. OpenVPN
2.0beta16 and earlier used 5000
as the default port.
Wed May 3 10:36:32 2006 WARNING: No server certificate verification
method has been enabled.
See http://openvpn.net/howto.html#mitm for more info.

Wed May 3 10:36:32 2006 LZO compression initialized
Wed May 3 10:36:32 2006 Control Channel MTU parms [ L:1542 D:138
EF:38 EB:0 ET:0 EL:0 ]
Wed May 3 10:36:32 2006 Data Channel MTU parms [ L:1542 D:1450 EF:42
EB:135 ET:0 EL:0 AF:3/1 ]
Wed May 3 10:36:32 2006 Local Options hash (VER=V4): '41690919'
Wed May 3 10:36:32 2006 Expected Remote Options hash (VER=V4):
'530fdded'
Wed May 3 10:36:32 2006 UDPv4 link local: [undef]
Wed May 3 10:36:32 2006 UDPv4 link remote: 200.222.111.101:1194
Wed May 3 10:36:32 2006 TLS: Initial packet from 200.222.111.101:1194, sid=cb908c7a 37dab07c
Wed May 3 10:36:33 2006 VERIFY OK: depth=1,/C=MX/ST=Baja_California/L=Tijuana/O=Tuxjm/CN=Calcom_CA/emailAddress=jmedinaaa@tuxjm.net
Wed May 3 10:36:33 2006 VERIFY OK: depth=0,/C=MX/ST=Baja_California/L=Tijuana/O=Tuxjm/C
Wed May 3 10:36:35 2006 /sbin/ip route add 10.8.0.1/32 via 10.8.0.5
Wed May 3 10:36:35 2006 Initialization Sequence Completed

Si muestra algo similar a lo de arriba significa que en el cliente todo fue bien. Ahora, intenta hacer ping a traves de la VPN desde el cliente. Si estas usando openvpn en modo routed ( usando dev tun en el archivo de configuracion de el server), intenta:

# ping 10.8.0.1

Si el ping se hace con exito, Felicitaciones! ahora ya tienes una VPN funcional.


4 Problemas Encontrados y Soluciones

Si el ping fallo o la inicializacion de el cliente OpenVPN para completar, aqui hay un checklist de sintomas comunes y sus soluciones:

Obtienes el mensaje de error: TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity).

Este error indica que el cliente no fue capaz de establecer una conexion de red con el servidor.

Soluciones:

Asegurate de que el ciente esta usando la direccion correcta de el hostname/IP y el numero de puerto que le permitira alcanzar a el servidor OpenVPN

La conexion "stalls" al inicio cuando se usa la configuracion proto udp, el archivo de log de el servidor muestra la linea:

TLS: Initial packet from x.x.x.x:x, sid=xxxxxxxx xxxxxxxx

Sin embargo el log de el cliente no muestra una linea equivalente.

Solucion:
Tienes una conexion en un solo sentido de el cliente a el servidor. La direccion de el servidor hacia el cliente esta bloqueada por un firewall, usualmente en el lado e el cliente. El firewall puede ser (a) un software de firewall personal corriendo en el cliente, o (b) el gateway (router)_ que hace NAT para el cliente. Modifica el firewall para permitir conexiones de regreso a paquetes UDP de el servidor para alcanzar el cliente. Ver el FAQ para informacion adicional para la resolucion de problemas.

1 comentario:

Anónimo dijo...

Hola Cristhian, tengo un servidor con red hat, openvpn, squid y shorewall y despues de cambiar el servicio de internet no me esta funcionando el openvpn.
Estoy buscando quien me ofrezca la consultoria para reconfigurarlo.
gracias,

Yuri Miguel
yurimiguel@hotmail.com