Tabla de Contenidos

OpenVPN: configuración

Por Félix Molinuevo, FMSI Sistemas de Informática

Introducción

Este tutorial explica cómo configurar un servidor OpenVPN utilizando el método de routing en vez de bridging, por las razones expuestas aquí.

Se hará uso de easy-rsa. Esto es una colección de scripts que facilitan el manejo de certificados, tanto del servidor como de los clientes. Dicho directorio easy-rsa/ deberá ser copiado de la ubicación original instalada por el paquete OpenVPN al directorio de configuración en /etc/openvpn.

cp -iva /usr/share/doc/openvpn/examples/easy-rsa/2.0 /etc/openvpn/easy-rsa

Tal como se menciona en la documentación y por las razones allí indicadas, se muestran aquí –y se recomienda usar– direcciones IP de clase A para el túnel (10.8.0.0/24) y de clase B para la intranet (172.16.10.0/24).

Instalación de paquetes

Para OpenVPN, se instalaron los siguientes paquetes:

aptitude install openvpn openssl bridge-utils

Creación del certificado y la clave Certificate Authority (CA)

Los scripts para trabajar con certificados estarán en /etc/openvpn/easy-rsa luego de copiar dicho directorio tal como se explica más arriba.

En Lenny, Easy-RSA viene en las versiones 1.0 y 2.0. Se usará 2.0 en este tutorial.

Recordar editar las variables del archivo “vars” con los valores correctos para el servidor en cuestión. Adicionalmente, si se desea generar un CA con contraseña, tipear el parámetro “–pass” para el script build-ca

cd /etc/openvpn/easy-rsa/
. ./vars
./clean-all
./build-ca --pass
./build-key-server server

Generación de los parámetros Diffie Hellman

./build-dh

Creación de los certificados y claves de cada cliente

Sin contraseña:

. ./vars
./build-key client1
./build-key client2
./build-key client3

Con contraseña:

. ./vars
./build-key-pass client1
./build-key-pass client2
./build-key-pass client3

En cada cliente, se deben copiar en el directorio config/ los siguientes archivos: ca.crt (el CA parte pública del servidor), client1.crt, client1.key y client1.csr.

Si se usan varios servidores OpenVPN distintos, se puede cambiar los nombres de cada uno, para diferenciarlos, reflejando dichos cambios en los archivos de configuración del cliente; estos archivos de configuración del cliente también pueden ser varios. El cliente OpenVPN GUI luego mostrará un menú con los distintos servidores para los cuales está configurado, permitiendo establecer uno o más túneles simultáneamente o no.

Creación del archivo crl.pem (Certificate Revocation List) y permisos

Para generar el archivo crl.pem, necesario para la revocación de certificados, se debe crear un certificado y revocarlo para que dicho archivo se cree y OpenVPN funcione correctamente, pero antes se debe comentar en el openssl.cnf (ya sea el easy-rsa o el de OpenSSL instalado en el servidor) la sección PKCS (si no se utiliza) tal como se describe al final de este tutorial:

. ./vars
./build-key client1
./revoke-full client1

Adicionalmente, como OpenVPN según esta configuración es ejecutado con el uid y gid “nobody”, se deben cambiar los permisos del directorio keys para que pueda leer el archivo “crl.pem”:

chmod o+x keys/

Revocación de certificados

Para revocar un certificado se utiliza el siguiente comando:

. ./vars
./revoke-full <common-name>

<common-name> es simplemente el nombre del cliente tal como se creó, según se muestra más arriba. La revocación toma validez inmediatamente:

...
error 23 at 0 depth lookup:certificate revoked

Notar el “error 23” la última línea. Esto es correcto, e indica que la verificación del certificado revocado falló, tal como se desea.

Si el usuario ya está conectado, se debe desconectarlo con:

<Completar>

Configuración del servidor

server.conf:

port 1194
proto udp
dev tun

ca /etc/openvpn/easy-rsa/keys/ca.crt
crl-verify /etc/openvpn/easy-rsa/keys/crl.pem
cert /etc/openvpn/easy-rsa/keys/server.crt
key /etc/openvpn/easy-rsa/keys/server.key  # This file should be kept secret
dh /etc/openvpn/easy-rsa/keys/dh1024.pem

server 10.8.0.0 255.255.255.0

ifconfig-pool-persist ipp.txt

keepalive 10 120

comp-lzo

user nobody
group nobody

persist-key
persist-tun

status /var/log/openvpn-status.log

verb 3

push "route 172.16.10.0 255.255.255.0"
push "dhcp-option WINS 172.16.10.1"
push "dhcp-option DNS 172.16.10.1"
push "dhcp-option DOMAIN dominio"

Estos comandos “push” le inyectan al cliente la configuración de la ruta, el DNS, el WINS y el dominio, y deben ser los correspondientes a la red que el servidor OpenVPN está sirviendo.

Cambios en el archivo easy-rsa/openssl.cnf

