#4sysadmins

Inicio » GNU/Linux » Configurar OpenVPN

Configurar OpenVPN

Follow #4sysadmins on WordPress.com

OpenVPN nos permite de forma gratuita crear una red virtual privada (Virtual Private Network ) desde por ejemplo un smartphone hasta nuestra red privada de casa.Podemos aprender un poco mas sobre OpenVPN en esta entrada.

Descargar e instalar OpenVPN

# apt-get install openssl openvpn

Crear CA

Para firmar los certificados, tanto el que se creará para el servidor como para cualquier dispositivo que quiera conectar a la VPN, será necesario crear una autoridad certificadora.

La forma mas sencilla de crear una PKI (Public Key Infrastructure)  es mediante easy-rsa:

En caso de que no se haya instalado con OpenVPN lo haremos nosotros:

# apt-get install easy-rsa
# make-cadir /etc/openvpn/easy-rsa
# cd /etc/openvpn/easy-rsa
# source ./vars

Lo siguiente solo es necesario como precaución, y lo que hace es borrar todo certificado existente. NO deberá de ejecutarse si no hemos instalado easy-rsa recientemente y sospechamos que pueden existir otros certificados generados anteriormente

# ./clean-all

Ahora generamos los parámetros Diffie Hellman:

# ./build-dh

Creamos la CA:

# ./build-ca

Los dos comandos anteriores deberán de haber generado los siguientes archivos bajo el directorio /etc/openvpn/easy-rsa/keys:

  • dh2048.pem: contiene los parámetros Diffie Hallman
  • ca.crt: certificado público de la entidad certificadora
  • ca.key: cable privada de la autoridad certificadora

Nota: los archivos .key deben de tener permisos restrictivos (-r——– root:root) ya que contienen la clave privada con la que se cifran las comunicaciones.

Crear certificados

A continuación se van a crear certificados para todos los servidores/dispositivos/hosts que vayan a mantener comunicaciones mediante VPN. En este ejemplo solo va haber un servidor OpenVPN (el cual tendrá su respectivo certificado) y un cliente.

Certificado servidor:

# ./build-key-server <nombre_del_servidor>

Durante la creación del certificado (tanto para el del servidor como para el de los clientes) se realizarán una serie de preguntas que podemos modificar desde el archivo ./vars

Nota: si realizamos cualquier modificación en el archivo vars deberemos de volver a ejecutar el comando source ./vars

Una vez generado, aparecerán sus respectivos archivos bajo el directorio keys/

  • <nombre_del_servidor>.crt
  • <nombre_del_servidor>.key

Certificado cliente:

# ./build-key <hostname_dispositivo_cliente>

En realidad podemos introducir cualquier otro nombre, pero sin duda como mejor se identifica es así.

Esto igualmente creará sus respectivos archivos.

Crear archivo de configuración cliente

Ya tengamos un dispositivo Android o un sistema Windows o Linux, deberemos de crear un archivo de configuración para el cliente.

# cd /etc/openvpn
# cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf .
# cp client.conf <hostname_dispositivo_cliente>.conf

Nota: si el archivo de configuración va a ir destinado a un dispositivo Android, deberemos de cambiar la extensión .conf por .ovpn

# vi <hostname_dispositivo_cliente>.conf
client
dev tun
proto udp
remote my-server-1 1194
resolv-retry infinite
nobind
user nobody
group nogroup
persist-key
persist-tun
ca ca.crt
cert <hostname_dispositivo>.crt
key <hostname_dispositivo>.key
ns-cert-type server
comp-lzo
verb 3

Nota:  el valor my-server-1 11194 deberemos de cambiarlo por nuestra IP pública o fqdn y si estamos utilizando Windows la interfaz será dev tap

Donde ubicar cada archivo de certificado

En realidad aún falta lo mas importante, que evidentemente es configurar el servidor, pero si estamos siguiendo estos pasos, vamos mejor a situar cada certificado y archivo generados hasta el momento en su sitio.

En el directorio /etc/openvpn del servidor deberán de estar:

  • dh2048.pem
  • ca.crt
  • <hostname_server>.crt
  • <hostname_server>.key

En el directorio /etc/openvpn del cliente (Linux):

Deberemos de transferir los archivos que abajo se citan desde el servidor en el que hemos generado los certificados y el archivo de configuración (habitualmente el propio servidor OpenVPN), hasta el cliente (scp, ftp, USB…).

  • ca.crt
  • <hostname_dispositivo>.crt
  • <hostname_dispositivo>.key
  • <hostname_dispositivo>.conf

Si el dispositivo es por ejemplo un Andriod deberemos de modificar los parámetros ca, cert y key del archivo de configuración, indicando la ruta en el que hemos transferido los archivos, normalmente algo parecido a /sdcard/memory0/Documents/…

Importante: deberemos de realizar todos los pasos desde el apartado «Crear certificados/Certificado cliente» hasta aquí, para cualquier dispositivo extra que quiera conectar con el servidor.

Configurar el servidor OpenVPN

Hasta ahora esta todo prácticamente preparado para una vez configurado los parámetros de configuración del servidor, iniciemos el servicio y la conexión este lista.

# cd /etc/openvpn
# cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz .
# unzip server.conf.gz .
# vi server.conf
local 192.168.1.4    // IP interna del servidor OpenVPN
port 1194
proto udp
dev tun
topology subnet
ca ca.crt
cert <hostname_server>.crt
key <hostname_server>.key
dh dh2048.pem
server 10.8.0.0 255.255.255.0    // network y mask túnel
ifconfig-pool-persist ipp.txt
push "route 192.168.1.0 255.255.255.0"    // network y mask a la que queremos acceder desde el exterior
keepalive 10 120
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
status openvpn-status.log
log-append openvpn.log
verb 3

