OpenVPN

La tecnologia de VPN permite unir dos o mas subredes a traves de equipos como puertas de enlace, de forma segura y estable ya que la conexion es encriptada y a traves del protocolo UDP

Diagrama

Diagrama de VPN Servidor-Cliente

Diagrama de conexion entre un servidor y dos clientes

Servidor

Para la instalacion de la VPN, el servidor debe ser configurado para que puede aceptar las conexion, y debe tener las llaves de encriptacion para permitir a los clientes conectarse.
Instalacion

Para instalar OpenVPN y los scripts de configuracion, se puede utilizar el gestor de paquetes, todos los comandos deberan realizarse como el superusuario (root)

apt-get install openvpn

Creacion de certificados y llaves

En los scripts de documentacion, tenemos los necesarios para crear los certificados y las llaves de encriptacion.

cp -a /usr/share/doc/openvpn/examples/easy-rsa /etc/openvpn

En el directorio de los scripts, deberemos empezar la creacion de los certificados que nos pediran muchos datos, que no son relevantes, pero es recomendado llenarlos con veracidad

cd /etc/openvpn/easy-rsa/2.0/
. ./vars
./clean-all
./build-ca

Estos certificados creados, nos serviran para crear certificados nuevos tanto para servidores como para clientes.

Luego de finalizado la creacion del certificado principal, deberemos crear un certificado del servidor, de la misma forma que la anterior.

./build-key-server "servidor"
./build-dh

De los comandos anteriores, nuestro servidor utilizara 4 archivos: ca.crt (creado por el comando ./build-ca), servidor.crt y servidor.key (creados por el comando ./build-key-server “servidor), y el ultimo archivo dh1024.pem (creado por el comando ./build-dh)

./build-key "cliente"

Se deberá crear las llaves de el/los clientes, por cada cliente se crearan 3 archivos, pero solo 2 son necesarios que se utilicen en la maquina cliente.

Todas las llaves y los certificados se guardaran en una carpeta keys

cd keys
cp ca.crt "servidor".crt "servidor".key dh1024.pem /etc/openvpn/

Las llaves para los clientes se puede comprimir en un archivo para poder portarlos a la maquina cliente.

tar -zcvf /home/cliente/llaves.tar.gz cliente.key cliente.crt ca.crt

Archivo de configuracion

El archivo de configuracion del servidor es /etc/openvpn/server.conf y debe contener las siguientes configuraciones

local 4.2.2.2
port 1194
proto udp
dev tun
ca ca.crt
cert "servidor".crt
key "servidor".key
dh dh1024.pem
server 172.18.1.0 255.255.255.0
ifconfig-pool-persist /var/log/openvpn/ipp.txt
push "route 192.168.1.0 255.255.255.0"
client-to-client
keepalive 10 120
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
log         /var/log/openvpn/openvpn.log
log-append  /var/log/openvpn/openvpn.log
verb 4

Cliente

En los clientes se deberan descomprimir los certificados y la llave, que junto con el archivo de configuraciones hacen que la conexion se realize

Cliente windows

Existe un instalador del OpenVPN para windows, que es como las estaciones externas pueden conectarse directamente con el servidor. Este cliente es generalmente utilizado para las conexiones entre una notebook y el servidor de la casa central, puede hacerse funcionar como un router entre las dos subredes tambien, pero no es estable.

Luego de realizar las instalacion del programa, el archivo de llaves y certificados debera ser descomprimido en C:\Archivos de Programas\OpenVPN\config\ y en el mismo lugar debera crearse un archivo de configuracion con el siguiente contenido

tls-client
client
dev tun
proto udp
remote 4.2.2.2 1194
float
resolv-retry infinite
nobind
persist-key
persist-tun
ca C:\\Archivos\ de\ programa\\OpenVPN\\config\\ca.crt
cert C:\\Archivos\ de\ programa\\OpenVPN\\config\\cliente.crt
key C:\\Archivos\ de\ programa\\OpenVPN\\config\\cliente.key
comp-lzo
verb 4

Cliente linux

Para el cliente linux, las configuraciones y los archivos son los mismos, pero deberan guardarse en la carpeta /etc/openvpn, junto con los certificados

tar -zcvf llaves.tar.gz -C /etc/openvpn

Luego se crea el archivo de configuracion, para el cliente, con el unico cambio de las rutas para los archivos

