Configurando OpenVPN (sin echar a perder el servidor)
Configurando OpenVPN sin ningún problema. ¡Imposible! pero puede minimizar los problemas. Soy consciente de que al configurar la VPN el mayor obstaculo en su configuración es el factor humano que olvida que otros paquetes hay instalados.
Son varios los pasos a seguir aqui te vamos a explicar como resolver aquellos problemas más comunes, o a los cuales me enfrenté yo, durante la puesta a punto de una red privada.
Instalando OpenVPN y las herramientas adicionales.
Instalando openvpn
Este paso es el más fácil de todos y vamos a usar el siempre confiable comando apt-get.
$ sudo apt-get -u install openvpn
Instalando easy-rsa
Es necesario generar los certificados, para ello necesitamos ser nosotros mismos la entidad certificadora y poder generar dichos certificados, la herramienta a usar se llama easy-rsa
sudo apt-get install easy-rsa
mkdir /etc/openvpn/easy-rsa/
cp -r /usr/share/easy-rsa/* /etc/openvpn/easy-rsa/
Configuración de los certificados
A continuación hay que editar el archivo /etc/openvpn/easy-rsa/vars para ajustar las variables de entorno siguientes, este paso se puede omitir ya que el proceso va a pedir que confirmemos estos datos. Así que dependerá de cuantas máquinas esten configuradas en tu VPN será o no buena idea hacer estos pasos
export KEY_SIZE=2048
export KEY_COUNTRY=”MX”
export KEY_PROVINCE=”Quintana Roo”
export KEY_CITY=”Cancún”
export KEY_ORG=”Nombre de la empresa”
export KEY_EMAIL=”fulano@example.com”
export KEY_OU=IT
export KEY_NAME=MiVPN
Generando la autoridad certificadora. (Pasos sin explicación, posteriormente haré otras anotaciones)
Hay quienes recomiendan realizar los siguientes pasos con un “sudo su” la verdad no lo recomiendo y es mejor verificar los permisos. cd /etc/openvpn/easy-rsa/
mkdir keys
source ./vars
./clean-all
./build-ca
Generar los certificados del servidor
Ahora hay que generar los certificados parael servidor, esto generará el canal seguro entre el servidor y el cliente remoto../build-key-server <nombre del servidor>
Como ya teniamos previamente todo configurado en el archivo de vars, unicamente hay que aceptar los valores ya predefinidos, con excepción del password. Hay que firmar el certificado para que funcione y copiar los archivos a donde se encontrará la configuración de la VPN../build-dh
cd keys
cp <nombre del servidor>.crt <nombre del servidor>.key ca.crt dh2048.pem /etc/openvpn/example-com/
Como ya teniamos previamente todo configurado en el archivo de vars, unicamente hay que aceptar los valores ya predefinidos, con excepción del password. Hay que firmar el certificado para que funcione y copiar los archivos a donde se encontrará la configuración de la VPN.
Generar los certificados para los clientes
Ahora hay que generar los certificados para cada uno de los clientes, es importante recordar que la seguridad es lo primordial y que generaremos dichos certificados en el servidor, para posteriormente copiarlos dentro de cada uno de los clientes. Una vez terminados de pasar es importante borrar del servidor cualquier certificado de cliente que haya sido generado (el servidor no los necesita)
cd /etc/openvpn/easy-rsa/
source vars
./build-key <nombre del cliente>
Se aceptan los valores por default y la opción de poner un password nos lo vamos a saltar para utilizar otro método que es usar TLS_AUTH descrito más abajo
Hay que copiar los siguientes archivos a cada cliente.
/etc/openvpn/ca.crt
/etc/openvpn/easy-rsa/keys/<nombre del cliente>.crt
/etc/openvpn/easy-rsa/keys/<nombre del cliente>.key
La ruta recomendada puede ser /etc/openvpn/example-com/
Para copiarlos puedes usar el comando zip o el comando tar para compactarlos en un único archivo y que sea más fácil su traslado hacia cada uno de los clientes.
OpenVPN habilitada con TLS-Auth
Usar tls-auth requiere que generemos una llave secreta compartida, eso para incrementar el nivel de seguridad adicional al certificado de RSA, para ello ejecutaremos en el servidor lo siguiente:
$ sudo openvpn --genkey --secret ta.key
Este comando generará en el archivo con la llave estática de OpenVPN ta.key. Esta llave deberá ser copiada tanto en el servidor como en los clientes de forma segura en el mismo directorio donde los archivos RSA .key and .crt estén ubicados.
Adicionalmente en el archivo de configuración, se deberá agregar:tls-auth ta.key 0
Y en cada uno de los clientes, será:tls-auth ta.key 1
Configurando el servidor
Es importante mencionar que cualquier archivo con extensión .conf que exista dentro de la ruta /etc/openvpn se tomará en cuenta al momento de ejecutar el servicio. Es por ello que anteriormente copiamos todo a /etc/openvpn/example-com/ (aunque tal vez deseas usar otra ruta ;-D ) y es ahí donde pondremos nuestro archivo de configuración para posteriormente crear un link simbólico con el comando ln -s example-com/<nombre del servidor>.conf .
Bueno pues vayamos por la parte de como configurar servidor. Si eres algo impaciente puedes descargar del sitio oficial de la VPN un archivo de configuración ya predefinido y que debería funcionar en la mayoría de los casos. Este lo puedes localizar en el servidor de openvpn en el siguiente link.
Archivo de configuración del servidor openvpn
Ahora bien, esta es una configuración; que, con modificaciones funciona perfectamente.
Tal vez queremos enmascarar el puerto a usar, en este caso usaremos el 25 como si fuera el de correo.:-)
port 25
dev tun
proto udp
status /var/log/openvpn/<nombre del servidor>-status.log
log-append /var/log/openvpn/<nombre del servidor>.log
user nobody
group nogroup
persist-key
persist-tun
ca example-com/ca.crt
cert example-com/<nombre del servidor>.crt
key example-com/<nombre del servidor>.key
dh example-com/dh2048.pem
ifconfig-pool-persist example-com/ipp.txt
server 10.8.0.0 255.255.255.0
client-to-client
keepalive 10 120
;ns-cert-type server
max-clients 10
cipher AES-128-CBC
comp-lzo
verb 4
mute 20
tls-auth example-com/ta.key 0
Si todo está bien configurado habrá que echar a andar el servidor:sudo service openvpn start
Si todo funciona sin errores se puede hacer un "ifconfig" para localizar una nueva interface llamada "tun0" algo como esto:
$ sudo ifconfig
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:10.8.0.1 P-t-P:10.8.0.2 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:110660 errors:0 dropped:0 overruns:0 frame:0
TX packets:141974 errors:0 dropped:134 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:8787582 (8.3 MiB) TX bytes:148849780 (141.9 MiB)
Configurando los clientes de la VPN
Una vez configurado nuestro servidor y cuando está funcionando, procederemos a configurar los clientes, siendo pues que nuestroas clientes no únicamente son PCs sino también celulares con android, iphone o raspberry (soluciones más que probada). Este paso es por demás sencillo empezemos por lo más obvio.
Instalando openvpn en el cliente.
Este sencillo paso es similar al servidor, solo basta lo siguiente:
sudo apt-get install openvpn
posteriormente habrá que descargar el
Archivo de configuración del cliente openvpn
del sitio oficial y copiarlo en la ruta correspondiente
sudo cp <nombre del cliente>.conf /etc/openvpn/example-com/
para posteriormente generar el enlace dinámico
ln -s /etc/openvpn/example-com/<nombre del cliente>.conf /etc/openvpn/<nombre del cliente>.conf
Ahora bien, puede que tal vez desees probar tu red con el siguiente archivo de configuración.
client
dev tun
proto udp
remote example.com 25
resolv-retry infinite
nobind
user nobody
group nogroup
persist-key
persist-tun
script-security 2
up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf
status /var/log/openvpn/example-com-status.log
log-append /var/log/openvpn/example-com.log
mute-replay-warnings
ca example-com/ca.crt
cert example-com/<nombre del cliente>.crt
key example-com/<nombre del cliente>.key
tls-auth example-com/ta.key 1
;remote-cert-tls server
ns-cert-type server
cipher AES-128-CBC
comp-lzo
verb 4
mute 20
habra que copiar las llaves y los certificados que se definieron a la ruta /etc/openvpn/example-com/. Si todo está bien configurado habrá que echar a andar el cliente de openvpn:sudo service openvpn start
o en su defecto con
sudo service openvpn@<nombre del cliente> start
Y con eso se terminaría de configurar la red VPN usando OpenVPN. Hasta aquí ya tendriamos la comunicación entre el cliente y el servidor por un canal seguro. Ahora si. Vamos a divertirnos.
Probando la VPN
Tal vez algo salio mal con la configuración, hay un firewall que nos impide llegar al servidor/cliente, etc. para ello podemos hacer una prueba como los hombres en crudo de la conexión.
Para probar el servidor
En el caso de que el cliente tenga una dirección ip fija. Desde un shell en el servidor, ejecutar:$ sudo openvpn --remote CLIENT_IP --dev tun1 --ifconfig 10.9.8.1 10.9.8.2
En otro caso habría que ejecutar mejor:$ sudo openvpn --dev tun1 --ifconfig 10.9.8.1 10.9.8.2
Se debe ver una salida similar a estoWed Mar 20 06:23:03 2016 NOTE: OpenVPN 2.1 requires '--script-security 2' or higher to call user-defined scripts or executables
Wed Mar 20 06:23:03 2016 ******* WARNING *******: all encryption and authentication features disabled -- all data will be tunnelled as cleartext
Wed Mar 20 06:23:03 2016 TUN/TAP device tun1 opened
...
Y se debe ver la interfaz "tun0" al momento de ejecutar el comando ifconfig.tun1 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:10.9.8.1 P-t-P:10.9.8.2 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:13 errors:0 dropped:0 overruns:0 frame:0
TX packets:16 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:2262 (2.2 KiB) TX bytes:1819 (1.7 KiB)
Nota.- Para finalizar la prueba sólo haría falta matar al comando openvpn, para ello con un simple control-c es más que suficiente. Con esto la interfaz "tun0" desaparecería.
Probando el cliente
Para probar el cliente se puede hacer con el siguiente comando# openvpn --remote SERVER_IP --dev tun1 --ifconfig 10.9.8.2 10.9.8.1
...
Wed Mar 27 18:35:30 2016 Peer Connection Initiated with [AF_INET]SERVER_IP:PORT
Wed Mar 27 18:35:30 2016 Initialization Sequence Completed
...
También se puede probar con ping.
Configuraciones especiales y herramientas adicionales para sacarle un mayor provecho a tu red VPN
Es bien cierto que ya tenemos la funcionando nuestra red vpn pero sin embargo sólo tenemos un canal de comunicación entre el servidor y el cliente, pero ¿Qué tal que queremos usar nuestro servidor para que responda a todas nuestras peticiones DNS o si desearamos que el tráfico de nuestros clientes vaya exclusivamente por esta red? ¿Que tal combinar ambas ideas?
Lo primero que hay que hacer es tener la capacidad de reenviar el trafico de la VPN hacia internet para ello en el servidor necesitaremos hacer los siguiente:
Reenvio del trafico sobre la VPN
habilitar el reenvio del trafico en el servidor con:$ sudo echo 1 > /proc/sys/net/ipv4/ip_forward
Claro que ese comando sólo es momentaneo así que si requerimos hacer al cambio permanente aun después de reiniciar el servidor hay que editar el archivo /etc/sysctl.conf descomentando la siguiente línea:net.ipv4.ip_forward = 1
Ejecute el comando siguiente para activar el cambio al archivo sysctl.conf:
$sudo sysctl -p /etc/sysctl.conf
Nota.- Aqui es donde en ocasiones te puedes topar con uno de los problemas si estás usando una máquina virtual con alguno de tantos proveedores de los que existen en la actualidad, algunos de estos proveedores utilizan una configuración adicional cuyo archivo de configuración está en otra ruta diferente a /etc/sysctl.conf, la solución es darle un find o un locate al archivo sysctl.conf para localizarlo y hacer la modificación antes mencionada. La forma de encontrar este problema es reiniciando el servidor y el valor no permanece en uno.
Configuración de iptables para redireccionar el tráfico
Para ello es importante que queden almacenados permanentemente los valores y hay que configurar el archivo /etc/rc.local para que los cambios a las rutas se tomen aún después de un reinicio del servidor. Dejo aquí un archivo de configuración (con los comentarios originales, para no olvidar la razón de su existencia). Dichos comentarios muestran donde hubo algún problema.
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
iptables -A FORWARD -i eth0 -o tun0 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -s 10.8.0.0/24 -o eth0 -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
service dnsmasq restart
###
# pinche linea me hizo perder un dia porque no tomaba el cambio
###
#sysctl -w net.ipv4.ip_forward=1
#echo 1 >/proc/sys/net/ipv4/ip_forward
#sysctl -p /etc/sysctl.conf
exit 0
Configuración del dnsmasq para tener un servidor DNS Cache.
Uno de los pasos importantes es la configuración de un servidor DNS Cache que nos permita controlar las peticiones DNS por un canal seguro y que además nos facilite la localización de algunos recursos de la red VPN. Este paso tiene un inconveniente ya que si está instalado y configurado bind9 como servidor DNS cache nos causa un puto conflicto y ninguno de ambos servicios responde de forma adecuada.
Este paso sólo tiene que editarse el archivo /etc/dnsmasq.conf con los siuientes valores.
resolv-file=/etc/resolv.conf.dnsmasq
listen-address=127.0.0.1,10.8.0.1
bind-interfaces
cache-size=250
#log-queries
En el archivo /etc/resolv.conf.dnsmasq habrá que configurar servidores DNS conocidos en este caso dejo los siguientes, sin embargo, pueden ser más servidores.
nameserver 8.8.8.8
nameserver 4.4.4.4
options timeout:1 attempts:3 rotate
Como pasó final a la configuración de los DNS, hay que indicarle a cada uno de los clientes cuales son los DNS que debe usar, para ello, hay muchas opciones como empujar (push) las instrucciones. Sin embargo, he tenido algunos problemas usando el push por lo que prefiero configurarlo directamente en alguno de los clientes een el archivo de configuración de la VPN usando lo siguiente al final del archivo.
redirect-gateway def1
dhcp-option DNS 10.8.0.1
dhcp-option DNS 8.8.8.8
dhcp-option DNS 4.4.4.4
#route 10.8.0.1 255.255.255.255
Asignar al cliente de openvpn una dirección estática.
Para que un cliente en particular tenga asignada una dirección ip fija, lo que hay que hacer es que en el archivo de configuración del servidor /etc/openvpn/<nombre del servidor>.conf agregar la siguiente línea.
client-config-dir grplca-com/ccd
Con esto le estamos diciendo que las configuraciones especificas de cada cliente estaran definidas en esa ruta. Por lo tanto para asignarle una dirección ip a un cliente de openvpn bastará con crear dentro de dicho directorio un archivo con el nombre del cliente <nombre del cliente> y dentro de cada archivo que definamos para cada cliente que deseemos tenga ip fija agregaremos lo siguiente
ifconfig-push 10.8.0.x 10.8.0.x-1
donde x es un número par
Una vez definidas nuestras configuraciones para cada cliente habrá que reiniciar el servicio tanto en el servidor como en los clientes que serán afectados por la nueva configuración.
Y sobra decir que editando el archivo /etc/hosts se pueden definir los nuevos nombres para cada ip asignada.
Resolver el problema cuando no reconoce el dispositivo tun.
Hay ocasiones en que por alguna razón, se cambia de nombre y se pone pendejo y no reconoce el dispositivo tun para ello hay que ejecutar lo siguiente:
$ sudo lsmod | grep tun
Si no tiene salida entonces sólo habrá que ejecutar lo siguiente:$ sudo modprobe tun
Esto cargará el modulo y no debería haber mayor problema.
Problema con TLS (TLS error: Unsupported protocol)
En raras ocasiones nos aparecerá el siguiente error en los logs
TLS error: Unsupported protocol. This typically indicates that client and server have no common TLS version enabled. This can be caused by mismatched tls-version-min and tls-version-max options on client and server. If your OpenVPN client is between v2.3.6 and v2.3.2 try adding tls-version-min 1.0 to the client configuration to use TLS 1.0+ instead of TLS 1.0 only
El error se debe a que el servidor no está actualizado y que nuestro cliente tiene una versión más actualizada de openvpn. Esto se resuelve agregando la siguiente línea de código a nuestro archivo de configuración del cliente, en caso de que no sea posible actualizar nuestro servidor.
tls-version-min 1.0
Otra forma de ayudar a que funcione, pero no es muy recomendable, es editar el archivo
sudo vi /etc/ssl/openssl.cnf
y donde dice:
MinProtocol = TLSv1.2
sustituir por:
MinProtocol = TLSv1
Jugando con OpenVPN
Hasta aquí vimos la configuración general y como resolver algunos de los problemas más comunes, pero ¿qué más podemos hacer? Dejo esta lista de posibles escenarios que te puedes encontrar en la vida real y que aunque ya he resuelto algunos prefiero que cada quien intente resolverlos por su cuenta.
- Configurar dos redes VPN en el mismo servidor.
- Configurar dos clientes VPN en el mismo equipo.
- Reenrutar el tráfico de una red VPN sobre otra red VPN.
Referencias:
Es importante darle credito a las páginas donde encontré mucha de la información que me permitió hacer este resumen, por eso aqui dejo los links
- OpenVPN HowTo
- OpenVPN
- Crear y configurar un servidor OpenVPN
- Como enrutar todo el tráfico, incluido Internet, por VPN con OpenVPN
- Como complicarse la existencia al configurar una vpn
- Definir una ruta para los clientes con OpenVPN
- OpenVPN - ¿Enviar todo el tráfico, o sólo el necesario? (I de II)
- OpenVPN - ¿Enviar todo el tráfico, o sólo el necesario? (II de II)
- iptables
- dnsmasq resolvconf
- resolvconf: Gestionando /etc/resolv.conf
- how to load tun module in linux