viernes, 30 de diciembre de 2011

OpenVPN en debian Squeeze

Qué es OpenVPN?

OpenVPN es una solución basada en Secure Sockets Layer y red Privada Virtual.


Características:

- Multiplataforma
- Utiliza SSL/TLS
- Simple configuración.
- Es flexible y tiene una amplia configuración.
- Publicado bajo licencia GPL de software libre.
- Se puede implementar en capa 2 ó capa 3 del modelo OSI.
- Permite control mediante grupos mediante reglas de firewall.
- La autenticacion de clientes está basada en certificados, tarjetas inteligentes y/o con credenciales de usuario.
- etc.


Instalación de paquetes:

root@www:~# apt-get install openvpn liblzo2-2 lzop openssl
Do you want to continue [Y/n]? Y
openssl-blacklist liblzo2-2 libpkcs11-helper1 openvpn-blacklist openvpn
Install these packages without verification [y/N]? y



Cargamos el módulo y lo verificamos:

root@www:~# modprobe tun
root@www:~# lsmod | grep tun
tun 8740 0



Creamos keys y Certificados:

root@www:~# cp -r /usr/share/doc/openvpn/examples/easy-rsa/ /etc/openvpn/



Configuramos las variables:

root@www:~# vim /etc/openvpn/easy-rsa/2.0/vars


Cambiar:
export EASY_RSA="`pwd`"
por:
export EASY_RSA="/etc/openvpn/easy-rsa"

Cambiar:
export KEY_COUNTRY=AR
export KEY_PROVINCE=BA
export KEY_CITY=Buenos Aires
export KEY_ORG="Mi VPN"
export KEY_EMAIL="morsa@mi-dominio.com"
export KEY_CONFIG=`/etc/openvpn/easy-rsa/2.0/whichopensslcnf $EASY_RSA`


Darle permisos y ejecutar el script:

root@www:/etc/openvpn/easy-rsa/2.0# chmod a+x vars
root@www:/etc/openvpn/easy-rsa/2.0# ./vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys

root@www:/etc/openvpn/easy-rsa/2.0# ./clean-all
Please source the vars script first (i.e. "source ./vars")
Make sure you have edited it to reflect your configuration.

root@www:/etc/openvpn/easy-rsa/2.0# source ./vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys

root@www:/etc/openvpn/easy-rsa/2.0# ./clean-all



Creamos el CA (Certificado de Autoridad):

root@www:~# /etc/openvpn/easy-rsa/2.0/build-ca
/etc/openvpn/easy-rsa/2.0/build-ca: line 8: /etc/openvpn/easy-rsa/pkitool: No such file or directory



Editamos el build-ca por el error previo, se ve que configuramos alguna variable erronea:

root@www:~# vim /etc/openvpn/easy-rsa/2.0/build-ca


Cambiar:
"$EASY_RSA/pkitool" --interact --initca $*
Por:
"/etc/openvpn/easy-rsa/2.0/pkitool" --interact --initca $*


Volvemos a ejecutar el build-ca para crear el Certificado:

root@www:~# /etc/openvpn/easy-rsa/2.0/build-ca
grep: /etc/openvpn/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: /etc/openvpn/easy-rsa/openssl.cnf
The correct version should have a comment that says: easy-rsa version 2.x



Colocarle la ruta completa al EASY_RSA, ya que no lo encuentra:

root@www:~# vim /etc/openvpn/easy-rsa/2.0/vars
export EASY_RSA="/etc/openvpn/easy-rsa/2.0/"

root@www:/etc/openvpn/easy-rsa/2.0# source vars

root@www:~# /etc/openvpn/easy-rsa/2.0/clean-all

root@www:/etc/openvpn/easy-rsa/2.0# ./build-ca
Country Name (2 letter code) [AR]:
State or Province Name (full name) [BA]:
Locality Name (eg, city) [BuenosAires]:
Organization Name (eg, company) [MiVPN]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [MiVPN CA]:
Name []:
Email Address [morsa@mi-dominio.com]:



Creamos las keys en el Servidor:

