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
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.
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
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
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.
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. 🙂
Hola,
Puedes enviarme el link de tu página en donde configures el OpenVpn para que me entregue la misma dirección a mi equipo Windows?
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??
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
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..
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?
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
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.
Hola. Implementé una OpenVPN en windows y todo perfecto.
El problema es cuando tengo un usuario no-administrador.en una PC cliente no funciona. Si el OpenVPN-GUI no se ejecuta como administrador no funciona. La VPN dice que conecta y establece la IP pero en realidad no hay forma de acceder al server.
Encontré mil maneras de que el OpenVPN-GU se ejecute al inicio pero nunca funciona. El problema es que las PCs de los clientes no pueden tener usuarios administradores para la red donde tengo que instalarlo. Agradecería cualquier ayuda- Gracias