OPENVPN: Instalando el sistema abierto para acceso seguro a nuestra red

Ejemplo Openvpn ITSoftware SAS
Ejemplo Openvpn ITSoftware SAS

OpenVPN es una distribución opensource de un servidor-cliente VPN, que nos permite un acceso seguro (encriptado) a los recursos de una red local corporativa, haciendo uso de internet.

Una VPN permite establecer una especie de tubo por internet, que nos permite tener los recursos de mi empresa en cualquier lugar de forma segura.

Este artículo muestra los pasos para instalar OpenVPN en servidor y un  cliente, ambos corriendo Ubuntu , aunque el procedimiento es muy parecido en otras distribuciones de Linux.

Te puede interesar leer también Tipos de Servicio OpenVPN Routed y Bridged

Para el caso del cliente en Windows, el único prerequisito es instalar el cliente OPENVPN desde la página oficial https://openvpn.net.


Primero definamos algunos elementos de esta configuración:

Servidor OPENVPN: Es el equipo que aceptará las conexiones de los clientes a través de la VPN. En este ejemplo usaremos la IP pública 190.158.199.92.
PC Remoto: Es el equipo que se conectará al servidor a través de la VPN.

Red privada: Es la red local que  definiremos para conectar nuestra VPN,  usaremos la red 172.18.1.0/24, por lo que internamente tendremos IP’s locales como 172.18.1.1, 172.18.1.1, etc.
Todos los comandos en Ubuntu deben ser ejecutados por el usuario root o con otro usuario con privilegios sudo.

Primero tenemos que instalar  OpenVPN con:

sudo apt-get install openvpn

OpenVPN se debe instalar  tanto en el cliente como en el servidor,  el archivo de configuración que se usará para iniciar  la VPN identificará los roles de servidor y cliente.

Se comentan todas las líneas en /etc/default/openvpn y se añade:

AUTOSTART="openvpn"

Esto le dice a OpenVPN cuál es el archivo de configuración predeterminado a usar al iniciar el servidor.

Los archivos de configuración se almacenan en /etc/openvpn, con  extensión .conf, así que la instrucción de arriba le dice a OPENVPN que use el archivo  /etc/openvpn/openvpn.conf, para iniciarse automáticamente.

Así pues el servicio OpenVPN se puede gestionar con los siguientes comandos:

Iniciar OpenVPN:

/etc/init.d/openvpn start

Detener OpenVPN:

 /etc/init.d/openvpn stop

Reiniciar OpenVPN:

 /etc/init.d/openvpn restart

Cada vez que se cambian parámetros en el archivo /etc/openvpn/openvpn.conf se debe reiniciar OpenVPN.

Crear claves y certificados OPENVPN

Ahora se crean los certificados y claves de seguridad. Con el usuario root se ejecuta:

cd /etc/openvpn/

Y ahora se debe copiar el directorio easy-rsa a /etc/openvpn:

cp -r /usr/share/doc/openvpn/examples/easy-rsa/ .

Editamos el archivo vars:

nano easy-rsa/vars

Comentamos  la línea:

#export D=pwd

Agregamos esta línea:

 export D=/etc/openvpn/easy-rsa

Y modificamos los parámetros que vienen a continuación, en la medida que vaya preguntando, bajo las condiciones propias de cada cual:

export KEY_COUNTRY=CO
 export KEY_PROVINCE=CU
 export KEY_CITY=Bogota
 export KEY_ORG="ITSoftware SAS"
 export KEY_EMAIL="[email protected]"

Guardamos y cerramos el archivo.

Ahora ejecutamos:

. ./vars

Muy importante, en el anterior comando se tiene un punto, un espacio y al final otro punto.

En seguida se introduce el siguiente comando:

 ./clean-all

Ahora instalamos OpenSSL:

sudo apt-get install openssl

Con el siguiente comando se crea la autoridad de certificados (CA) con los parámetros definidos más arriba, se debe añadir solamente el Common Name.

./build-ca

En este punto se crean las claves para el servidor:

./build-key-server server

En este comando, cuando se solicite Common Name, se introduce el primer parámetro anteriormente ingresado, en este ejemplo «server».

Ahora se responde «y» a las siguientes preguntas:

Sign the certificate? [y/n] y 1 out of 1 certificate requests certified, commit? [y/n]

Ahora se crea la clave OPENVPN para el PC remoto, que en este ejemplo se llama client1:

./build-key <client1>

Cuando pregunte por el Common Name, se introduce el mismo valor del primer parámetro como en el caso de la clave de servidor.

Este paso se repite tantas veces se quiera, de acuerdo a la cantidad de clientes remotos que vayan a usar la VPN.

Se generan los parámetros Diffie Hellman:

./build-dh

A partir de todos estos pasos, ya tenemos un directorio /etc/openvpn/easy-rsa/keys con claves y certificados de nuestros clientes remotos en el servidor.

El cliente remoto, entonces debe tener los siguientes archivos disponibles para poderse conectar por medio de OPENVPN, donde clien1.crt y clien1.key son los archivos específicos del cliente de este ejemplo:

 ca.crt
 client1.crt
 client1.key
 ta.key

Para el caso del cliente en Ubunu, los archivos se deben copiar en la carpeta /etc/openvpn.

Cuando es un cliente Windows, también se deben copiar en la carpeta de certificados de OPENVPN C:\Archivos de programa\OpenVPN\config.

En este paso se debe crear el archivo de de cliente: <cliente>.ovpn, con la siguiente información:

##############################################
 # Sample client-side OpenVPN 2.0 config file #
 # for connecting to multi-client server.     #
 #                                            #
 # This configuration can be used by multiple #
 # clients, however each client should have   #
 # its own cert and key files.                #
 #                                            #
 # On Windows, you might want to rename this  #
 # file so it has a .ovpn extension           #
 ##############################################

# Specify that we are a client and that we
 # will be pulling certain config file directives
 # from the server.
 client

# Use the same setting as you are using on
 # the server.
 # On most systems, the VPN will not function
 # unless you partially or fully disable
 # the firewall for the TUN/TAP interface.
 ;dev tap
 dev tun

# Windows needs the TAP-Win32 adapter name
 # from the Network Connections panel
 # if you have more than one.  On XP SP2,
 # you may need to disable the firewall
 # for the TAP adapter.
 ;dev-node MyTap

# Are we connecting to a TCP or
 # UDP server?  Use the same setting as
 # on the server.
 proto tcp
 ;proto udp

# The hostname/IP and port of the server.
 # You can have multiple remote entries
 # to load balance between the servers.
 remote 190.158.199.92 1194
 ;remote my-server-2 1194

# Choose a random host from the remote
 # list for load-balancing.  Otherwise
 # try hosts in the order specified.
 ;remote-random

# Keep trying indefinitely to resolve the
 # host name of the OpenVPN server.  Very useful
 # on machines which are not permanently connected
 # to the internet such as laptops.
 resolv-retry infinite

# Most clients don't need to bind to
 # a specific local port number.
 nobind

# Downgrade privileges after initialization (non-Windows only)
 ;user nobody
 ;group nobody

# Try to preserve some state across restarts.
 persist-key
 persist-tun