root@www:/etc/openvpn/easy-rsa/2.0# ./build-key-server servidor
Country Name (2 letter code) [AR]:
State or Province Name (full name) [BA]:
Locality Name (eg, city) [BuenosAires]:
Organization Name (eg, company) [MiVPN]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [servidor]:
Name []:
Email Address [morsa@mi-dominio.com]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:miPassGuord
An optional company name []:RedesSeguridad
Using configuration from /etc/openvpn/easy-rsa/2.0//openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'AR'
stateOrProvinceName :PRINTABLE:'BA'
localityName :PRINTABLE:'BuenosAires'
organizationName :PRINTABLE:'MiVPN'
commonName :PRINTABLE:'servidor'
emailAddress :IA5STRING:'morsa@mi-dominio.com'
Certificate is to be certified until Dec 28 00:19:33 2021 GMT (3650 days)
Sign the certificate? [y/n]:

1 out of 1 certificate requests certified, commit? [y/n]
Write out database with 1 new entries
Data Base Updated



Creamos la de un cliente solo, si quiere agregar más solo va cambiando el clienteA por otro nombre deseado:

root@www:/etc/openvpn/easy-rsa/2.0# ./build-key clienteA
Country Name (2 letter code) [AR]:
State or Province Name (full name) [BA]:
Locality Name (eg, city) [BuenosAires]:
Organization Name (eg, company) [MiVPN]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [clienteA]:
Name []:
Email Address [morsa@mi-dominio.com]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:otroPass
An optional company name []:RedesSeguridad
Using configuration from /etc/openvpn/easy-rsa/2.0//openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'AR'
stateOrProvinceName :PRINTABLE:'BA'
localityName :PRINTABLE:'BuenosAires'
organizationName :PRINTABLE:'MiVPN'
commonName :PRINTABLE:'clienteA'
emailAddress :IA5STRING:'morsa@mi-dominio.com'
Certificate is to be certified until Dec 28 00:32:03 2021 GMT (3650 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated



Crear parámetros DF (Diffie Hellman):

root@www:/etc/openvpn/easy-rsa/2.0# ./build-dh
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
.......................+...+....................................................................................................+.........................+.............+..........................................................................+....+........+......+..................+................................+................+.............................



Keys:

El directorio /etc/openvpn/easy-rsa/2.0/keys contiene las keys generadas previamente:

root@www:/etc/openvpn/easy-rsa/2.0/keys# ls -l
total 68
-rw-r--r-- 1 root root 3862 Dec 30 21:19 01.pem
-rw-r--r-- 1 root root 3741 Dec 30 21:32 02.pem
-rw-r--r-- 1 root root 1204 Dec 30 21:17 ca.crt
-rw------- 1 root root 887 Dec 30 21:17 ca.key
-rw-r--r-- 1 root root 3741 Dec 30 21:32 clienteA.crt
-rw-r--r-- 1 root root 749 Dec 30 21:32 clienteA.csr
-rw------- 1 root root 887 Dec 30 21:32 clienteA.key
-rw-r--r-- 1 root root 245 Dec 30 21:35 dh1024.pem
-rw-r--r-- 1 root root 216 Dec 30 21:32 index.txt
-rw-r--r-- 1 root root 21 Dec 30 21:32 index.txt.attr
-rw-r--r-- 1 root root 21 Dec 30 21:19 index.txt.attr.old
-rw-r--r-- 1 root root 108 Dec 30 21:19 index.txt.old
-rw-r--r-- 1 root root 3 Dec 30 21:32 serial
-rw-r--r-- 1 root root 3 Dec 30 21:19 serial.old
-rw-r--r-- 1 root root 3862 Dec 30 21:19 servidor.crt
-rw-r--r-- 1 root root 753 Dec 30 21:19 servidor.csr
-rw------- 1 root root 887 Dec 30 21:19 servidor.key


Para autenticar a la VPN desde el cliente debemos copiar el ca.crt, clienteA.crt y clienteA.key. Cualquiera que tenga estos 3 archivos puede conectarse a la VPN, es recomendable transferirlos por un canal seguro ó encriptando los archivos.

Copiamos los archivos restantes a la ruta /etc/openvpn:

root@www:~# cd /etc/openvpn/easy-rsa/2.0/keys/
root@www:/etc/openvpn/easy-rsa/2.0/keys# cp -pf ca.crt ca.key dh1024.pem servidor.crt servidor.key /etc/openvpn/



Configuramos la VPN en el Servidor:

Creamos el archivo openvpn.conf y ponemos lo siguiente:

root@www:~# vim /etc/openvpn/openvpn.conf
#Interface, protocolo y puerto
dev tun
proto tcp
port 1194

#Keys y Certificados
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

#Usuario, grupo e ip
user nobody
group nogroup
server 10.8.0.0 255.255.255.0

#Queda persistente al reinicio
persist-key
persist-tun

#Estado de verbosidad openvpn-status.log
#verb 3
client-to-client

push "redirect-gateway def1"

#log-append /var/log/openvpn
comp-lzo


Iniciamos el demonio:

root@www:~# /etc/init.d/openvpn start
Starting virtual private network daemon: openvpn failed!


Habilitamos el log en el /var/log/ para depurar el motivo por el cuál no inicia:

root@www:~# vim /etc/openvpn/openvpn.conf

Descomentar:
log-append /var/log/openvpn


Mostrar el log mientras reiniciamos nuevamente el servicio:

root@www:~# tail -f /var/log/openvpn
Fri Dec 30 22:49:22 2011 OpenVPN 2.1.3 i486-pc-linux-gnu [SSL] [LZO2] [EPOLL] [PKCS11] [MH] [PF_INET6] [eurephia] built on Oct 21 2010
Fri Dec 30 22:49:22 2011 WARNING: --keepalive option is missing from server config
Fri Dec 30 22:49:22 2011 NOTE: your local LAN uses the extremely common subnet address 192.168.0.x or 192.168.1.x. Be aware that this might create routing conflicts if you connect to the VPN server from public locations such as internet cafes that use the same subnet.
Fri Dec 30 22:49:22 2011 NOTE: OpenVPN 2.1 requires '--script-security 2' or higher to call user-defined scripts or executables
Fri Dec 30 22:49:22 2011 Cannot open /etc/openvpn/easy-rsa/keys/dh1024.pem for DH parameters: error:02001002:system library:fopen:No such file or directory: error:2006D080:BIO routines:BIO_new_file:no such file
Fri Dec 30 22:49:22 2011 Exiting


Modificar la ruta de los archivos que pusimos incorrectamente:

root@www:~# vim /etc/openvpn/openvpn.conf
#Keys y Certificados
ca /etc/openvpn/ca.crt
cert /etc/openvpn/servidor.crt
key /etc/openvpn/servidor.key
dh /etc/openvpn/dh1024.pem


Reiniciamos nuevamente y vemos en el log que no hay errores:

root@www:~# /etc/init.d/openvpn start
Starting virtual private network daemon: openvpn.
root@www:~#


root@www:~# tail -f /var/log/openvpn
Fri Dec 30 23:00:07 2011 OpenVPN 2.1.3 i486-pc-linux-gnu [SSL] [LZO2] [EPOLL] [PKCS11] [MH] [PF_INET6] [eurephia] built on Oct 21 2010
Fri Dec 30 23:00:07 2011 WARNING: --keepalive option is missing from server config
Fri Dec 30 23:00:07 2011 NOTE: your local LAN uses the extremely common subnet address 192.168.0.x or 192.168.1.x. Be aware that this might create routing conflicts if you connect to the VPN server from public locations such as internet cafes that use the same subnet.
Fri Dec 30 23:00:07 2011 NOTE: OpenVPN 2.1 requires '--script-security 2' or higher to call user-defined scripts or executables
Fri Dec 30 23:00:07 2011 /usr/bin/openssl-vulnkey -q -b 1024 -m
Fri Dec 30 23:00:08 2011 TUN/TAP device tun0 opened
Fri Dec 30 23:00:08 2011 /sbin/ifconfig tun0 10.8.0.1 pointopoint 10.8.0.2 mtu 1500
Fri Dec 30 23:00:08 2011 GID set to nogroup
Fri Dec 30 23:00:08 2011 UID set to nobody
Fri Dec 30 23:00:08 2011 Listening for incoming TCP connection on [undef]
Fri Dec 30 23:00:08 2011 TCPv4_SERVER link local (bound): [undef]
Fri Dec 30 23:00:08 2011 TCPv4_SERVER link remote: [undef]
Fri Dec 30 23:00:08 2011 Initialization Sequence Completed


Tengamos en cuenta que tengo una ip privada en vez de una ip pública en el server, por eso indica que haya posibles conflictos de ruteo si se conecta a la VPN

Vemos la interface virtual tun0 cuando iniciamos el servicio de VPN:

root@www:~# ifconfig tun
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:10.8.0.1 P-t-P:10.8.0.2 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)


