OpenWrt: Openvpn Server

10 minutos de lectura

OpenWrt también ofrece la posibilidad de utilizar nuestro router como un servidor VPN, y así de esta forma, conectarnos de forma segura a nuestra red local desde el exterior. En este otro articulo ya expliqué algunas de las funciones por las que puede ser interesante utilizar un VPN

Instalación

Instalamos los paquetes necesarios

1opkg update
2opkg install openvpn-openssl openssl-util luci-app-openvpn

Si queremos poner los módulos interfaz luci en español:

1opkg install luci-i18n-openvpn-es luci-i18n-base-es luci-i18n-firewall-es

Generar fichero .ovpn para los clientes

Los clientes que se conecten a nuestro servidor OpenVPN necesitan de un fichero de configuración con los certificados que generemos en el paso anterior.

Si nuestro ISP (proveedor de internet) asigna una dirección dinámica a nuestro router y #+ATTR_HTML: :width 50:style border:2px solid black; usamos un DDNS para acceder a él, en la variable wanIP=“nombre.dns.dinamico” pondremos el nombre de nuestro nombre DNS.

Si por el contrario accedes al router a través de una dirección ip, pon el carácter # antes de la variable (#wanIP=“nombre.dns.dinamico”)

Conectamos con nuestro router vía SSH, copiamos y pegamos los siguientes comandos:

 1source /lib/functions/network.sh
 2network_find_wan wanIf
 3network_get_ipaddrs wanIP $wanIf
 4wanIP="tu.dominio.org"
 5OVPN_FILE="/etc/openvpn/OpenVPN.ovpn"
 6cat >> ${OVPN_FILE} <<EOF
 7client
 8dev tun
 9proto udp
10fast-io
11remote $wanIP 1194
12remote-cert-tls server
13nobind
14persist-key
15persist-tun
16comp-lzo no
17verb 3
18key-direction 1
19EOF
20echo '<ca>'    >> ${OVPN_FILE}
21cat            >> ${OVPN_FILE} < /etc/openvpn/ca.crt
22echo '</ca>'   >> ${OVPN_FILE}
23echo '<cert>'  >> ${OVPN_FILE}
24cat            >> ${OVPN_FILE} < /etc/openvpn/cliente.crt
25echo '</cert>' >> ${OVPN_FILE}
26echo '<key>'   >> ${OVPN_FILE}
27cat            >> ${OVPN_FILE} < /etc/openvpn/cliente.key
28echo '</key>'  >> ${OVPN_FILE}
29echo '<tls-auth>'   >> ${OVPN_FILE}
30cat            >> ${OVPN_FILE} < /etc/openvpn/tls-auth.key
31echo '</tls-auth>'  >> ${OVPN_FILE}
32
33# mostrando el fichero OVPN_generado
34echo '----- generado .ovpn file ------'
35cat ${OVPN_FILE}

