Introduccion:
La idea de este howto es poder crear vpns entre linux y linux o linux y windows facilmente con el paquete OpenVPN el cual esta diseñado para esto y corre en una variedad muy amplia de SO y tiene la particularidad de ser muy seguro por utilizar intercambio de claves asimetrico o metodo Diffie-Hellman lo cual hace que los ataques de "man in the middle" sean imposibles o casi imposibles de llevar a cabo. Y por ser muy escalable y facil de configurar.
Para que se entienda mas o menos la idea de lo que se quiere hacer les dejo una imagen:
Suponiendo que estamos en debian o ubuntu primero Instalamos el paquete paso que tambien se repetira en el nodo cliente:
Instalación:
En ubuntu:
$sudo apt-get install openvpn
o en debian:
$apt-get install openvpn
Generación de claves:
Luego de instalado procedemos a crear el certificado CA la clave diffie-hellman y las claves del servidor y cliente.
Para todo eso primero nos situamos en el directorio donde están los helper scripts
Es recomendable que se creen 2 certificados CA uno para firmar la clave del servidor y otro para firmar las claves de los clientes esto hace mas seguro nuestra VPN.
$cd /usr/share/openvpn/2.0/easy-rsa
Luego creamos el Self-Signed certificate, donde se nos pediran un par de datos como la ubicacion geografica del servidor y datos del admin.
$./build-ca
Generating a 1024 bit RSA private key
............++++++
...........++++++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [KG]:
State or Province Name (full name) [NA]:
Locality Name (eg, city) [BISHKEK]:
Organization Name (eg, company) [OpenVPN-TEST]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:OpenVPN-CA
Email Address [me@myhost.mydomain]:Luego creamos la clave diffie-hellman.$./build-dh
luego de creada la clave diffie-hellman procedemos a crear las claves del servidor y del cliente, en este paso se nos preguntara si queremos firmar digitalmente con nuestro certificado.
$./build-key-server servidor
Luego creamos la clave del cliente, cada cliente de nuestra vpn tiene que tener su clave particular
$./build-key cliente
Luego de creadas todas las claves y el certificado, quedaran almacenadas en: /etc/openvpns/keys
Encontraremos los siguientes archivos generados
| Nombre | Necesitado por | Proposito | Secreto |
| ca.crt | servidor + clientes | certificado CA | No |
| ca.key | servidor solamente | Clave CA | Si |
| dh{n}.pem | servidor solamente | parametros Diffie Hellman | No |
| server.crt | servidor solamente | Certificado del servidor | No |
| server.key | servidor solamente | clave del servidor | Si |
| client1.crt | cliente1 solamente | Certificado cliente1 | No |
| client1.key | cliente1 solamente | clave cliente1 | Si |
| client2.crt | cliente2 solamente | Client2 Certificate | No |
| client2.key | cliente2 solamente | clave cliente2 | Si |
| client3.crt | cliente3 solamente | Client3 Certificate | No |
| client3.key | cliente3 solamente | clave cliente3 | Si |
Los archivos secretos son todos aquellos que no podrán ser vistos
por otras personas que ya se vería vulnerada la confiabilidad de
nuestra vpn, por eso lo mejor seria siempre trasmitir los archivos
ca.crt cliente*.crt y cliente*.key por un medio seguro como SSH.
Configurando el Servidor y las interfaces:
Agregamos un archivo de texto con el nombre de nuestra vpn y la extension .conf a /etc/openvpn/, cuando se inicie el demonio de openvpn este iniciara una instancia del mismo por cada archivo que se encuentre en este directorio.
El contenido de este archivo se debería ver de la siguiente forma:
#puerto de escucha sera el 1194.$modprobe tun
#es recomendable utilizar otro que no sea el estándar para dar mas seguridad.
port 1194
#protocolo a usar sera el udp, en caso de que tengamos que usar un proxy solo se podrá utilizar el tcp.
proto udp
#tipo de tunel queremos si capa 2 (frames Ethernet) o capa 3 (paquetes IP)
dev tun
#certificado del servidor
ca key/ca.crt
#certificado del servidor
cert key/servidor.crt
#clave del servidor
key key/servidor.key
#parametros diffie-helman
dh key/dh1024.pem
#especifica la red de la vpn
server 10.8.0.0 255.255.255.0
#mantiene un pool de las ip
ifconfig-pool-persist ipp.txt
keepalive 10 120
#establece compresion de los datos para ahorrar ancho de banda.
comp-lzo
user nobody
group nobody
#establece que el túnel sera persistente aunque la conexion caiga
#esto nos permitirá que la vpn se pueda retomar automaticamente.
persist-key
persist-tun
#archivo de log de la vpn útil por si tenemos problemas y queremos detectar donde están.
status openvpn-status.log
#especificamos que el log debe ser lo mas extenso posible.
verb 3
Luego como root instalamos el modulo que maneja las interfaces virtuales tun/tap:
o
$sudo modprobe tun
Luego de verificar que nuestra interface tun/tap funciona procedemos: opcionalmente si queremos dar acceso a internet desde nuestro servidor de vpn y que este pueda rutear peticiones a otras maquinas en otras redes o simplemente tener una red vpn centralizada sin internet tendremos que activar el bit de ruteo como root, este comando no funciona con sudo.
$echo 1> /proc/sys/net/ipv4_forwarding
reiniciar el demonio de openpvn:
$/etc/init.d/openvpn restart
o en ubuntu
$sudo /etc/init.d/openvpn restart
Un inicio normal del servidor de OpenVPN se debería ver así:
Sun Feb 6 20:46:38 2005 OpenVPN 2.0_rc12 i686-ubuntu-linux [SSL] [LZO] [EPOLL] built on Feb 5 2005
Sun Feb 6 20:46:38 2005 Diffie-Hellman initialized with 1024 bit key
Sun Feb 6 20:46:38 2005 TLS-Auth MTU parms [ L:1542 D:138 EF:38 EB:0 ET:0 EL:0 ]
Sun Feb 6 20:46:38 2005 TUN/TAP device tun1 opened
Sun Feb 6 20:46:38 2005 /sbin/ifconfig tun1 10.8.0.1 pointopoint 10.8.0.2 mtu 1500
Sun Feb 6 20:46:38 2005 /sbin/route add -net 10.8.0.0 netmask 255.255.255.0 gw 10.8.0.2
Sun Feb 6 20:46:38 2005 Data Channel MTU parms [ L:1542 D:1450 EF:42 EB:23 ET:0 EL:0 AF:3/1 ]
Sun Feb 6 20:46:38 2005 UDPv4 link local (bound): [undef]:1194
Sun Feb 6 20:46:38 2005 UDPv4 link remote: [undef] Sun Feb 6 20:46:38 2005 MULTI: multi_init called, r=256 v=256
Sun Feb 6 20:46:38 2005 IFCONFIG POOL: base=10.8.0.4 size=62
Sun Feb 6 20:46:38 2005 IFCONFIG POOL LIST Sun Feb 6 20:46:38 2005 Initialization Sequence Completed
Por ultimo mediante algún medio confiable como el SSH trasmitimos las claves a los clientes de la vpn.
Configurando los clientes:
Luego de trasmitidas las claves e instalado el cliente igual que en el primer paso.
La diferencia básica es que tenemos que crear un archivo de conflagración especifico que dictaminara el comportamiento de openvpn como un nodo cliente.
Para eso creamos un archivo también en /etc/openvpn/ que tenga el nombre de la vpn y la extensión .conf el cual el demonio iniciara un proceso por cada archivo que se encuentre en el directorio.
El contenido deberá verse asi:
#ya de entrada le especificamos que sea un nodo cliente.
#luego los otros parámetros son iguales
client
dev tun
proto udp
# aqui especificamos que nuestro servidor sera miservidor.tld puerto 1194
remote tuservidor.tld 1194
resolv-retry infinite
#esta opción sirve tanto para linux como para windows.
#se debería poner la interfaces en tun/tap en dhcp para que funcione bien.
ifconfig 10.8.0.6 255.255.255.0
persist-key
persist-tun
ca keys/ca.crt
cert keys/client.crt
key keys/client.key
comp-lzo
verb 3
Por ultimo si esta todo bien configurado reiniciamos el cliente y voila tendríamos que ver que nuestra interfase tun/tap levanta y que podemos pinguear a 10.8.0.1
Alguna que otra opcioncita mas:
Revocacion de las claves:
si creemos que alguna de nuestras claves fue comprometida la podemos revocar con el siguiente comando:
Para eso podemos recovar la clave vulnerable con:
$. ./vars
$./revoke_key clave_malita.key
Usando ttp-proxy:
Si estamos detrás de un squid restrictivo que no nos deja acceder a contenidos http pero si
ssl podemos utilizar la opción http-proxy host:puerto la cual nos permitirá conectarnos a nuestro servidor ya que esto hace que el servidor mande un CONNECT host:puerto HTTP/1.1 al proxy.
Usando tls-auth:
Esto nos permite mas seguridad todavía en nuestra vpn autenticando cada paquete que viene desde la vpn y descartando aquellos sospechosos.
Para poder hacer uso de esta opción se genera una nueva clave compartida y se configura en el archivo .conf de cada vpn en el cliente y el servidor y se debe utilizar 0 en el servidor y 1 en el cliente.
openvpn --genkey --secret ta.key
tls-auth ta.key 0|1
Fuentes [gentoo-wiki.com, www.imped.net ]


1 comentarios:
Estás confundiéndote en una cosa: la clave de diffie-hellman no la creás vos, sino que la crea el openvpn automáticamente ni bien se establece la conexión.
Esto se debe a que la clave de sesión que se termina usando es fruto de la decisión de las dos partes (cliente y servidor), y se calcula como la exponenciación modular de dos números, uno que se inventa localmente al azar, cumpliendo ciertas características, y otro que le manda la otra parte, fruto de un cálculo bastante simple.
Publicar un comentario en la entrada