OpenWrt: Openvpn Server

Advertencia: Este artículo tiene más de 365 días.

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 artículo ya expliqué algunas de las funciones por las que puede ser interesante utilizar un VPN

Instalación

Instalamos los paquetes necesarios

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

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

opkg 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 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:

    source /lib/functions/network.sh
    network_find_wan wanIf
    network_get_ipaddrs wanIP $wanIf
    wanIP="tu.dominio.org"
    OVPN_FILE="/etc/openvpn/OpenVPN.ovpn"
    cat >> ${OVPN_FILE} <<EOF
    client
    dev tun
    proto udp
    fast-io
    remote $wanIP 1194
    remote-cert-tls server
    nobind
    persist-key
    persist-tun
    comp-lzo no
    verb 3
    key-direction 1
    EOF
    echo '<ca>'    >> ${OVPN_FILE}
    cat            >> ${OVPN_FILE} < /etc/openvpn/ca.crt
    echo '</ca>'   >> ${OVPN_FILE}
    echo '<cert>'  >> ${OVPN_FILE}
    cat            >> ${OVPN_FILE} < /etc/openvpn/cliente.crt
    echo '</cert>' >> ${OVPN_FILE}
    echo '<key>'   >> ${OVPN_FILE}
    cat            >> ${OVPN_FILE} < /etc/openvpn/cliente.key
    echo '</key>'  >> ${OVPN_FILE}
    echo '<tls-auth>'   >> ${OVPN_FILE}
    cat            >> ${OVPN_FILE} < /etc/openvpn/tls-auth.key
    echo '</tls-auth>'  >> ${OVPN_FILE}
    
    # mostrando el fichero OVPN_generado
    echo '----- generado .ovpn file ------'
    cat ${OVPN_FILE}

Copiamos el fichero /etc/openvpn/*.opvn mediante scp o cualquier otro método 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:

cat ${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

    PKI_DIR="/etc/openvpn/ssl"
    [ -d ${PKI_DIR} ] && rm -rf ${PKI_DIR}
    mkdir -p ${PKI_DIR}
    chmod -R 0600 ${PKI_DIR}
    cd ${PKI_DIR}
    touch index.txt; touch index; echo 1000 > seríal
    cp /etc/ssl/openssl.cnf ${PKI_DIR}
    PKI_CNF=${PKI_DIR}/openssl.cnf
    sed -i '/^dir/   s:=.*:= /etc/openvpn/ssl:'                            ${PKI_CNF}
    sed -i '/^new_certs_dir/   s:=.*:= /etc/openvpn/ssl:'                  ${PKI_CNF}
    sed -i '/.*Name/ s:= match:= optional:'                                ${PKI_CNF}
    sed -i '/organizationName_default/    s:= .*:= Dominio Ltd.:'  ${PKI_CNF}
    sed -i '/stateOrProvinceName_default/ s:= .*:= Madrid:'                ${PKI_CNF}
    sed -i '/countryName_default/         s:= .*:= ES:'                    ${PKI_CNF}
    sed -i '/default_days/   s:=.*:= 3650:'                                ${PKI_CNF}
    sed -i '/default_bits/   s:=.*:= 4096:'                                ${PKI_CNF}
    
    # cambia el nombre para tus certificados
    cat >> ${PKI_CNF} <<"EOF"
    [ OpenVPN ]
      keyUsage = digitalSignature, keyEncipherment
      extendedKeyUsage = serverAuth
    
    [ cliente ]
      keyUsage = digitalSignature
      extendedKeyUsage = clientAuth
    EOF
    
    openssl req -batch -nodes -new -keyout "ca.key" -out "ca.crt" -x509 -config ${PKI_CNF} -days 3650
    openssl req -batch -nodes -new -keyout "OpenVPN.key" -out "OpenVPN.csr" -subj "/CN=OpenVPN" -config ${PKI_CNF}
    openssl ca  -batch -keyfile "ca.key" -cert "ca.crt" -in "OpenVPN.csr" -out "OpenVPN.crt" -config ${PKI_CNF} -extensions OpenVPN
    
    
    # añade -nodes si no quieres contraseña
    openssl req -batch -nodes -new -keyout "cliente.key" -out "cliente.csr" -subj "/CN=cliente" -config ${PKI_CNF}
    openssl ca  -batch -keyfile "ca.key" -cert "ca.crt" -in "cliente.csr" -out "cliente.crt" -config ${PKI_CNF} -extensions cliente
    openvpn --genkey --secret tls-auth.key
    chmod 0600 "ca.key"
    chmod 0600 "OpenVPN.key"
    chmod 0600 "cliente.key"
    
    
    # El siguiente comando, dependiendo de tu router, puede llegar a tardar bastante
    openssl dhparam -out dh2048.pem 2048
    
    # Copiamos los certificados en /etc/openvpn
    cp 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

img

Añadir nueva interfaz

img

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

img

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

img

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

img

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

img

Pulsamos en Editar

img

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.

img

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

img

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

img

Vamos a añadir una nueva zona al Cortafuegos

img

Le ponemos un nombre a la nueva zona (vpnserver)

img

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

img

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

img

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

img

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

img

Por defecto ya vienen creadas tres configuraciones, las eliminamos

img

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

img

Pulsamos en añadir

img

Vamos a la configuración avanzada

img

En la sección networking

img

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

img

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

img

Añadimos un nuevo campo, port

img

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

img

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

img

Le damos el valor tun

img

Añadimos un nuevo campo llamado route_gateway

img

Le asignamos el valor dhcp

img

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

img

Volvemos a añadir un nuevo campo, topology

img

Con valor subnet

img

Ahora vamos a indicarle cuáles son los certificados a utilizar por el servidor, nos vamos a Cryptography

img

Activamos la casilla Activar TLS…

img

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

img

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)

img

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

img

También tenemos que añadir el campo tls_auth

img

Introducimos la ruta donde se encuentra el certificado /etc/openvpn/tls-auth.key añadiendo al final de la línea el valor 0

img

Marcamos también la casilla client_to_client

img

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_)

img

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:

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

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

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

Y escribimos los cambios en el fichero de configuración

uci commit openvpn

Para terminar iniciamos el servicio

img

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.

# Modica /etc/config/network
# Creamos la interface ovpns0
uci set network.vpnserver='interface'
uci set network.vpnserver.proto='none'
uci set network.vpnserver.ifname='ovpns0'
uci set network.vpnserver.auto='1'
uci commit network

# Modica /etc/config/firewall
uci add firewall rule
uci set firewall.@rule[-1].name='Allow-OpenVPN-Inbound'
uci set firewall.@rule[-1].target='ACCEPT'
uci set firewall.@rule[-1].src='*'
uci set firewall.@rule[-1].proto='tcpudp'
uci set firewall.@rule[-1].dest_port='1194'
uci add firewall zone
uci set firewall.@zone[-1].name='vpnserver'
uci set firewall.@zone[-1].input='ACCEPT'
uci set firewall.@zone[-1].forward='REJECT'
uci set firewall.@zone[-1].output='ACCEPT'
uci set firewall.@zone[-1].masq='1'
uci set firewall.@zone[-1].network='vpnserver'
uci add firewall forwarding
uci set firewall.@forwarding[-1].src='vpnserver'
uci set firewall.@forwarding[-1].dest='wan'
uci add firewall forwarding
uci set firewall.@forwarding[-1].src='vpnserver'
uci set firewall.@forwarding[-1].dest='lan'
uci commit firewall

# Modifica /etc/config/openvpn
uci set openvpn.vpnserver='openvpn'
uci set openvpn.vpnserver.enabled='1'
uci set openvpn.vpnserver.dev_type='tun'
uci set openvpn.vpnserver.dev='ovpns0'
uci set openvpn.vpnserver.port='1194'
uci set openvpn.vpnserver.proto='udp'
uci set openvpn.vpnserver.comp_lzo='yes'
uci set openvpn.vpnserver.keepalive='10 120'
uci set openvpn.vpnserver.persist_key='1'
uci set openvpn.vpnserver.persist_tun='1'
uci set openvpn.vpnserver.ca='/etc/openvpn/ca.crt'
uci set openvpn.vpnserver.cert='/etc/openvpn/OpenVPN.crt'
uci set openvpn.vpnserver.key='/etc/openvpn/OpenVPN.key'
uci set openvpn.vpnserver.dh='/etc/openvpn/dh2048.pem'
uci set openvpn.vpnserver.tls_auth='/etc/openvpn/tls-auth.key 0'
uci set openvpn.vpnserver.mode='server'
uci set openvpn.vpnserver.tls_server='1'
uci set openvpn.vpnserver.server='192.168.200.0 255.255.255.0'
uci set openvpn.vpnserver.topology='subnet'
uci set openvpn.vpnserver.route_gateway='dhcp'
uci set openvpn.vpnserver.client_to_client='1'
uci add_list openvpn.vpnserver.push='comp-lzo yes'
uci add_list openvpn.vpnserver.push='persist-key'
uci add_list openvpn.vpnserver.push='persist-tun'
uci add_list openvpn.vpnserver.push='topology subnet'
uci add_list openvpn.vpnserver.push='route-gateway dhcp'
uci add_list openvpn.vpnserver.push='redirect-gateway def1'
uci add_list openvpn.vpnserver.push='route 192.168.200.0 255.255.255.0'
uci add_list openvpn.vpnserver.push='dhcp-option DNS 192.168.1.1'
uci commit openvpn

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

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

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

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

Espero que te haya gustado, pasa un buen día. 🐧