# If you are connecting through an
 # HTTP proxy to reach the actual OpenVPN
 # server, put the proxy server/IP and
 # port number here.  See the man page
 # if your proxy server requires
 # authentication.
 ;http-proxy-retry # retry on connection failures
 ;http-proxy [proxy server] [proxy port #]

# Wireless networks often produce a lot
 # of duplicate packets.  Set this flag
 # to silence duplicate packet warnings.
 ;mute-replay-warnings

# SSL/TLS parms.
 # See the server config file for more
 # description.  It's best to use
 # a separate .crt/.key file pair
 # for each client.  A single ca
 # file can be used for all clients.
 ca ca.crt
 cert client1.crt
 key client1.key

# Verify server certificate by checking
 # that the certicate has the nsCertType
 # field set to "server".  This is an
 # important precaution to protect against
 # a potential attack discussed here:
 #  http://openvpn.net/howto.html#mitm
 #
 # To use this feature, you will need to generate
 # your server certificates with the nsCertType
 # field set to "server".  The build-key-server
 # script in the easy-rsa folder will do this.
 ;ns-cert-type server

# If a tls-auth key is used on the server
 # then every client must also have the key.
 tls-auth ta.key 1

# Select a cryptographic cipher.
 # If the cipher option is used on the server
 # then you must also specify it here.
 ;cipher x

# Enable compression on the VPN link.
 # Don't enable this unless it is also
 # enabled in the server config file.
 comp-lzo

# Set log file verbosity.
 verb 3

# Silence repeating messages
 ;mute 20

Aquí se debe poner la IP pública y los nombres de los archivos de claves y certificados (marcados arriba en color rojo y en negrilla)

Devuelta en el servidor se crea el archivo /etc/openvpn/openvpn.conf con los siguientes datos:

dev tun
 port 1194 ## default openvpn port
 proto tcp

persist-key
 persist-tun

#certificates and encryption
 ca ca.crt
 cert server.crt
 key server.key  # This file should be kept secret
 dh dh1024.pem
 tls-auth ta.key 0 # This file is secret
 #cipher BF-CBC        # Blowfish (default)
 comp-lzo

user nobody
 group nogroup
 server 10.8.0.0 255.255.255.0

push "route 192.168.0.0 255.255.255.0"
 push "route 172.18.1.0 255.255.255.0"

persist-key
 persist-tun

status openvpn-status.log
 verb 3
 tls-server
 client-to-client

log-append /var/log/openvpn.log

Aquí se deben tener en cuenta las direcciones IP de la red (marcados en color rojo), en este ejemplo:

10.8.0.0 : Red que se le asigna a la VPN

192.168.0.0: Red del router IP.

172.18.1.0: Red local a donde nos queremos conectar.

Finalmente se debe permitir IP forwarding en el servidor:

echo 1 > /proc/sys/net/ipv4/ip_forward

Y también NAT en iptables

Y finalmente configura IP forwarding e iptables para NAT en el servidor:

sudo iptables -t nat -A POSTROUTING -s 172.18.1.0/24 -o eth0 -j MASQUERADE

Ojo!!! es muy importante esta línea para que haya internet en los clientes remotos.

Para que quede persistente el NAT en iptables, agregamos la línea en rc.local:

sudo nano /etc/rc.local
sudo iptables -t nat -A POSTROUTING -s 172.18.1.0/24 -o eth0 -j MASQUERADE
exit 0

O mediante el servicio iptables-persistent:

service iptables-persistent save

Para verificar que la regla del firewall fue correctamente ingresada, introducimos el siguiente comando:

sudo iptables -L -t nat

Si los equipos remotos usan VPN, se debe desactivar temporalmente para probar que la configuración funcione normalmente, para luego hacer la excepción para el puerto TCP 1194, que es el que usa la VPN.

Si durante la creación de las reglas del firewall se cometió algún error, se pueden usar los siguientes comandos:

Para vaciar toda la tabla de reglas de firewall:

sudo iptables -F -t nat

Ahora se reinicia OPENVPN en los equipos cliente y servidor bajo Ubuntu, para poder realizar las pruebas de conexión respectivas.

Ahora si se introducen los comandos  ifconfig o  route -n podemos notar una nueva interfaz de red llamada, tun0, tanto en en cliente y servidor; que son las que usa OPENVPN.

Finalmente se prueba la conexión desde la máquina remota, a una de las máquinas locales con:

ping 172.18.1.2

Es posible que se deba habilitar el port forwarding en el router de internet, para que el tráfico entrante por el puerto 1194, termine en la máquina donde está instalado el servicio OPENVPN, en este ejemplo sería:

 Local IP              Start Port       End  Port       Protocl      Enabled
 192.168.0.29          1194             1194            TCP          OK 

Nota: La IP de los equipos detrás del router ADSL tienen que tener sus direcciones IP dentro de su rango de DHCP,  porque sino no pasa el tráfico de datos.

Ahora el PC remoto está conectado al servidor de la oficina a través de OpenVPN y es posible conectarse a los recursos de la oficina, desde un sitio remoto, de manera segura con certificados SSL.

Este artículo hace parte del sistema de divulgación de conocimiento de ITSoftware SAS.

Si te gustó este artículo, por favor no olvides compartirlo en las redes sociales. 😉

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.