Vemos también que está escuchando en el puerto configurado:

root@www:~# netstat -tpln | grep openvpn
tcp 0 0 0.0.0.0:1194 0.0.0.0:* LISTEN 4042/openvpn


NOTA: Si notamos un poco lenta la conexión comentamos la linea de compresión: comp-lzo en /etc/openvpn/openvpn.conf


Cliente OpenVPN para windows XP:

Descargamos el cliente de:
http://swupdate.openvpn.net/downloads/openvpn-client.msi



Requiere el adonet, lo descargamos de Microsoft:
http://www.microsoft.com/download/en/confirmation.aspx?id=22



Luego de instalar el adonet instalamos por defecto el cliente vpn para windows y creamos un archivo llamado: ClienteA.ovpn:

#Contenido de ClienteA.ovpn
dev tun
client
proto tcp
remote 192.168.1.102 1194
resolv-retry infinite
nobind
user nobody
group nogroup

persist-key
persist-tun
ca ca.crt
cert clienteA.crt
key clienteA.key
comp-lzo

verb 3


Lo importamos, nos aparece un error que no encuentra el ca.crt, luego pasa lo mismo con ClienteA.crt y con ClienteA.key:



Le colocamos los archivos en la ruta correcta y volvemos a importar el archivo ClienteA.ovpn:



