Cómo montar un servidor VPN con OpenVPN sobre Debian 8 Jessie

Bienvenidos al primer post de mi blog.
Para estrenarnos os enseñare a como montar servidor OpenVPN sobre un sistema Debian 8 Jessie ya sea sobre un dedicado, una Raspberry PI o en VPS inclusive uno sobre OpenVZ.

1. Instalar OpenVPN y easyRSA

Recordemos que debemos tener permisos de administrador para instalar nuestro servidor.
Antes que nada actualizaremos nuestros repositorios

sudo apt-get update

Luego instalaremos los paquetes OpenVPN y Easy-RSA

sudo apt-get install openvpn easy-rsa

El paquete OpenVPN es el servidor en cuestión, mientras que easy-rsa nos facilitara la vida a la hora de generar los certificados.

2. Configurar OpenVPN

Lo primeros que tendremos que hacer es copiar el archivo de ejemplo a la carpeta de configuración /etc/openvpn para esto ejecutaremos el siguiente comando:

gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server.conf

Modificaremos el archivo, siguiendo lo indicado en la siguiente lista.

  • Modificaremos la linea 32 y estableceremos el puerto que prefiráis. Esto no es necesarío pero si recomendable.
  • En la linea 87 cambiaremos el dh1024.pem por dh2048.pem, para más información sobre el dhparam click aquí.
  • Debes descomentar la linea 187 (para descomentarla solo tienes que quitar el ; inicial), esto forzara a los clientes a redirigir el trafico a través de nuestro servidor para así protegernos de ataques MitM.
  • Ahora descomenta las lineas 195 y 196, estas lineas definen los servidores DNS a usar, podemos poner los que queramos (por defecto están escritos los de OpenDNS).
  • Ahora descomentaremos la linea 245 la cual presenta este contenido "AES-128-CBC", remplazaremos el 128 por 256. Esto hará que algoritmo de cifrado sea muy difícil de romper.
  • A continuación de la linea anterior añadiremos una nueva linea que ponga (sin las comillas) "auth SHA512", esto definira el algoritmo con el que se inicia sesión a uno más robusto.
  • Después descomentaremos las lineas 263 y 264, la cuales hacen que el servidor se ejecute con un nivel de permisos inferior (pero suficientes para su proposito) lo cual es más seguro.

Al final nos debe quedar un archivo de configuración similar a este.

3. Habilitar el reenvió de paquetes

Para que nuestro servidor sea capaz de redirigir nuestra conexión con internet tendremos que cambiar algunas configuraciones del Kernel.

* En caso de usar un VPS con OpenVZ es comprobar el estado del TUN/TAP, si usamos cualquier otra cosa podemos saltarnos este paso. para ello solo tenemos que ejecutar lo siguiente:

cat /dev/net/tun

Si nos devuelve "cat: /dev/net/tun: File descriptor in bad state", todo estara bien, en caso contrarío debemos contactar con nuestro proveedor de VPS.

Simplemente tenemmos que ejecutar lo siguiente:

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

y luego editaremos el archivo /etc/sysctl.conf y descomentamos la linea que contenga lo siguiente net.ipv4.ip_forward=1 y luego guardmos.

4. Configurar iptables

Iptables es el firewall por defecto en Debian 8, y es necesario configurarlo para
que no permite hacer el reenvio de paquetes.
Este apartado apenas tendrá explicaciones ya que no tengo mucho que aportar.
Simplemente tenéis que ejecutar los comandos uno por uno, teniendo en cuenta que cada "iptables" inicia un comando nuevo y que las lineas precedidas de # son comentarios y por supuesto no los tenéis que ejecutar.

iptables -A INPUT -i tun+ -j ACCEPT
iptables -A FORWARD -i tun+ -j ACCEPT
iptables -A FORWARD -s 10.8.0.0/8 -j ACCEPT
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

#Solo los que su servidor sea OpenVZ
iptables -t nat -A POSTROUTING -s 10.8.0.0/8 -j SNAT --to-source <IP de tu servidor>
#Solo los que no usen un servidor sobre OpenVZ
iptables -t nat -A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE

Iptables pierde su configuración cuando se apaga para que esto no pase simplemente instalamos el paquete iptables-persistent.

apt-get install -y iptables-persistent

Y con esto ya tenemos iptables configurado.

5. Creación de certificados

Para la autentificación vamos a utilizar un sistema de llave publica y llave privada, basándonos en el uso de nuestra propia CA de confianza para que firme nuestros certificados (llave publicas).
Para hacer esto nos serviremos del paquete easy-rsa el cual nos facilitara en gran medida el proceso.

Para esto copiaremos el paquete easy-rsa a la carpeta de configuración de openvpn y adicionalmente crearemos un crearemos una carpeta llamada "keys" dentro de la carpeta easy-rsa, todo esto se puede hacer ejecutando lo siguiente:

cp -r /usr/share/easy-rsa/ /etc/openvpn && mkdir /etc/openvpn/easy-rsa/keys

Ahora editaremos el archivo de configuración de easy-rsa que se encontraría en /etc/openvpn/easy-rsa/vars con nuestro editor favorito.

En el modificaremos los campos KEY_COUNTRY, KEY_PROVINCE, KEY_CITY, KEY_ORG, KEY_EMAIL, KEY_OU. Según sean acordes con nosotros, en mi caso yo lo dejaría de la siguiente forma:

export KEY_COUNTRY="ES"
export KEY_PROVINCE="CA"
export KEY_CITY="Santa Cruz de Tenerife"
export KEY_ORG="Claudio4"
export KEY_EMAIL="[email protected]"
export KEY_OU="Security"