Copiamos el fichero /etc/openvpn/*.opvn mediante scp o cualquier otro metodo a nuestro ordenador o cliente/s con el que nos vayamos a conectar con el servidor OpenVpn (nuestro router)

También puedes copiar el contenido de la salida del siguiente comando y pegarlo en un fichero:

1cat ${OVPN_FILE}

Solo quedará importar el fichero en los clientes y realizar la conexión.

Generar Certificados Servidor

OpenVPN Server estará instalado en nuestro router, pero necesitamos generar los certificados tanto en la parte del servidor como de los clientes que se conecten al servidor (nuestro router).

Copia y pega los siguientes comandos en la sesión SSH de tu router

 1PKI_DIR="/etc/openvpn/ssl"
 2[ -d ${PKI_DIR} ] && rm -rf ${PKI_DIR}
 3mkdir -p ${PKI_DIR}
 4chmod -R 0600 ${PKI_DIR}
 5cd ${PKI_DIR}
 6touch index.txt; touch index; echo 1000 > serial
 7cp /etc/ssl/openssl.cnf ${PKI_DIR}
 8PKI_CNF=${PKI_DIR}/openssl.cnf
 9sed -i '/^dir/   s:=.*:= /etc/openvpn/ssl:'                            ${PKI_CNF}
10sed -i '/^new_certs_dir/   s:=.*:= /etc/openvpn/ssl:'                  ${PKI_CNF}
11sed -i '/.*Name/ s:= match:= optional:'                                ${PKI_CNF}
12sed -i '/organizationName_default/    s:= .*:= Dominio Ltd.:'  ${PKI_CNF}
13sed -i '/stateOrProvinceName_default/ s:= .*:= Madrid:'                ${PKI_CNF}
14sed -i '/countryName_default/         s:= .*:= ES:'                    ${PKI_CNF}
15sed -i '/default_days/   s:=.*:= 3650:'                                ${PKI_CNF}
16sed -i '/default_bits/   s:=.*:= 4096:'                                ${PKI_CNF}
17
18# cambia el nombre para tus certificados
19cat >> ${PKI_CNF} <<"EOF"
20[ OpenVPN ]
21  keyUsage = digitalSignature, keyEncipherment
22  extendedKeyUsage = serverAuth
23
24[ cliente ]
25  keyUsage = digitalSignature
26  extendedKeyUsage = clientAuth
27EOF
28
29openssl req -batch -nodes -new -keyout "ca.key" -out "ca.crt" -x509 -config ${PKI_CNF} -days 3650
30openssl req -batch -nodes -new -keyout "OpenVPN.key" -out "OpenVPN.csr" -subj "/CN=OpenVPN" -config ${PKI_CNF}
31openssl ca  -batch -keyfile "ca.key" -cert "ca.crt" -in "OpenVPN.csr" -out "OpenVPN.crt" -config ${PKI_CNF} -extensions OpenVPN
32
33
34# añade -nodes si no quieres contraseña
35openssl req -batch -nodes -new -keyout "cliente.key" -out "cliente.csr" -subj "/CN=cliente" -config ${PKI_CNF}
36openssl ca  -batch -keyfile "ca.key" -cert "ca.crt" -in "cliente.csr" -out "cliente.crt" -config ${PKI_CNF} -extensions cliente
37openvpn --genkey --secret tls-auth.key
38chmod 0600 "ca.key"
39chmod 0600 "OpenVPN.key"
40chmod 0600 "cliente.key"
41
42
43# El siguiente comando, dependiendo de tu router, puede llegar a tardar bastante
44openssl dhparam -out dh2048.pem 2048
45
46# Copiamos los certificados en /etc/openvpn
47cp ca.crt OpenVPN.* cliente.* dh2048.pem tls-auth.key /etc/openvpn

Podemos configurar OpenVPN mediante CLi y una sesión de SSH en el router o mediante la interfaz web Luci también en el router, con el fin de aprender y saber lo que vas realizando en vez de introducir comandos sin saber que hacen y porque lo hacen, voy a empezar por explicar como configurar OpenVPN mediante Luci y posteriormente mediante el uso de CLi

Configuración Openvpn mediante Luci

Empezamos creando una interfaz de red nueva para OpenVPN, en el menú Interfaces

Añadir nueva interfaz

Introducimos el nombre que va a tener la nueva interfaz (vpnserver), no vamos a gestionar el protocolo y le decimos que vamos a utilizar nuestra propia interfaz llamada ovpv0

En la pestaña Configuración avanzada activamos la casilla para que la interfaz se inicie con el router, pulsamos en Guardar y aplicar

Vamos a crear una nueva regla en el cortafuegos, para permitir las conexiones al puerto del servido, desde en el menú Cortafuegos nos vamos a Reglas de tráfico

Ponemos un nombre a la regla que estamos creando, el protocolo que se verá afectado por la regla y el puerto que vamos a a abrir para permitir las conexiones

Pulsamos en Editar

En zona de origen marcamos Cualquier zona para indicarle al cortafuegos que permita las conexiones tanto de nuestra red interna (lan) como de las peticiones hechas desde fuera de nuestra red interna (wan) al puerto que hemos indicado antes.

Podemos ver como ahora la regla ha cambiado y ahora permite las conexiones desde cualquier lugar a cualquier zona de nuestra res interna a traves del puerto 1194

Pulsamos en la pestaña Configuración general del cortafuegos

Vamos a añadir una nueva zona al Cortafuegos

Le ponemos un nombre a la nueva zona (vpnserver)

Seleccionamos la interfaz a que va a afectar la nueva zona (vpnserver)

Y marcamos las zonas que van a poder comunicarse en la nueva zona (lan y wan), guardamos y aplicamos.

Ahora deberemos de tener creada una nueva zona (vpnserver) asociada a la interfaz vpnserver con acceso a las zonas lan y wan del cortafuegos,

Ya estaría terminada la parte del cortafuegos, aunque luego veremos como permitir las conexiones al servidor OpenVPN que desde la red local

Vamos a editar la configuración de servidor OpenVPN, en el menú Servicios

Por defecto ya vienen creadas tres configuraciones, las eliminamos

Ponemos un nombre a la configuracion que vamos a crear (openvpn), y seleccionamos Sever configuracion for a routed multi-client VPN

Pulsamos en añadir

Vamos a la configuración avanzada

En la sección networking

Vamos añadiendo los campos necesarios para la configuración, empezamos por mode

Al campo mode le damos el valor server ya que estamos creando la configuración para un servidor OpenVpn.

Añadimos un nuevo campo, port

Ponemos el puerto por el que va escuchar las peticiones el servidor

En el campo dev ponemos la interfaz que se va a usar, y que creamos al principio, openvpn0 y añadimos el campo dev_type

Le damos el valor tun

Añadimos un nuevo campo llamado route_gateway

Le asignamos el valor dhcp

Buscamos el campo keepalive y cambiamos los valores a 110 120 y activamos persist_tun y persist_key

Volvemos a añadir un nuevo campo, topology

Con valor subnet

Ahora vamos a indicarle cuales son los certificados a utilizar por el servidor, nos vamos a Cryptography

Activamos la casilla Activar TLS…

Al igual que antes, debemos de añadir los campos ca, dh, cert, y key, en todos los campos se sigue el mismo procedimiento, voy a poner uno como ejemplo, los demás se harían de forma igual

Una vez añadido el campo, debemos de pulsar en Examinar para buscar el certificado .ca que creamos al principio del manual (/etc/openvpn/ca.crt)

Repetiremos el mismo paso para dh (/etc/openvpn/dh2048.pem), cert (/etc/openvpn/OpenVPN.crt), y key (/etc/openvpn/OpenVPN.key).

También tenemos que añadir el campo tls_auth

Introducimos la ruta donde se encuentra el certificado /etc/openvpn/tls-auth.key añdiendo al final de la linea el valor 0

Marcamos también la casilla client_to_client

Volvemos al menú Descripción general y en el campo server, indicamos en que tramo de red va a trabajar el servidor (_192.168.200.0 255.255.255.0_)

Si queremos que todo el tráfico pase por la interface VPN , tenemos que añadir la opción redirect-gateway def1 a la configuración, yo no he visto que esta opción se pueda hacer desde Luci asi que nos conectamos al router vía SSH e introducimos el comando:

1uci add_list openvpn.vpnserver.push='redirect-gateway def1'

Y si queremos que OpenVPN utilice nuestro router como servidor de DNS

1uci add_list openvpn.vpnserver.push='dhcp-option DNS 192.168.1.1'

Y escribimos los cambios en el fichero de configuración

1uci commit openvpn

Para terminar iniciamos el servicio

Configuración Openvpn mediante CLI

Todo los pasos anteriores que hemos realizado mediante luci, creación de la interface de red, cortafuegos y openvpn, los puedes realizar simplemente copiando y pegando los siguientes comandos en la sesión SSH del router.

 1# Modica /etc/config/network
 2# Creamos la interface ovpns0
 3uci set network.vpnserver='interface'
 4uci set network.vpnserver.proto='none'
 5uci set network.vpnserver.ifname='ovpns0'
 6uci set network.vpnserver.auto='1'
 7uci commit network
 8
 9# Modica /etc/config/firewall
10uci add firewall rule
11uci set firewall.@rule[-1].name='Allow-OpenVPN-Inbound'
12uci set firewall.@rule[-1].target='ACCEPT'
13uci set firewall.@rule[-1].src='*'
14uci set firewall.@rule[-1].proto='tcpudp'
15uci set firewall.@rule[-1].dest_port='1194'
16uci add firewall zone
17uci set firewall.@zone[-1].name='vpnserver'
18uci set firewall.@zone[-1].input='ACCEPT'
19uci set firewall.@zone[-1].forward='REJECT'
20uci set firewall.@zone[-1].output='ACCEPT'
21uci set firewall.@zone[-1].masq='1'
22uci set firewall.@zone[-1].network='vpnserver'
23uci add firewall forwarding
24uci set firewall.@forwarding[-1].src='vpnserver'
25uci set firewall.@forwarding[-1].dest='wan'
26uci add firewall forwarding
27uci set firewall.@forwarding[-1].src='vpnserver'
28uci set firewall.@forwarding[-1].dest='lan'
29uci commit firewall
30
31# Modifica /etc/config/openvpn
32uci set openvpn.vpnserver='openvpn'
33uci set openvpn.vpnserver.enabled='1'
34uci set openvpn.vpnserver.dev_type='tun'
35uci set openvpn.vpnserver.dev='ovpns0'
36uci set openvpn.vpnserver.port='1194'
37uci set openvpn.vpnserver.proto='udp'
38uci set openvpn.vpnserver.comp_lzo='yes'
39uci set openvpn.vpnserver.keepalive='10 120'
40uci set openvpn.vpnserver.persist_key='1'
41uci set openvpn.vpnserver.persist_tun='1'
42uci set openvpn.vpnserver.ca='/etc/openvpn/ca.crt'
43uci set openvpn.vpnserver.cert='/etc/openvpn/OpenVPN.crt'
44uci set openvpn.vpnserver.key='/etc/openvpn/OpenVPN.key'
45uci set openvpn.vpnserver.dh='/etc/openvpn/dh2048.pem'
46uci set openvpn.vpnserver.tls_auth='/etc/openvpn/tls-auth.key 0'
47uci set openvpn.vpnserver.mode='server'
48uci set openvpn.vpnserver.tls_server='1'
49uci set openvpn.vpnserver.server='192.168.200.0 255.255.255.0'
50uci set openvpn.vpnserver.topology='subnet'
51uci set openvpn.vpnserver.route_gateway='dhcp'
52uci set openvpn.vpnserver.client_to_client='1'
53uci add_list openvpn.vpnserver.push='comp-lzo yes'
54uci add_list openvpn.vpnserver.push='persist-key'
55uci add_list openvpn.vpnserver.push='persist-tun'
56uci add_list openvpn.vpnserver.push='topology subnet'
57uci add_list openvpn.vpnserver.push='route-gateway dhcp'
58uci add_list openvpn.vpnserver.push='redirect-gateway def1'
59uci add_list openvpn.vpnserver.push='route 192.168.200.0 255.255.255.0'
60uci add_list openvpn.vpnserver.push='dhcp-option DNS 192.168.1.1'
61uci commit openvpn

Una vez generados los certificados, y editado los valores de configuración, habilitamos el servicio y lo iniciamos:

1/etc/init.d/openvpn enable
2/etc/init.d/openvpn start

Podemos comprobar si realmente esta corriendo el servidor con el siguiente comando:

1ps | grep "[o]penvpn(vpnserver)"