OpenWrt: Openvpn Server

2018-05-17

Índice

  1. Instalación
  2. Generar fichero .ovpn para los clientes
  3. Generar Certificados Servidor
    1. Configuración Openvpn mediante Luci
    2. Configuración Openvpn mediante CLI

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

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

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 > serial
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 traves 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 configuracion que vamos a crear (openvpn), y seleccionamos Sever configuracion 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 devtype

img

Le damos el valor tun

img

Añadimos un nuevo campo llamado routegateway

img

Le asignamos el valor dhcp

img

Buscamos el campo keepalive y cambiamos los valores a 110 120 y activamos persisttun y persistkey

img

Volvemos a añadir un nuevo campo, topology

img

Con valor subnet

img

Ahora vamos a indicarle cuales 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 tlsauth

img

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

img

Marcamos tambión la casilla clienttoclient

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. 🐧


Ingrese la dirección de su instancia