Si no se usa PKCS, la siguiente sección debe estar comentada:

#pkcs11 = pkcs11_section

# [ pkcs11_section ]
# engine_id = pkcs11
# dynamic_path = /usr/lib/engines/engine_pkcs11.so
# MODULE_PATH = $ENV::PKCS11_MODULE_PATH
# PIN = $ENV::PKCS11_PIN
# init = 0

Esto es necesario para que la línea “crl-verify /etc/openvpn/easy-rsa/keys/crl.pem” del archivo de configuración del servidor no provoque un error e impida iniciar OpenVPN. Dicha línea es necesaria para que la revocación de los certificados funcione.

Reglas necesarias en el firewall que protege al servidor OpenVPN

Las siguientes reglas Iptables permiten que Netfilter acepte conexiones entrantes en la interfaz TUN y reenvíe las peticiones hacia dentro de la red:

iptables -I INPUT -i tun+ -j ACCEPT
iptables -I FORWARD -i tun+ -s 10.8.0.0/24 -d 172.16.10.0/24 -j ACCEPT

Configuración de Shorewall para el caso que el servidor OpenVPN esté en el propio firewall

En /etc/shorewall/interfaces:

vpn       tun+

En /etc/shorewall/policy:

vpn       loc           ACCEPT
loc       vpn           ACCEPT
vpn       $FW           ACCEPT
$FW       vpn           ACCEPT

En /etc/shorewall/tunnels (aaa.bbb.ccc.ddd es la IP externa del servidor OpenVPN):

openvpn:1194  net            0.0.0.0/0

En /etc/shorewall/zones:

vpn       ipv4

Configuración de Shorewall para el caso que el servidor OpenVPN sea interno

En /etc/shorewall/policy:

vpn             all             ACCEPT          -

En /etc/shorewall/rules:

DNAT            net                     loc:192.168.1.1                 udp             1194

En /etc/shorewall/zones:

vpn     ipv4

Si se necesita llegar a otros equipos internos en este caso

Se debe activar IP forwarding en el servidor que está ejecutando el servicio OpenVPN, y generar una regla Netfilter para que realice masquerading (enmascaramiento):

Configuración de Shorewall para road warriors y OpenVPN corriendo en el firewall

En /etc/shorewall/zones:

#ZONE   TYPE   OPTIONS                 IN                      OUT
#                                      OPTIONS                 OPTIONS
road    ipv4

En /etc/shorewall/interfaces:

#ZONE      INTERFACE        BROADCAST     OPTIONS
road       tun+

En /etc/shorewall/tunnels:

#TYPE               ZONE           GATEWAY        GATEWAY ZONE
openvpnserver:1194  net            0.0.0.0/0

Para que los sistemas remotos (road warriors) tengan acceso a la red local, se debe permitir su acceso en /etc/shorewall/policy (asumiendo que la red local haya sido llamada zona “loc”):

#SOURCE      DESTINATION        POLICY
road         loc                ACCEPT

Configuración del cliente

En Windows, instalar OpenVPN GUI. Se deben copiar los archivos del servidor “ca.crt”, y los archivos específicos para ese cliente creados en el servidor, por ejemplo “client1.crt”, “client1.csr” y “client1.key”, al directorio config/, junto con el archivo de configuración que figura a continuación.

client.ovpn:

client
proto udp
dev tun
remote aaa.bbb.ccc.ddd 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client1.crt
key client1.key
comp-lzo
verb 3
ns-cert-type server

aaa.bbb.ccc.ddd es la dirección IP del servidor OpenVPN. Se deben cambiar también los valores ca, cert, y key por los correspondientes al cliente.

Se puede tener tantos archivos de configuración de cliente .ovpn como se necesiten, simplemente poniéndoles distintos nombres, dejando la misma extensión, y cambiando internamente los valores mencionados.

Resolución de problemas

En ocasiones, cuando las redes tienen problemas con el MTU, se puede limitar este valor usando en el servidor algo como:

mssfix 1300
fragment 1300

y en el cliente:

fragment 1300

Los valores tienen que ser iguales para las tres líneas, tanto en el servidor como en el cliente. Valores comunes son 1200, 1300 o 1400. Se puede probar cuál anda mejor.

Notas finales

Esta configuración ha sido probada sobre conexiones de módem 56Kbps, a través de redes inalámbricas, y a través de NAT, incluso desde máquinas virtuales Qemu, mostrando siempre funcionar a la perfección.

La ventana de estado de OpenVPN GUI tiene un útil botón “Reconnect” que permite reconectar rápidamente la VPN; esto mostró ser muy práctico en las pruebas, ya que cambiábamos de una conexión a otra, y simplemente el pulsar ese botón reconectaba el túnel.

Bibliografía

  1. OpenVPN Home: http://openvpn.net/
  2. OpenVPN tunnels and bridges: http://www.shorewall.net/OPENVPN.html