adicionalmente debemos modificar la linea que contiene export KEY_NAME="EasyRSA" y cambiar el EasyRSA por server, si utilizamos cualquier otro valor lo debemos especificar en la configuración de OpenVPN (lineas 79 y 80).

Bien, ahora lo primero que haremos sera generar el dhparam, para ello usamos el siguiente comando:

openssl dhparam -out /etc/openvpn/dh2048.pem 2048

Suele tardar los suyo por lo que podemos irnos a tomar un café con tranquilidad.

Ahora generaremos nuestra CA y los certificados de nuestro servidor, para ello nos dirigiremos al directorio raíz de Easy-RSA.

cd /etc/openvpn/easy-rsa

Una vez en su interior ejecutaremos los siguientes comandos:

. ./vars && ./clean-all

Para generar la CA ejecutaremos el siguiente comando (salta todas las preguntas pulsando enter)

./build-ca

Ahora generamos los certificados del servidor, para ello ejecutaremos el comando que viene a continuación y no le estableceremos ninguna contraseña y diremos que sí (y) a las dos preguntas finales.

./build-key-server server

Después coparemos los certificados a la raíz de OpenVPN.

cp /etc/openvpn/easy-rsa/keys/{server.crt,server.key,ca.crt} /etc/openvpn

Le estableceremos un permiso de 700 para evitar que alguien nos pueda robar nuestra llave privada.

chmod 700 /etc/openvpn/server.key

6. Crear perfiles de los clientes

Lo ultimo que nos queda es generar perfiles con los que se pueda acceder al VPN, debéis tener en cuenta que por seguridad OpenVPN solo permite un dispositivo simultáneamente por perfil (este comportamiento puede ser modificado descomentando la linea 217).
Lo primero sera generar nuestra plantilla para generar los usuarios, para esto copiaremos la base de los archivos de ejemplo de OpenVPN:

cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/easy-rsa/keys/client.ovpn    

Ahora nos toca editar este archivo que se encuentra en /etc/openvpn/easy-rsa/keys/client.ovpn.

  • Linea 42 pondremos la IP o dominio de nuestro servidor despues de "remote". tras la IP modificaremos el puerto al que nosotros hayamos definido en caso de haberlo cambiado.
  • Descometamos las lineas 61 y 62, para ajustar los permisos (en algunos sistemas como Archlinux, puede aparecer un error de que el grupo no existe, en tal caso solo sustituiremos el nogroup por nobody).
  • Debemos comentar (poner un ; al inicio de la linea) las lineas 88, 89 y 90.
  • La linea 112 debe ser descomentada y sustituir la "x" después de cipher por AES-256-CBC, esto indicara al cliente que algoritmo esta utilizando el servidor.
  • En la linea inmediatamente posterior (113) se debe colocar lo siguiente "auth SHA512" (sin las comillas) para indicarle al cliente el algoritmo de autentificación.

Lo ultimo que nos queda es incluir el certificado de nuestra CA en la plantilla para que los clientes puedan comprobar la veracidad del certificado del servidor, para esto hacemos los siguiente:

echo '<ca>' >> /etc/openvpn/easy-rsa/keys/client.ovpn && cat /etc/openvpn/ca.crt >> /etc/openvpn/easy-rsa/keys/client.ovpn && echo '</ca>' >> /etc/openvpn/easy-rsa/keys/client.ovpn

Ahora generaremos los certificados que identifican a nuestro cliente, recordad que tendremos que generar una para cada uno, para hacerlo todo más sencillo recurriremos a una variable de entorno para que podáis copiar y pegar ya que de otra forma se vuelve tedioso.

Para definirla ejecutamos lo siguiente cambiando el texto entre las comillas (pero sin suprimirlas).

export OVPNUSER="myuser"

Ahora para generar los certificados simplemente ejecutamos el siguiente comando sin modificar nada.

./build-key $OVPNUSER

y ahora para generar el archivo .ovpn simplemente ejecutamos lo siguiente:

cp /etc/openvpn/easy-rsa/keys/client.ovpn /etc/openvpn/easy-rsa/keys/$OVPNUSER.ovpn && echo '<cert>' >> /etc/openvpn/easy-rsa/keys/$OVPNUSER.ovpn && cat /etc/openvpn/easy-rsa/keys/$OVPNUSER.crt >> /etc/openvpn/easy-rsa/keys/$OVPNUSER.ovpn && echo '</cert>' >> /etc/openvpn/easy-rsa/keys/$OVPNUSER.ovpn && echo '<key>' >> /etc/openvpn/easy-rsa/keys/$OVPNUSER.ovpn && cat /etc/openvpn/easy-rsa/keys/$OVPNUSER.key >> /etc/openvpn/easy-rsa/keys/$OVPNUSER.ovpn && echo '</key>' >> /etc/openvpn/easy-rsa/keys/$OVPNUSER.ovpn

Después de esta macro concadenación de comandos simplemente nos queda reiniciar nuestro servidor OpenVPN para que cargue todas nuestras configuraciones.

systemctl restart openvpn

Ahora solo nos queda descargar los archivos .ovpn correspondiente a cada uno de nuestros clientes y conectarnos a nuestro servidor.

Espero que os haya gustado el articulo y que sigáis el blog.

Esta guía se ha basado en las guías de digitalocean, en la de rusadmin y en la de vpsineu.

Un saludo y que tengáis un buen día.

Claudio4

Soy un joven desarrollador apasionado por la tecnología y las ciencias, especialmente interesado en el código libre y amante de las soluciones self-hosted.

Universo observable https://www.claudio4.com

Subscribe to Developing on my way

Get the latest posts delivered right to your inbox.

or subscribe via RSS with Feedly!