Seleccionamos Local File:



Clickeamos en el + de Connection Profiles:



Seleccionamos el botón naranja como indica la siguiente imagen:



Ya nos hemos conectado a la VPN:



Vemos en los logs cuando se establece la conexión:

root@www:~# tail -f /var/log/openvpn
Sat Dec 31 00:23:26 2011 TCPv4_SERVER link local: [undef]
Sat Dec 31 00:23:26 2011 TCPv4_SERVER link remote: [AF_INET]192.168.1.100:14407
Sat Dec 31 00:23:27 2011 192.168.1.100:14407 [clienteA] Peer Connection Initiated with [AF_INET]192.168.1.100:14407
Sat Dec 31 00:25:16 2011 clienteA/192.168.1.100:14407 Connection reset, restarting [-1]
Sat Dec 31 00:27:15 2011 Re-using SSL/TLS context
Sat Dec 31 00:27:15 2011 LZO compression initialized
Sat Dec 31 00:27:15 2011 TCP connection established with [AF_INET]192.168.1.100:14446
Sat Dec 31 00:27:15 2011 TCPv4_SERVER link local: [undef]
Sat Dec 31 00:27:15 2011 TCPv4_SERVER link remote: [AF_INET]192.168.1.100:14446
Sat Dec 31 00:27:16 2011 192.168.1.100:14446 [clienteA] Peer Connection Initiated with [AF_INET]192.168.1.100:14446


Bloqueamos acceso SSH al servidor de openVPN desde la VPN:

root@www:~# iptables -A INPUT -s 10.8.0.0/24 -p tcp --dport 22 -j DROP


Habilitamos todo el tráfico desde la ip 10.8.0.6(la ip que nos asignó en este caso) hacia internet conectado en la VPN:

root@www:~# iptables -t nat -A POSTROUTING -s 10.8.0.6/32 -o eth0 -j MASQUERADE
root@www:~# echo 1 > /proc/sys/net/ipv4/ip_forward



Ahora tenemos el tráfico enrutado por el server VPN, podemos hacer ping a google, conectarnos al msn y navegar por internet:

C:\Documents and Settings\user>ping www.google.com.ar
Pinging www.l.google.com [74.125.47.99] with 32 bytes of data:
Reply from 74.125.47.99: bytes=32 time=299ms TTL=50
Reply from 74.125.47.99: bytes=32 time=203ms TTL=50



Vemos las reglas en iptables:
root@www:~# iptables -L -n -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination

Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 10.8.0.6 0.0.0.0/0

Chain OUTPUT (policy ACCEPT)
target prot opt source destination



Ponemos en el rc.local el contenido de los comandos que queremos qu ese ejecuten cuando se reinicie el server.


Revocando Certificados de Clientes:

Si deseamos que un cliente no se conecte más a la VPN simplemente revocamos su certificado cno los siguientes comandos:

root@www:~# /etc/openvpn/easy-rsa/2.0/vars
root@www:~# /etc/openvpn/easy-rsa/2.0/revoke-full clienteA



FUENTES:

Wikipedia
OpenVPN.net
library.linode.com
www.ventanazul.com
jroliva.wordpress.com
diegosamuel.blogspot.com

No hay comentarios: