OpenWrt: Openvpn Server

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

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:

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

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

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.

comentario powered by Disqus