Tal vez algunos de mis más viejos y queridos lectores recuerden que hace un tiempo monté mi servidor VPN sobre Debian 6 utilizando OpenVPN. Habiendo finalizado ya el soporte LTS para Debian 6 y sin muchas intenciones de migrarlo a Debian 7 (pienso que no vale la pena pues el soporte LTS para Wheezy es sólo hasta 2018, apenas dos años más, siendo que este servidor estuvo en producción 4 años de forma ininterrumpida) qué mejor oportunidad para poner en producción mi primer servidor OpenBSD.



En el artículo Trabajando con ports en OpenBSD demostré como instalar OpenVPN desde los ports de OpenBSD. Por ende sólo resta configurarlo, o más bien migrar su configuración actual en el viejo servidor Debian 6, para no perder la infraestructura de autenticación (easy-rsa) ni tener que regenerar todos los certificados cliente. El objetivo es migrar el servidor sin interrumpir el servicio y sin que los usuarios lo noten.

El primer paso consiste en habilitar el reenvío de paquetes IP, para que el servidor OpenBSD funcione como router. Para ello simplemente se debe configurar la variable del kernel net.inet.ip.forwarding:

# sysctl net.inet.ip.forwarding
net.inet.ip.forwarding=0
# sysctl net.inet.ip.forwarding=1
net.inet.ip.forwarding: 0 -> 1
# sysctl net.inet.ip.forwarding
net.inet.ip.forwarding=1

Con sysctl se establece el valor de la variable y se habilita el reenvío de paquetes de forma inmediata, pero, como toda variable del kernel, para que este cambio sea persistente al reiniciar el sistema, es necesario configurarla en el archivo /etc/sysctl.conf:

# vi /etc/sysctl.conf

Agregar la siguiente línea:

net.inet.ip.forwarding=1

Habiendo habilitado el reenvío de paquetes IP, es necesario ingresar en el viejo servidor Debian a fin de copiar los archivos de configuración de OpenVPN al nuevo servidor OpenBSD:

root@vpn:~# cd /etc/
root@vpn:/etc# tar czvf ~/etc-openvpn.tar.gz openvpn
root@vpn:/etc# scp -P 2222 /root/etc-openvpn.tar.gz sysadmin@obsd59.linuxito.com:~

Luego, en el servidor OpenVPN y una vez autenticado como "root", extraer los archivos de configuración de OpenVPN:

# cd /etc/
# tar xzvf /home/sysadmin/etc-openvpn.tar.gz 
# cd /etc/openvpn/

A continuación se deben cambiar todas las rutas relativas por absolutas en el archivo de configuración server.conf.

Antes de verificar el funcionamiento del servidor OpenVPN es necesario abrir el puerto 1194 en el firewall (pf), para que los clientes puedan conectarse a la VPN. Basta con agregar la siguiente regla:

pass in proto tcp from 192.168.1.0/24 to port 1194

Esta regla sólo permite el acceso a la VPN a clientes dentro de la red 192.168.1.0/24. Filtrar por IP de origen es una buena práctica de seguridad, sobre todo en componentes críticos como un servidor de VPN, el cual funciona como puerta de entrada a una red interna.

Por otro lado, si se requiere implementar NAT (a fin de que los clientes puedan acceder desde la VPN hacia redes internas), será necesario también agregar la configuración en el firewall. La implementación de NAT en pf es muy simple y está documentada en la documentación de OpenBSD: OpenBSD PF - Network Address Translation.

Para aquellos que tengan dificultades en comprender el concepto de NAT y sus diferentes variantes, encontré este excelente artículo al respecto.

A modo de ejemplo, suponiendo que:

  • 192.168.1.0/24 es la red "externa" donde se encuentran los clientes que desean acceder a la red privada.
  • 10.6.20.0/24 es la red VPN a través de la cual se comunican clientes y servidor VPN.
  • 172.16.5.0/24 es la red privada detrás de la VPN (es decir, dentro de la organización, a la cual desean poder acceder los clientes desde el "exterior").
  • 172.16.5.100 es la dirección IP que tiene el servidor VPN en la red privada.

Lo que en Linux se resolvía con iptables de la siguiente forma (utilizando masquerade):

# Habilitar NAT hacia la red 172.16.5.0/24
/sbin/iptables -t nat -A POSTROUTING -s 10.6.20.0/24 -d 172.16.5.0/24 -j MASQUERADE

En OpenBSD se implementa con pf utilizando la directiva "nat-to":

# Habilitar NAT hacia la red 172.16.5.0/24
pass out from 10.6.20.0/24 to 172.16.5.0/24 nat-to 172.16.5.100

La diferencia al utilizando pf, es que se requiere indicar, además de las redes source y destination, la dirección IP del servidor que se utilizará para enmascarar el tráfico proveniente desde la red origen (en este caso 10.6.20.0/24).

Además es necesario permitir explícitamente el tráfico desde la VPN hacia red privada:

# Permitir todo el tráfico entrante desde la VPN hacia la red 172.16.5.0/24
pass in from 10.6.20.0/24 to 172.16.5.0/24

Claro está que, para que todo esto funcione, es necesario enviar a los clientes (al momento de conectarse a la VPN) la ruta hacia la red privada en la configuración del servidor (server.conf):

push "route 172.16.5.0 255.255.255.0"

Es posible lanzar el servidor manualmente para verificar que todo funcione:

# openvpn --config /etc/openvpn/server.conf

Uno de los clientes deberá conectarse al nuevo servidor VPN. Si el cliente logra conectarse, se verán los mensajes de log en la salida estándar de la consola donde fue lanzado el servidor.

Habiendo comprobado que el servidor VPN funciona correctamente, basta configurar el sistema para que el servicio se inicie automáticamente. A diferencia de cualquier sistema GNU/Linux, donde sería necesario instalar un script de inicio de servicio, en OpenBSD basta con configurar una interfaz de red tun, por ejemplo "tun0":

# vi /etc/hostname.tun0

Configurar la interfaz de la siguiente forma:

up
!/usr/local/sbin/openvpn --daemon --config /etc/openvpn/server.conf 

Finalmente, iniciar el servicio levantando la nueva interfaz:

# sh /etc/netstart tun0

Referencias

man openvpn
man pf.conf
man tun
man netstart

Building VPNs on OpenBSD - OpenVPN

Microsoft TechNet - Public and Private Addresses

NAT (Network Address Translation)


Tal vez pueda interesarte


Compartí este artículo