Configurar forwarding

Para que el sistema sea capaz de reenviar los paquetes de la interfaz tun0 o tap0 a eth0 deberemos de habilitar el forwarding en el sistema:

# vi /etc/sysctl.conf
net.ipv4.ip_forward=1
# sysctl -p /etc/sysctl.conf

Nota: para que el sistema sepa que hacer con los paquetes que llegan por la interfaz túnel, es necesario crear una ruta estática con el comando route add, pero no preocuparos porque esto ya lo hace OpenVPN al iniciarse.

Port forwarding

Dependiendo del router de nuestro proveedor la habilitación de los puertos será de una forma u otra pero normalmente esta opción se encuentra en la pestaña «port forwarding» o similar.

Lo primero es acceder a nuestro router por la IP 192.168.1.1, introducir el usuario y contraseña del router y buscar la pestaña anterior. Si es necesario buscar en la red el manual de como hacerlo para vuestro router específico.

En definitiva lo que se quiere hacer es avisar al router de que todos los paquetes que vayan con destino al puerto 1194 desde el exterior (Internet) se reenvíen al host 192.168.1.4 (en nuestro caso es esta la IP del servidor OpenVPN) por el puerto 1194.

A continuación dejo un screenshot de esta configuración en un router de Jazztel (en mi caso estoy utilizando la ip 192.168.1.50):

portforwarding

Configurar IPtables

Si tenemos activo el cortafuego de Linux IPtables en el servidor, deberemos de crear algunas reglas para que el tráfico sea debidamente enrutado, de lo contrario no será necesario:

# iptables -A FORWARD -i eth0 -o tun0 -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A FORWARD -s 10.8.0.0/24 -o eth0 -j ACCEPT
# iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

Cuando reiniciemos estas reglas desaparecerán. Existen diferentes formas de hacer que persistan o se creen al inicio, aquí solo vamos a comentar una de las posibles válidas, y es meter estas reglas en el archivo /etc/rc.local antes de la línea exit 0 para que cuando el servidor se reinicie se ejecuten estas tres reglas al inicio:

# vi /etc/rc.local
iptables -A FORWARD -i eth0 -o tun0 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -s 10.8.0.0/24 -o eth0 -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

exit0

Configurar UFW

Si tenemos activo el cortafuego de UFW en el servidor VPN, deberemos de crear algunas reglas para que el tráfico sea debidamente enrutado, de lo contrario no será necesario:

# ufw allow ssh

# ufw allow 1194/udp

# vim /etc/default/ufw

DEFAULT_FORWARD_POLICY="ACCEPT"

# vim /etc/ufw/before.rules
#
 rules.before
 #
 Rules that should be run before the ufw command line added rules. Custom
 rules should be added to one of these chains:
 ufw-before-input
 ufw-before-output
 ufw-before-forward
 #
 START OPENVPN RULES
 NAT table rules
 *nat
 :POSTROUTING ACCEPT [0:0] 
 Allow traffic from OpenVPN client to ens3
 -A POSTROUTING -s 10.8.0.0/8 -o ens3 -j MASQUERADE
 COMMIT
 END OPENVPN RULES
 Don't delete these required lines, otherwise there will be errors
 *filter

# ufw enable

# ufw status
Status: active To                         Action      From --                         ------      ---- 22                         ALLOW       Anywhere 1194/udp                   ALLOW       Anywhere 22 (v6)                    ALLOW       Anywhere (v6) 1194/udp (v6)              ALLOW       Anywhere (v6)

Activar los servicios

Una vez realizado todo, es el momento de iniciar OpenVPN:

Si el sistema en el que trabajamos utiliza SysV:

# service openvpn start

Si por el contrario utiliza Systemd:

# systemctl start openvpn@server

IP dinámica y configuración del cliente

En las siguientes entradas veremos como configurar el lado del cliente para iniciar conexión, y como establecer un servicio noIP para que aunque nuestra IP pública cambie (IP dinámica) podamos seguir conectándonos a través de un fqdn.


6 comentarios

  1. numark24 dice:

    Hola, lo primero decirte que la documentación es de calidad, gracias.
    Tengo una duda en el archivo server.conf hay » ; » y » # «,, se que » # » es un comentario, pero como tengo que tratar » ; «,, como un comentario?
    Lo digo por borrarlos o dejarlos de los archivos de configuración de client.conf y server.conf

    Me gusta

  2. numark24 dice:

    Ante todo gracias por el pedazo de guia, al lio.
    En el archivo server.conf al editar el archivo dentro hay «;» y seguido de un parámetro pero tengo una duda, en el ejemplo tuyo de server.conf esta todo sin comillas ¿tengo yo en mi archivo de configuración quitarles las comillas?
    Lo digo por que yo se que el «#» es un comentario pero hay » ; » y no se como tratarlo, como un comentario o no se.
    Gracias

    Me gusta

    • nebul4ck dice:

      Hola numark24 perdona por el retraso pero me ha sido imposible contestarte antes. Supongo que ya lo habrás averiguado, «;» se trata como comentarios al igual que «#». Esto no es válido para todos los archivos de configuración, en este caso puedes aplicarlo perfectamente. Si está todo sin comentar es porque son justamente los parámetros necesarios.

      Me gusta

Deja un comentario, Gracias!