Cómo montar un servidor de VPN con OpenVPN en Debian 9 (systemd)

Anteriormente expliqué detalladamente el proceso de instalación y configuración de un servidor OpenVPN, incluyendo la generación de certificados y configuración de clientes. En aquel momento utilizaba un servidor Ubuntu Server 12.04 LTS. Ahora me tocó montar un nuevo servidor de VPN, pero esta vez sobre un sistema Debian 9 con systemd.

En este artículo voy a explicar cuáles son los pasos necesarios para instalar correctamente OpenVPN en Debian 9, teniendo en cuenta las particularidades a tener en cuenta para que funcione con systemd. El proceso es muy similar al que cubre mucho más detalladamente el artículo Instalación y configuración de OpenVPN.







Para comenzar, actualizar el sistema e instalar OpenVPN:

# apt-get update && apt-get dist-upgrade # apt-get install openvpn

Esa es la parte más fácil. A continuación comienza el proceso de configuración de la CA autofirmada utilizando el paquete de herramientas provisto por easy-rsa:

# cp -a /usr/share/easy-rsa /etc/openvpn/ # cd /etc/openvpn/easy-rsa/ # nano vars

El script vars se encarga de definir los parámetros para la CA autofirmada. Para simplificar la tarea al momento de generar certificados, se recomienda configurar adecuadamente las siguientes variables:

# In how many days should the root CA key expire? export CA_EXPIRE=3650 # In how many days should certificates expire? export KEY_EXPIRE=3650 # These are the default values for fields # which will be placed in the certificate. # Don't leave any of these fields blank. export KEY_COUNTRY="AR" export KEY_PROVINCE="Buenos Aires" export KEY_CITY="Bahía Blanca" export KEY_ORG="Linuxito.com" export KEY_EMAIL="admin@linuxito.com" export KEY_OU="Sistemas"

El paquete easy-rsa incluye ejemplos de configuración de OpenSSL para diferentes versiones. Para verificar qué versión de OpenSSL tenemos instalada, ejecutar openssl version :

root@debian9:/etc/openvpn/easy-rsa# openssl version OpenSSL 1.1.0f 25 May 2017

Copiar el archivo de configuración de ejemplo más adecuado para nuestra versión de OpenSSL:

# cp openssl-1.0.0.cnf openssl.cnf

En este punto es posible configurar la CA:

# . ./vars # ./clean-all # ./build-ca

Y crear un certificado cliente:

# ./build-key cliente1

Al haber seteado correctamente todas las variables dentro del script vars , es posible simplemente presionar enter en cada pregunta (dado que los valores por defecto han sido correctamente definidos).

A continuación se debe configurar el servidor OpenVPN:

# cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/ # cd /etc/openvpn/ # gunzip server.conf.gz # nano server.conf

Editar correctamente las siguientes variables:

proto tcp ;proto udp ca easy-rsa/keys/ca.crt cert easy-rsa/keys/server.crt key easy-rsa/keys/server.key # This file should be kept secret dh easy-rsa/keys/dh2048.pem server 10.8.0.0 255.255.255.0

Comentar la siguiente línea para deshabilitar la autenticación HMAC:

;tls-auth ta.key 0 # This file is secret

Además es necesario comentar la siguiente línea si se desea para trabajar sobre TCP en lugar de UDP:

;explicit-exit-notify 1

Luego es necesario habilitar el forwarding de paquetes IP:

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

Para hacer este cambio permanente, editar el archivo /etc/sysctl.conf :

# nano /etc/sysctl.conf

Y descomentar o la siguiente línea:

# Uncomment the next line to enable packet forwarding for IPv4 net.ipv4.ip_forward=1

Verificar el funcionamiento del servidor ejecutando directamente el binario openssl :

root@debian9:/etc/openvpn# openvpn server.conf Mon Jun 18 17:01:02 2018 OpenVPN 2.4.0 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Jul 18 2017 Mon Jun 18 17:01:02 2018 library versions: OpenSSL 1.0.2l 25 May 2017, LZO 2.08 Mon Jun 18 17:01:02 2018 Diffie-Hellman initialized with 2048 bit key Mon Jun 18 17:01:02 2018 ROUTE_GATEWAY 192.168.1.1/255.255.255.0 IFACE=eth0 HWADDR=6d:6f:de:2a:a6:2c Mon Jun 18 17:01:02 2018 TUN/TAP device tun0 opened Mon Jun 18 17:01:02 2018 TUN/TAP TX queue length set to 100 Mon Jun 18 17:01:02 2018 do_ifconfig, tt->did_ifconfig_ipv6_setup=0 Mon Jun 18 17:01:02 2018 /sbin/ip link set dev tun0 up mtu 1500 Mon Jun 18 17:01:02 2018 /sbin/ip addr add dev tun0 local 10.8.0.1 peer 10.8.0.2 Mon Jun 18 17:01:02 2018 /sbin/ip route add 10.8.0.0/24 via 10.8.0.2 Mon Jun 18 17:01:02 2018 Could not determine IPv4/IPv6 protocol. Using AF_INET Mon Jun 18 17:01:02 2018 Socket Buffers: R=[87380->87380] S=[16384->16384] Mon Jun 18 17:01:02 2018 Listening for incoming TCP connection on [AF_INET][undef]:1194 Mon Jun 18 17:01:02 2018 TCPv4_SERVER link local (bound): [AF_INET][undef]:1194 Mon Jun 18 17:01:02 2018 TCPv4_SERVER link remote: [AF_UNSPEC] Mon Jun 18 17:01:02 2018 MULTI: multi_init called, r=256 v=256 Mon Jun 18 17:01:02 2018 IFCONFIG POOL: base=10.8.0.4 size=62, ipv6=0 Mon Jun 18 17:01:02 2018 IFCONFIG POOL LIST Mon Jun 18 17:01:02 2018 MULTI: TCP INIT maxclients=1024 maxevents=1028 Mon Jun 18 17:01:02 2018 Initialization Sequence Completed

Habiendo comprobado que funciona correctamente, detener el proceso mediante Ctrl+C y habilitar el servicio:

# nano /etc/default/openvpn

Configurar "all" o utilizar los nombres de los archivos de configuración correspondientes a los servidores que se deseen iniciar, separados con espacios en blanco, y sin la extensión (en este caso sería simplemente "server"):

AUTOSTART="all"

Luego es necesario recargar la configuración de systemd para recrear todo el árbol de dependencias:

# systemctl daemon-reload

Esto correspondería a ejecutar update-rc.d en sistemas con SystemV. Por estas cosas pienso que systemd es una implementación terrible. Que el gestor de inicio tenga que regenerar todo el árbol de dependencias cada vez que se habilita un servicio, con lo que ello significa y las consecuencias que puede generar en caso de un error. En SystemV simplemente se trata de actualizar una jerarquía de enlaces simbólicos donde nada puede fallar y se hace totalmente fuera de PID 1. En fin, ya se habló mucho sobre ésto y la conclusión es que systemd es una mierda.

Bien, ahora que se regeneró todo el árbol de dependencias es posible iniciar el servicio:

# systemctl start openvpn

Es posible comprobar que el puerto 1194 está abierto y aceptando peticiones:

root@debian9:/etc/openvpn# netstat -tulpn | grep open tcp 0 0 0.0.0.0:1194 0.0.0.0:* LISTEN 3520/openvpn

Voilà.

Referencias



Tal vez pueda interesarte