tls-client
client
dev tun
proto udp
remote 4.2.2.2 1194
float
resolv-retry infinite
nobind
persist-key
persist-tun
ca /etc/openvpn/ca.crt
cert /etc/openvpn/cliente.crt
key /etc/openvpn/cliente.key
comp-lzo
verb 4

y luego debera reiniciarse el servicio de openvpn en el cliente

/etc/init.d/openvpn restart

Observaciones

El servidor es capaz de “exportar” las rutas internas que maneja, a traves de la configuracion push route, pero no asi las rutas de los clientes, es decir, cuando un cliente hace ping a cualquier maquina del lado del servidor este lo redirecciona correctamente, pero no asi cuando una de las maquina trata de localizar las redes externas.

La configuracion de multiredes con cliente y servidor requiere mas archivos de configuracion.

14 pensamientos en “OpenVPN

  1. Estimado Rodolfo muy buen articulo me ayudo mucho pero quisiera ver si me puedes ayudar con algo, tengo configurada ya una VPN, en el servidor principal tengo una ip publica y en el cliente una dinamica lo que deseo es mediante el iptables redireccionar un pedido por un x puerto junto con la ip publica que se direccione y abra el servidor web que tiene el cliente desde los equipos que esta tras el servidor principal puedo acceder directamente al servidor web del cliente vpn, pero si desde fuera hago un llamado desde cualquier navegador a la ip publica:puerto no redirecciona al servidor web en el iptables utilizo en el server:

    iptables -t nat -A PREROUTING -p tcp –dport 1930 -j DNAT –to-destination :80

    espero me puedas ayudar y de antemano mil gracias.

    • Gracias Rodrigo por el comentario. Sobre tu problema, lo importante es que el cliente siempre reciba la misma IP privada dentro de la red de la VPN, es decir, segun el ejemplo el cliente siempre debe recibir el 172.18.1.3, esto se hace usando un archivo (con el mismo nombre que el certificado para el cliente) con sus configuración de IP especifica. De esta forma cuando el cliente se conecta siempre recibe la misma direccion IP.

      Luego se aplican las reglas de iptables, pero estas reglas deben estar presente en ambas maquinas. En el servidor la regla seria:

      iptables -t nat -I PREROUTING -i eth0 -d 10.10.1.1(WAN) -p tcp --dport 1930 -j DNAT --to-destination 172.18.1.3(VPN):80
      iptables -t nat -I POSTROUTING ! -s 192.168.1.0(LAN) -o tun0 -j MASQUERADE

      Basado en tus datos, yo pondría la interfaz, la ip en la recepción, y la ip y puerto en la re-direccion. Mientras mas especifica sea tu regla, mejor puedes administrar luego las conexiones, y te cubres de “problemas de seguridad” al largo plazo. También hay que establecer una regla de enmascarado, ya que si el cliente recibe un pedido desde una IP que no es la LAN a través del DNAT, la tratará de responder con su puerta de enlace predeterminada (su conexión a internet y no su conexión VPN). El cliente debe pensar que todos los pedidos que recibe lo hace desde el servidor VPN o la LAN en el peor de los casos, para poder responderlo en usando la VPN y no su conexión a internet.

      Espero que te haya sido de ayuda.. Saludos.. R

  2. Saludos, tengo una gran duda quisiera saber si me podrías ayudar, lo que pasa es que estoy implementando una vpn con openvpn y el problema radica en que no puedo conectarme desde otra red al vpn, solo admite las que pertenecen a la misma red, asi mimso puedo trabajar con un certificado por cada usuario o puedo usar un certificado para todos, tambien me pregunto si se podria usar un certificado por grupo, ojala me puedan dar una ayuda

  3. Amigo acabo de configurar una vpn con Openvpn,,, mi problema es el siguiente

    En la compania tenemos 2 redes 192.168.1.0/24 y 192.168.0.0/24, entre ella se ven.

    Yo instale una vpn con openvpn,,, y mi mi servidor vpn le puse una direccion de la red 192.168.1.0,, y cuando me conecto desde a fuera de la compania puedo ver sin problema la red 192.168.1.0, pero cuando trato de ver la red 192.168.0.0 no veo ninguna,,, podrias ayudarme soy nuevo en linux,, mi servidor es ubuntu server 12.04,, gracias por la ayuda de antemano

    • Estimado hector:

      En el archivo de configuración del OpenVPN (servidor), hay una linea que dice “push route”, estas son las rutas que se envian a los clientes, para que ellos a su vez las usen a través del tunel VPN. Esta linea deberá repetirese por cada red que quieras enviar a tus clientes, en este caso seria:

      push "route 192.168.0.0 255.255.255.0"
      push "route 192.168.1.0 255.255.255.0"

      Si esto ya esta configurado, el servidor VPN es el que no es capaz de dirigir a sus clientes a la red que tiene problemas.

  4. Muchas gracias por su respuesta,, lo hice pero no funciona todavia,, le dejo
    mi configuracion,, talvez tenga algun error

    my interfaces:::::::
    auto lo
    iface lo inet loopback

    auto eth0
    iface eth0 int static
    address 192.168.1.11
    netmask 255.255.255.0
    gateway 192.168.1.1

    auto eth1
    iface eth1 inet manual
    auto br0
    iface br0 int static
    address 192.168.1.12
    netmask 255.255.255.0
    network 192.168.1.0
    broadcast 192.168.1.255
    bridges-port eth1
    bridge-prio 1000

    my server.conf ::::::

    mode server
    tls-server
    port 1194
    proto udp
    dev tap0
    up “/etc/openvpn/up.sh br0 tap0 1500″
    down /etc/openvpn/down.sh br0 tap0”

    ca.crt
    cert server.crt
    key server.key
    dh dh1024.pem
    server-bridge 192.168.1.12 255.255.255.0 192.168.1.30 192.168.1.60
    push “router 192.168.0.0 255.255.255.0”
    push “route 192.168.1.0 255.255.255.0”
    push “dhcp-option dns 192.168.1.4”
    push “dhcp-option 8.8.8.8”
    client-to-client
    keepalive 10 120
    tls-auth ta.key
    comp-lzo
    user nobody
    group group
    max-client 30
    persist-ky
    persist-tun
    status openvpn-status.log
    verb 3

    my Client:::::::::::

    Client
    dev tap0
    proto udp
    remote 39.70.63.23 1194
    resolv-retry infinitive
    nobind
    persist-key
    persist-tun
    ca.crt
    cert client1.crt
    key client1.key
    ns-cert-type server
    tls-auth ta.key 1
    cipher BF-CBC
    comp-lzo
    verb 3

    rodolfo como hago que el servidor diriga la red hacia la otra red, por que en mi servidor linux localmente puedo ver las 2 redes,,, pero el cliente que se conecta solo ve una…
    yo tengo 2 tarjetas de red,,, como se ve en la configuracion de las tarjetas.

    muchas gracias de nuevo por tu ayuda

    • Estimado Hector:
      Veo 2 problemas potenciales, la subred 192.168.1.0/24 es una subred “interna” de la VPN, pero tambien haces “push” de la misma, al configurarse esa red en la interfaz de red de los clientes y el server, ya no es necesario hacer push. El segundo problema es mas complejo, y voy a usar un ejemplo para demostrartelo. Mi laptop es cliente de la VPN, tu generas un certificado y llave (crt, key) para mi conexión, y me lo entregas. El día lunes, yo me conecto a la VPN, y tu servidor corrobora mis certificados y me entrega la IP (interna de la VPN) 192.168.1.31, el día martes, me conecto nuevamente y me entrega la IP 192.168.1.32, es decir es dinámico. La forma de controlar eso es creando un directorio, para este ejemplo /etc/openvpn/configuraciones, luego en este directorio, debes crear un archivo con el nombre de mi certificado, es decir, si mis certificados son rodolfo.dominio.crt y rodolfo.dominio.key, el archivo debe ser rodolfo.dominio. Y en el mismo deberas especificar la IP que me debe tocar, siempre. Encontraras ejemplos de esto en mi pagina y en muchas otras.
      Una vez que el cliente obtiene la misma IP siempre, el sistema operativo debe tener una ruta estática de la redes del cliente en su tabla. Ejemplifico nuevamente, mi servidor tiene IP (VPN) 192.168.1.1, la laptop IP (VPN) 192.168.1.2. La red que el servidor publica es la 192.168.0.0/24, esto lo hace con la opcion de push, pero la red que el cliente publica, vamos a usar otra como 192.168.2.0/24, tambien debera haber un “push” de la misma, y ademas esta debera ser estar cargada como una ruta estatica en el servidor, con el siguiente comando por ejemplo:
      ip route add 192.168.2.0/24 via 192.168.1.2 dev tap0
      De esta forma, todos los clientes reciben la ruta, es decir, todos los que se conectan por VPN “saben” que para ver la red 192.168.2.0/24 deben ir por la VPN, pero el servidor ademas sabrá, que es red no esta directamente conectada a él mismo, sino a uno de los clientes, y direccionara el tráfico hacia el cliente que corresponda.
      Otra cosa que deberás observar es el firewall en ambos el servidor y el cliente, el firewall determina que paquetes pasan de un red a otra, y entre los dispositivos también. Yo no ahondé en estos detalles, pero puedes buscar tutoriales simples de iptables, y enfocarte en la cadena FORWARD, y no olvides activar el bit de forward en el kernel. 🙂

  5. hola Rodolfo, me pongo en contacto contigo ya que tengo un ligero problema que me está rompiendo la cabeza.
    Tengo instalados unos equipos electronicos detras de un router y tengo éste connectado por openvpn a un cliente via internet, el caso es que para acceder a esos equipos, como que estuviera en local, utilizo un programa propietario (que sólo funciona en local) simulando que entro en la red interna de los equipos electrónicos, es decir en local.

    El programa en cuestion me pide una direccion ip y un puerto de acceso a los equipos que el entiende como de conexion directa con el equipo electronico. Asi no hay problema. El problema viene cuando realizo la conexion vpn. Este tunel lo consigo realizar sin problemas por el puerto 1194 pero cuando le doy al programa (local) un puerto (7777) con la direccion publica del router y estando los equipos electronicos configurados con ese puerto (7777) y la direccion local la comunicación parece que funciona durante unos momentos en la que puedo volcar datos de los equipos pero luego tras un rato parece que se perdiera.

    A mi modo de ver hay algun tipo de problema con la comunicacion entre puertos y aunque he probado a abrir los correspondientes en el router no consigo una comunicacion estable. Entiendo que openvpn sólo me abre el 1194 pero se puede establecer la comunicacion entre un pc externo y unos equipos internos como si todos fueran internos atraves de otro puerto??

  6. hola Rodolfo, tengo conectadas 2 sedes por openvpn (lan to lan).
    Todos los usuarios de 1 sede se conectan a la otra sin problemas. Mi problema es que necesito que se muestren con qué ip’s internas se están conectando a la sede2 y sólo veo que todos se conectan con la ip del servidor openvpn.
    Todos los usuarios tienen ip’s fijas configuradas en sus máquinas windows.
    Cómo puedo hacer para que se muestren las ip’s de cada usuario?.
    Muchas graicas

  7. Buen día, disculpa Rodolfo estoy intentando hacer un servidor VPN, lo que pasa es que la carpeta doc/usr/share openvpn-2 no encuentro dentro la parte easy-rsa ? al no contar con ese script o carpeta no tengo nada que pegar en el destiino y no puedo seguir trabajndo..

  8. Hola tengo un problema quiero compartir una impresora desde un cliente conectado al servidor pero desde el servidor no puedo hacerle Ping al cliente que me falta configurar?

  9. Buena noche Rodolfo soy nuevo en linux y estoy tratando de configurar una vpn tipo Tun, no logro conectarme, al verificar me doy cuenta que la interface Tun0 no existe, me puedes ayudar indicándome como la agrego.

    Adjunto configuración del server.conf

    Gracias

    port 1194
    proto udp
    dev tun0
    ca ca.crt
    cert VPN******.crt
    key VPN*****.key # This file should be kept secret
    dh dh2048.pem
    server 10.8.0.0 255.255.255.0
    ifconfig-pool-persist ipp.txt
    push “route 192.168.2.0 255.255.255.128”
    push “redirect-gateway def1”
    push “dhcp-option DNS 10.8.0.1”
    keepalive 10 120
    comp-lzo
    user nobody
    group nogroup
    persist-key
    persist-tun0
    status openvpn-status.log
    verb 3

  10. Amigo una consulta improvisada, que pasa cuando tengo el túnel establecido con un segmento de red que llega de extremo a extremo sin ningún problema, pero se requiere agregar otro segmento de red?
    Ejemplo el primer segmento es una red privada 172.20.0.0 y el que se quiere agregar es 10.200.0.0.
    El túnel está en modo bridge.

Deja un comentario

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