OpenWrt: Openvpn Server
2018-05-17
Índice
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
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 devtype
Le damos el valor tun
Añadimos un nuevo campo llamado routegateway
Le asignamos el valor dhcp
Buscamos el campo keepalive y cambiamos los valores a 110 120 y activamos persisttun y persistkey
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 tlsauth
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 clienttoclient
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)"
Espero que te haya gustado, pasa un buen día. 🐧