Table of Contents

OpenVPN

Routed VPN

Instalacion y configuracion

Esta configuración nos permite conectividad punto a punto entre los distintos clientes y el servidor VPN

http://openvpn.net/index.php/open-source/documentation/howto.html#quick

1. Instalar el paquete, tanto en el servidor como en todos los clientes.

sudo aptitude install openvpn openssl

2. Creamos el archivo vacío donde se almacenarán los certificados revocados:

sudo touch /etc/openvpn/crl.pem

3. Generate the master Certificate Authority (CA) certificate & key

cd /usr/share/easy-rsa
sudo su
vim vars
...
export KEY_COUNTRY="ES"
export KEY_PROVINCE="BC"
export KEY_CITY="Barcelona"
export KEY_ORG="example.com"
export KEY_EMAIL="info@example.com"
export KEY_CN=cn
export KEY_NAME=name
export KEY_OU=IT
...
source ./vars
./clean-all
./build-ca

Error:

grep: /usr/share/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: /usr/share/easy-rsa/openssl.cnf
The correct version should have a comment that says: easy-rsa version 2.x

Solución:

ln -s openssl-1.0.0.cnf openssl.cnf

Y volver a intentar:

./build-ca

Error:

unable to find 'distinguished_name' in config
problems making Certificate Request
1995425184:error:0E06D06A:configuration file routines:NCONF_get_string:no conf or environment variable:../crypto/conf/conf_lib.c:272:

Desconozco el motivo, pero se resuleve editando las lineas en las que se le asigna un valor a la variable “subjectAltName”, en mi caso 2 veces:

vim openssl.cnf

Y cambio los valores:

# anyadido
#subjectAltName=$ENV::KEY_ALTNAMES
subjectAltName=email:copy

Y volver a intentar:

./build-ca

Ahora a contestar las preguntas y pulsar “enter” al final de cada una:

Country Name (2 letter code) [US]:ES
State or Province Name (full name) [BC]:
Locality Name (eg, city) [Barcelona]:
Organization Name (eg, company) [Contrabanda FM]:
Organizational Unit Name (eg, section) [Tècnica]:
Common Name (eg, your name or your server's hostname) [ContrabandaFM]:
Name [EasyRSA]:
Email Address [admin@example.com]:

4. Generar claves del servidor (solo 1 vez)

4.1. Generate certificate & key for server

./build-key-server server

Ahora a contestar las preguntas y pulsar “enter” al final de cada una:

Country Name (2 letter code) [US]:ES
State or Province Name (full name) [BC]:
Locality Name (eg, city) [Barcelona]:
Organization Name (eg, company) [Contrabanda FM]:
Organizational Unit Name (eg, section) [Tècnica]:
Common Name (eg, your name or your server's hostname) [ContrabandaFM]:
Name [EasyRSA]:
Email Address [admin@example.com]:

Las contraseñas las dejo en blanco:

A challenge password []:
An optional company name []:

Y aquí hay que pulsar “y” más “enter”:

Sign the certificate? [y/n]:
1 out of 1 certificate requests certified, commit? [y/n]

4.2. Generate Diffie Hellman parameters

OJO: puede llevar mucho tiempo, unos 15 minutos:

./build-dh

4.3. Mover llaves (revisar, no estoy seguro de que haya que mover en lugar de copiar nada):

mkdir -p /etc/openvpn/keys/server
cp keys/ca.crt /etc/openvpn/keys/server; mv keys/server.* /etc/openvpn/keys/server; mv keys/dh1024.pem /etc/openvpn/keys/server

5. Crear el archivo de configuracion:

cd /usr/share/doc/openvpn/examples/sample-config-files
cp server.conf.gz /etc/openvpn/
cd /etc/openvpn/; gzip -d server.conf.gz
vim server.conf

Yo lo he dejado asi:

port 443
proto tcp
dev tun
ca /etc/openvpn/keys/server/ca.crt
cert /etc/openvpn/keys/server/server.crt
key /etc/openvpn/keys/server/server.key 
dh /etc/openvpn/keys/server/dh2048.pem
server 172.16.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "route 10.0.0.0 255.255.255.0"
push "route 10.7.13.0 255.255.255.0"
push "dhcp-option DNS 10.0.0.10"
push "dhcp-option DOMAIN local.example.com"
client-to-client
keepalive 10 120
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
status openvpn-status.log
log         /var/log/openvpn.log
log-append  /var/log/openvpn.log
verb 3
crl-verify /etc/openvpn/crl.pem

Hay muchas opciones (“port”, “proto” y “dev” por ejemplo) que tienen que concordar con las que se especifiquen en el archivo de configuracion del cliente.

Generar claves de los clientes

Procedimiento generico

Para cada nuevo cliente se tiene que repetir este proceso completo.

1. Convertirse en root y entrar en el directorio:

sudo su
cd /usr/share/easy-rsa

2. Reiniciar vars:

source ./vars

3. Generar certificado y llave para el cliente “cliente1”

./build-key client1

Contestar las preguntas, presionar “enter” para aceptar los valores propuestos:

Country Name (2 letter code) [US]:ES
State or Province Name (full name) [BC]:
Locality Name (eg, city) [Barcelona]:
Organization Name (eg, company) [Contrabanda FM]:
Organizational Unit Name (eg, section) [Tècnica]:
Common Name (eg, your name or your server's hostname) [client1]:
Name [EasyRSA]:
Email Address [admin@example.com]:

Las contraseñas las dejo en blanco:

A challenge password []:
An optional company name []:

Y aquí hay que pulsar “y” más “enter”:

Sign the certificate? [y/n]:
1 out of 1 certificate requests certified, commit? [y/n]

4. Mover las llaves y copiar la clave publica de la CA a un directorio:

mkdir -p ~/openvpn/client1
user="client1" && cp keys/ca.crt ~/openvpn/$user/ && cp keys/$user.crt keys/$user.key ~/openvpn/$user/

5. Crear el archivo de configuracion del cliente (hay un ejemplo en /usr/share/doc/openvpn/examples/sample-config-files ):

user="client1" && vim ~/openvpn/$user/$user.conf

Con el siguiente contenido:

5.1.1. Si queremos que el cliente OpenVPN tome el servidor DNS del servidor VPN:

client
dev tun
proto tcp
remote vpn.example.com 443
resolv-retry infinite
nobind
user nobody
group nogroup
persist-key
persist-tun
ca /etc/openvpn/client1/ca.crt
cert /etc/openvpn/client1/client1.crt
key /etc/openvpn/client1/client1.key
ns-cert-type server
comp-lzo
verb 4
log         /var/log/openvpn/client1.log
log-append  /var/log/openvpn/client1.log

# If we want to get DNS server from VPN
script-security 2
up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf

En este caso el servidor se llama “vpn.example.com” y escucha en el puerto TCP 443.

5.1.2. Crear el script para tomar el servidor DNS al conectarse al servidor VPN:

vim ~/openvpn/client1/update-resolv-conf

Con el siguiente contenido:

#!/bin/bash
# 
# Parses DHCP options from openvpn to update resolv.conf
# To use set as 'up' and 'down' script in your openvpn *.conf:
# up /etc/openvpn/update-resolv-conf
# down /etc/openvpn/update-resolv-conf
#
# Used snippets of resolvconf script by Thomas Hood and Chris Hanson.
# Licensed under the GNU GPL.  See /usr/share/common-licenses/GPL. 
# 
# Example envs set from openvpn:
#
#     foreign_option_1='dhcp-option DNS 193.43.27.132'
#     foreign_option_2='dhcp-option DNS 193.43.27.133'
#     foreign_option_3='dhcp-option DOMAIN be.bnc.ch'
#

[ -x /sbin/resolvconf ] || exit 0
[ "$script_type" ] || exit 0
[ "$dev" ] || exit 0

split_into_parts()
{
	part1="$1"
	part2="$2"
	part3="$3"
}

case "$script_type" in
  up)
	NMSRVRS=""
	SRCHS=""
	for optionvarname in ${!foreign_option_*} ; do
		option="${!optionvarname}"
		echo "$option"
		split_into_parts $option
		if [ "$part1" = "dhcp-option" ] ; then
			if [ "$part2" = "DNS" ] ; then
				NMSRVRS="${NMSRVRS:+$NMSRVRS }$part3"
			elif [ "$part2" = "DOMAIN" ] ; then
				SRCHS="${SRCHS:+$SRCHS }$part3"
			fi
		fi
	done
	R=""
	[ "$SRCHS" ] && R="search $SRCHS
"
	for NS in $NMSRVRS ; do
        	R="${R}nameserver $NS
"
	done
	echo -n "$R" | /sbin/resolvconf -a "${dev}.openvpn"
	;;
  down)
	/sbin/resolvconf -d "${dev}.openvpn"
	;;
esac

5.1.1. Si NO queremos que el cliente OpenVPN tome el servidor DNS del servidor VPN:

client
dev tun
proto tcp
remote vpn.example.com 443
resolv-retry infinite
nobind
user nobody
group nogroup
persist-key
persist-tun
ca /etc/openvpn/client1/ca.crt
cert /etc/openvpn/client1/client1.crt
key /etc/openvpn/client1/client1.key
ns-cert-type server
comp-lzo
verb 4
log         /var/log/openvpn/client1.log
log-append  /var/log/openvpn/client1.log

En este caso el servidor se llama “vpn.example.com” y escucha en el puerto TCP 443.

6. Empaquetar todos los archivos para poder transferirlos comodamente al cliente:

cd ~/openvpn/client1
tar cvfj ~/openvpn/client1.tar.bz2 *

7. Copiar del servidor al cliente el archivo comprimido y luego eliminarlo:

scp ~/openvpn/client1.tar.bz2 user@client1.example.com:/tmp/
rm -fr ~/openvpn

8. (Maquina cliente) Asumo que ya esta instalado el paquete “openvpn”. Descomprimir archivos, moverlos y darles permisos

sudo mv /tmp/client1.tar.bz2 /etc/openvpn
sudo tar xvfj client1.tar.bz2
sudo chown root:root client1*
sudo chmod 0700 client1
sudo chmod 0600 client1/*

Si optamos por tomar las DNS del servidor VPN:

sudo chmod 0700 update-resolv-conf

9. Starting up the VPN and testing for initial connectivity

9.1 (Opcional) Abrir el puerto y protocolo definido en el archivo de configuración en el firewall (UDP 1194 por defecto)

9.2 (Opcional) Si se quiere que los clientes puedan acceder además de al servidor VPN a otras máquinas que estén en la red privada (LAN) de éste, y si el gateway de esa LAN NO es el servidor VPN, en el servidor VPN hay que activar masquerade.

9.3 Arrancar (mismo comando en el servidor y en todos los clientes):

sudo service openvpn start

Migracion a openvpn >=2.3

IMPORTANTE: realizar los siguientes pasos UNA sola vez, en caso de migrar a openvpn >=2.3

0. Instalar paquete, ahora ya NO es parte de openvpn

sudo aptitude install easy-rsa

1. IMPORTANTE: mover certificados de la CA, lista de revocados, etc… a nueva ubicacion:

cd /usr/share/easy-rs
mv keys keys.old
sudo mv /usr/share/doc/openvpn/examples/easy-rsa/2.0/keys/ /usr/share/easy-rsa

Acceso desde el cliente a la LAN del servidor VPN (gateway de la LAN y servidor VPN son distintos)

Queremos que desde el cliente se llegue no solo al servidor VPN, sino también a la LAN de ese servidor. La particularidad es que el servidor VPN es una máquina virtual detrás de un Hipervisor KVM. Además el Hipervisor KVM está detrás de un router ADSL casero en modo DMZ, de forma que TODO el tráfico lo redirige hacia el Hipervisor.

Resumen:

Máquina Interfaz IP Comentario
Cliente wlan0 192.168.1.100 LAN doméstica. Se conecta al router que le da salida a internet
Cliente tun0 172.16.0.6 Red VPN
Servidor VPN eth0 10.0.0.11 LAN corporativa (VM de KVM)
Servidor VPN tun0 172.16.0.1 Red VPN
Hipervisor KVM p5p1 192.168.1.4 LAN que se conecta al router que le da salida a internet
Hipervisor KVM virbr0 10.0.0.1 LAN corporativa (Hipervisor de KVM)
Servidor destino eth0 10.0.0.12 LAN corporativa (VM de KVM)

El objetivo es conectarse de la siguiente manera:

[Cliente] → [Hipervisor KVM] → [Servidor VPN] → [Servidor destino]

1. (Servidor VPN) Anunciar a los clientes la ruta a la que se pueden conectar, y si es menester, reiniciar el servicio VPN:

sudo vim /etc/openvpn/server.conf
...
push "route 10.0.0.0 255.255.255.0"
...
sudo /etc/init.d/openvpn restart

2. (Servidor VPN) Crear el guión para el enrutado de tráfico y hacer que se ejecute al arrancar el servidor:

vim /home/ubuntu/firewall_on.sh
#!/bin/bash

IPTABLES=/sbin/iptables

# Borrado de reglas de iptables
$IPTABLES -P INPUT ACCEPT
$IPTABLES -F INPUT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -F OUTPUT
$IPTABLES -P FORWARD ACCEPT
$IPTABLES -F FORWARD

$IPTABLES -t nat -F
$IPTABLES -t filter -F
$IPTABLES -t mangle -F

# Interfaces
LAN_IF="eth0"
VPN_IF="tun0"
LO_IF="lo"

#CRÍTICO: habilitar redirección IPv4, deshabilitado por defecto
echo "1" > /proc/sys/net/ipv4/ip_forward

$IPTABLES -t nat -A POSTROUTING -o $LAN_IF -j MASQUERADE
chmod +x /home/ubuntu/firewall_on.sh
cd /etc/init.d
sudo ln -s /home/ubuntu/firewall_on.sh
sudo update-rc.d firewall_on.sh defaults

3. (Hipervisor KVM) Crear el guión para el enrutado de tráfico y hacer que se ejecute al arrancar el servidor:

vim /home/ubuntu/firewall_on.sh
#!/bin/bash

IPTABLES=/sbin/iptables

# Borrado de reglas de iptables
$IPTABLES -P INPUT ACCEPT
$IPTABLES -F INPUT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -F OUTPUT
$IPTABLES -P FORWARD ACCEPT
$IPTABLES -F FORWARD

$IPTABLES -t nat -F
$IPTABLES -t filter -F
$IPTABLES -t mangle -F

# Interfaces
VIRT_IF="virbr0"
EXT_IF="p5p1"
LO_IF="lo"

KVM_LAN_IP="192.168.1.4"
VM="10.0.0.0/24"
KVM_VM_IP="10.0.0.1"

# VPN
VPN_VM="10.0.0.11"
VPN_NET="172.16.0.0/24"
VPN_PROTOCOL="udp"
VPN_PORT="1193"

# KVM
$IPTABLES -A INPUT -i $VIRT_IF -p udp -m udp --dport 53 -j ACCEPT
$IPTABLES -A INPUT -i $VIRT_IF -p tcp -m tcp --dport 53 -j ACCEPT
$IPTABLES -A INPUT -i $VIRT_IF -p udp -m udp --dport 67 -j ACCEPT
$IPTABLES -A INPUT -i $VIRT_IF -p tcp -m tcp --dport 67 -j ACCEPT
$IPTABLES -A FORWARD -d $VM -o $VIRT_IF -m state --state RELATED,ESTABLISHED -j ACCEPT
$IPTABLES -t nat -A POSTROUTING -s $VM ! -d $VM -p tcp -j MASQUERADE --to-ports 1024-65535 
$IPTABLES -t nat -A POSTROUTING -s $VM ! -d $VM -p udp -j MASQUERADE --to-ports 1024-65535 
$IPTABLES -t nat -A POSTROUTING -s $VM ! -d $VM -j MASQUERADE

# Forward traffic between VM's
$IPTABLES -A FORWARD -i $VIRT_IF -o $VIRT_IF -s $VM -d $VM -j ACCEPT

# Allow loop interface traffic
$IPTABLES -A INPUT -i $LO_IF -j ACCEPT

# ESTABLISHED
$IPTABLES -A INPUT -d $KVM_LAN_IP -i $EXT_IF -m state --state RELATED,ESTABLISHED -j ACCEPT

# VPN (OpenVPN)
$IPTABLES -A INPUT -i $EXT_IF -d $KVM_LAN_IP -p $VPN_PROTOCOL --dport $VPN_PORT -j ACCEPT
$IPTABLES -t nat -I PREROUTING -i $EXT_IF -p $VPN_PROTOCOL --dport $VPN_PORT -s $ANY -d $KVM_LAN_IP -j DNAT --to-destination $VPN_VM
$IPTABLES -A FORWARD -i $EXT_IF -o $VIRT_IF -d $VPN_VM -p $VPN_PROTOCOL --dport $VPN_PORT -j ACCEPT
$IPTABLES -A FORWARD -i $VIRT_IF -o $EXT_IF -s $VPN_VM -p $VPN_PROTOCOL --sport $VPN_PORT -j ACCEPT
# VPN access to server's private LAN
$IPTABLES -A FORWARD -i $VIRT_IF -o $VIRT_IF -s $VM -d $VPN_NET -j ACCEPT
$IPTABLES -A FORWARD -i $VIRT_IF -o $VIRT_IF -s $VPN_NET -d $VM -j ACCEPT
$IPTABLES -A FORWARD -i $VIRT_IF -o $EXT_IF -s $VM -d $VPN_NET -j ACCEPT
chmod +x /home/ubuntu/firewall_on.sh
cd /etc/init.d
sudo ln -s /home/ubuntu/firewall_on.sh
sudo update-rc.d firewall_on.sh defaults

4. (Cliente) Reiniciar el cliente VPN y probar conectividad:

sudo /etc/init.d/openvpn restart
ping 10.0.0.12

Configurar DNS en el cliente

Para que el cliente reciba del servidor VPN parámetros como servidor DNS o Dominio de búsqueda necesitamos configuración tanto en el servidor como en el cliente, y un script en el lado cliente. Si la máquina es Windows el script no es necesario.

Variables:

10.0.0.10 Dirección Ip del servidor DNS
local.jamgo.org Sufijo de búsqueda DNS

1. (Servidor) Editar:

sudo vim /etc/openvpn/server.conf

Y asegurarse que las siguientes lineas están presentes:

...
push "dhcp-option DNS 10.0.0.10"
push "dhcp-option DOMAIN local.jamgo.org"
...

2. (Servidor) Reiniciar el servicio OpenVPN:

sudo /etc/init.d/openvpn restart

3. (Cliente) Instalar el siguiente paquete:

sudo aptitude install resolvconf

4. (Cliente) Asegurarse que tenemos el siguiente archivo (viene con el paquete “openvpn”) y que es ejecutable:

/etc/openvpn/update-resolv-conf

Con el siguiente contenido:

#!/bin/bash
# 
# Parses DHCP options from openvpn to update resolv.conf
# To use set as 'up' and 'down' script in your openvpn *.conf:
# up /etc/openvpn/update-resolv-conf
# down /etc/openvpn/update-resolv-conf
#
# Used snippets of resolvconf script by Thomas Hood <jdthood@yahoo.co.uk> 
# and Chris Hanson
# Licensed under the GNU GPL.  See /usr/share/common-licenses/GPL. 
#
# 05/2006 chlauber@bnc.ch
# 
# Example envs set from openvpn:
# foreign_option_1='dhcp-option DNS 193.43.27.132'
# foreign_option_2='dhcp-option DNS 193.43.27.133'
# foreign_option_3='dhcp-option DOMAIN be.bnc.ch'

[ -x /sbin/resolvconf ] || exit 0

case $script_type in

up)
	for optionname in ${!foreign_option_*} ; do
		option="${!optionname}"
		echo $option
		part1=$(echo "$option" | cut -d " " -f 1)
		if [ "$part1" == "dhcp-option" ] ; then
			part2=$(echo "$option" | cut -d " " -f 2)
			part3=$(echo "$option" | cut -d " " -f 3)
			if [ "$part2" == "DNS" ] ; then
				IF_DNS_NAMESERVERS="$IF_DNS_NAMESERVERS $part3"
			fi
			if [ "$part2" == "DOMAIN" ] ; then
				IF_DNS_SEARCH="$IF_DNS_SEARCH $part3"
			fi
		fi
	done
	R=""
	for SS in $IF_DNS_SEARCH ; do
        	R="${R}search $SS
"
	done
	for NS in $IF_DNS_NAMESERVERS ; do
        	R="${R}nameserver $NS
"
	done
	echo -n "$R" | /sbin/resolvconf -a "${dev}.inet"
	;;
down)
	/sbin/resolvconf -d "${dev}.inet"
	;;
esac

5. (Cliente) Editar:

sudo vim /etc/openvpn/cliente.conf

Y asegurarse que las siguientes lineas están presentes:

...
script-security 2
up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf
...

6. (Cliente) Reiniciar el servicio OpenVPN:

sudo /etc/init.d/openvpn restart

7. (Cliente) Comprobar los cambios:

cat /etc/resolv.conf

Debería aparecer la configuración especificada en el paso 1):

# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 10.0.0.10
search local.jamgo.org

Revocar certificados

http://openvpn.net/index.php/open-source/documentation/howto.html#revoke

1. Comprobar que el certificado a revocar (“usuario.cert” en este ejemplo) se encuentra en el siguiente directorio:

/usr/share/doc/openvpn/examples/easy-rsa/2.0/keys

2. Revocarlo

sudo su
cd /usr/share/doc/openvpn/examples/easy-rsa/2.0
. ./vars
./revoke-full usuario

Salida esperada:

Using configuration from /root/openvpn/20/openvpn/tmp/easy-rsa/openssl.cnf
DEBUG[load_index]: unique_subject = "yes"
Revoking Certificate 04.
Data Base Updated
Using configuration from /root/openvpn/20/openvpn/tmp/easy-rsa/openssl.cnf
DEBUG[load_index]: unique_subject = "yes"
client2.crt: /C=KG/ST=NA/O=OpenVPN-TEST/CN=client2/emailAddress=me@myhost.mydomain
error 23 at 0 depth lookup:certificate revoked

El “error 23” al final es normal

3. Actualizar la lista de certificads revocados (se encuentra en la ruta especificada en el parámetro “crl-verify” del archivo de configuración del servidor):

cat /usr/share/doc/openvpn/examples/easy-rsa/2.0/keys/crl.pem » /etc/openvpn/crl.pem

4. Supongo que tiene sentido reiniciar/recargar openvpn:

sudo /etc/init.d/openvpn reload

5. La siguiente vez que se intente conectar el usuario “usuario” no podrá hacerlo, y aparecerán las siguientes entradas en los logs:

Cliente

Fri Apr  5 19:27:06 2013 Connection reset, restarting [0]
Fri Apr  5 19:27:06 2013 TCP/UDP: Closing socket
Fri Apr  5 19:27:06 2013 SIGUSR1[soft,connection-reset] received, process restarting
Fri Apr  5 19:27:06 2013 Restart pause, 5 second(s)

Servidor

Fri Apr  5 19:01:02 2013 31.4.107.170:35244 CRL CHECK FAILED: /C=ES/ST=BC/L=Barcelona/O=Jamgo/OU=IT/CN=toberevoked/name=To_Be_Revoked/emailAddress=toberevoked@jamgo.es is REVOKED

Receta 2 (parcialmente incompleta)

Instalar OPENVPN

# apt-get install openvpn

Crear certificados

Generar la CA para firmar los certificados

Copiamos el directorio de ejemplo en la carpeta de configuración de OpenVPN:

#/usr/share/doc/openvpn/examples# cp -R easy-rsa/ /etc/openvpn/

Editamos:

donquixot:/etc/openvpn/easy-rsa/2.0# vi vars
export KEY_COUNTRY="ES"
export KEY_PROVINCE="BC"
export KEY_CITY="Mataro"
export KEY_ORG="Lobo99"
export KEY_EMAIL="jose@lobo99.com"
donquixot:/etc/openvpn/easy-rsa/2.0# source ./vars
donquixot:/etc/openvpn/easy-rsa/2.0# ./clean-all
donquixot:/etc/openvpn/easy-rsa/2.0# ./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) [ES]:   State or Province Name (full name) [BC]:Barcelona
Locality Name (eg, city) [Mataro]:
Organization Name (eg, company) [Lobo99]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [Lobo99 CA]:lobo99.com
Name []:
Email Address [jose@lobo99.com]:

Esto genera la CA:

donquixot:/etc/openvpn/easy-rsa/2.0/keys# ls -la
total 6
drwx------ 2 root root 1024 Nov  6 21:21 .
drwxr-xr-x 3 root root 1024 Nov  6 21:20 ..
-rw-r--r-- 1 root root 1204 Nov  6 21:21 ca.crt
-rw------- 1 root root  887 Nov  6 21:21 ca.key
-rw-r--r-- 1 root root    0 Nov  6 21:20 index.txt
-rw-r--r-- 1 root root    3 Nov  6 21:20 serial

Creación de Certificado y llaves para Servidor

donquixot:/etc/openvpn/easy-rsa/2.0# ./build-key-server server
Generating a 1024 bit RSA private key
.................++++++
............................++++++
writing new private key to 'server.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) [ES]:
State or Province Name (full name) [BC]:Barcelona
Locality Name (eg, city) [Mataro]:
Organization Name (eg, company) [Lobo99]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [server]:lobo99.com
Name []:
Email Address [jose@lobo99.com]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:OpenVpn lobo99.com
An optional company name []:
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:'ES'
stateOrProvinceName   :PRINTABLE:'Barcelona'
localityName          :PRINTABLE:'Mataro'
organizationName      :PRINTABLE:'Lobo99'
commonName            :PRINTABLE:'lobo99.com'
emailAddress          :IA5STRING:'jose@lobo99.com'
Certificate is to be certified until Nov  3 20:25:25 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

Generar Certificado para los clientes

./build-key client1
./build-key client2
donquixot:/etc/openvpn/easy-rsa/2.0# ./build-key jose
Generating a 1024 bit RSA private key
...............................++++++
........++++++
writing new private key to 'jose.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) [ES]:
State or Province Name (full name) [BC]:Barcelona
Locality Name (eg, city) [Mataro]:
Organization Name (eg, company) [Lobo99]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [jose]:
Name []:Jose
Email Address [jose@lobo99.com]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:mysecretpassword
An optional company name []:
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:'ES'
stateOrProvinceName   :PRINTABLE:'Barcelona'
localityName          :PRINTABLE:'Mataro'
organizationName      :PRINTABLE:'Lobo99'
commonName            :PRINTABLE:'jose'
name                  :PRINTABLE:'Jose'
emailAddress          :IA5STRING:'jose@lobo99.com'
Certificate is to be certified until Nov  3 20:30:04 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

Generate Diffie Hellman parameters

Diffie Hellman parameters must be generated for the OpenVPN server. On Linux/BSD/Unix:

./build-dh

Ficheros de configuración

donquixot:/etc/openvpn# cp -R /usr/share/doc/openvpn/examples/sample-config-files/ config-files

Habilitar para máquinas virtuales contenedores openvz

vzctl set 101 --devnodes net/tun:rw --save

Fuente: http://wiki.openvz.org/VPN_via_the_TUN/TAP_device

Copiamos ficheros de certificados:

cp -R /usr/share/doc/openvpn/examples/easy-rsa/ /etc/openvpn/

Habilitar IP fordwarding en el servidor:

# echo 1 > /proc/sys/net/ipv4/ip_forward

En el fichero de configuración del servidor, modificamos las siguientes opciones básicas:

server.conf
port 1194

proto udp

dev tun

ca ca.crt
cert server.crt
key server.key  # This file should be kept secret

dh dh1024.pem

server 10.8.0.0 255.255.255.0

push "route 192.168.1.0 255.255.255.0"
push "route 10.139.0.0 255.255.0.0"

El servidor se arranca con:

# openvpn server.conf

En la parte del cliente, pasamos los ficheros de certificados y el de configuración client.conf

El cliente se conecta con:

# openvpn clien.conf

Para acceder a las subredes, está tiene que enrutar hacía la subred del vpn, en este caso la 10.8.0.0
He añadido la ruta 10.8.0.0 a la miktorik y un nat para que vuelva:

ip > firewall
General
Chain: srcnat
Src.Address: 10.8.0.0/24
Action
Action: src-nat
To Addresses: 10.139.56.129

Y la ruta 10.8.0.0/24 → 10.139.67.103 (ip del servidor vpn)

Autenticación LDAP

/etc/openvpn/auth/auth-ldap.conf
      URL             ldaps://ldap.guifi.net/

<Authorization>
      # Base DN
      BaseDN          "dc=guifi,dc=net"

      # User Search Filter
      SearchFilter    "(&(uid=%u)(accountStatus=active))"

      # Require Group Membership
      RequireGroup    false

      # Add non-group members to a PF table (disabled)
      #PFTable        ips_vpn_users

      <Group>
              BaseDN          "o=proxyusers,dc=guifi,dc=net"
              SearchFilter    "(|(cn=developers)(cn=artists))"
              MemberAttribute uniqueMember
              # Add group members to a PF table (disabled)
              #PFTable        ips_vpn_eng
      </Group>
</Authorization>

IPs estáticas

http://dnaeon.github.io/static-ip-addresses-in-openvpn/

1. Una sola vez

1.1. Crear directorios y archivos:

sudo mkdir /etc/openvpn/ccd
sudo touch /etc/openvpn/ipp.txt

1.2. Editar arhcivo de configuración del servidor VPN:

sudo vim /etc/openvpn/server.conf

Y añadir las lineas:

client-config-dir /etc/openvpn/ccd
ifconfig-pool-persist /etc/openvpn/ipp.txt

1.3. Reiniciar el servicio:

sudo service openvpn restart

2. Para cada cliente

2.1. Crear un archivo con el nombre del certificado que se ha creado:

sudo vim /etc/openvpn/ccd/client1

Y especificar tanto la IP como la IP del servidor VPN:

ifconfig-push 172.16.0.50 172.16.0.1

2.2. Reservar esa IP para ese certificado, para no asignársela a otro cliente:

client1,172.16.0.50

2.3. (Cliente) Reiniciar el servicio VPN:

sudo service openvpn restart

2.4. (Cliente) Comprobar que la IP es la especificada en los pasos 2.1. y 2.2:

sudo ifconfig