Vpn con openvpn
Linux

Buenas, en este pequeño tutorial mostrare como montar una vpn tipo roadwarrior, que es una forma para hacer que varios clientes puedan conectarse a una red privada para poder compartir recursos independientemente del lugar donde esten. La conexión sera ethernet (TAP), OJO: Tambien se puede hacer con dispositivos TUN (desde la capa ip), pero desde mi punto de vista la primera es una mejor alternativa para este tipo de configuración.
En este tutorial se usara ubuntu, pero openvpn como todo el buen software es multiplataforma. OJO: los dispositivos TAP se generan de diferente forma en diferentes sistemas operativos.
En este ejemplo, estare usando las siguientes ip's
LAN ======> 10.9.8.0/24
Servidor Openvpn ======> 10.9.8.13
Gateway (router) ======> 10.9.8.1
Cliente =======> 192.168.1.1 (pero puede ser cualquier otra ip que no este dentro del rango de la vpn)
Primero hay que instalar openvpn y bridge-utils, tanto en el servidor como en los clientes, OJO: He tenido problemas con los drivers para Windows Vista, al parecer no cumplen con algunos certificados de confianza, ahi quedan avisados.
sudo apt-get install openvpn bridge-utils
Luego hay que crear el archivo de configuración para openvpn, este puede ser cualquier archivo que termine con *.conf en /etc/openvpn/, en este ejemplo le llamaremos, ejemplo.conf y tendrá lo siguiente:
#Donde y en que puerto escuchar, es una buena idea cambiarlos para
#evitar ataques automatizados
#===================================================================
local 10.9.8.13
port 10987
#===================================================================
#http://sites.inka.de/~W1011/devel/tcp-tcp.html
#con la conexion tipo "ethernet", nos ahorramos varios problemas de ruteo
#===================================================================
proto udp
dev tap0
#===================================================================
#claves
#===================================================================
ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/servidor.crt
key /etc/openvpn/easy-rsa/keys/servidor.key
dh /etc/openvpn/easy-rsa/keys/dh2048.pem
#===================================================================
#Para que push redirect-gateway funcione se debe habilitar port
#forwarding en el servidor (net.ipv4.ip_forward=1), y desactivar el
#firewall (ufw, en ubuntu).
#===================================================================
server-bridge 10.9.8.13 255.255.255.0 10.9.8.150 10.9.8.159
push "redirect-gateway"
#===================================================================
#Que las ip's sean persistentes entre sesiones
#===================================================================
ifconfig-pool-persist ipp.txt
#===================================================================
#Los clientes podran verse
#===================================================================
client-to-client
keepalive 10 60
#===================================================================
#Usar compresion
#===================================================================
comp-lzo
#===================================================================
#permitir que un mismo usuario se logee varias veces al mismo tiempo
#===================================================================
#duplicate-cn
#===================================================================
#Igual al numero de ip's asignadas para la vpn
#===================================================================
max-clients 10
#===================================================================
#Quitar permisos a openvpn
#===================================================================
user nobody
group nobody
persist-key
persist-tun
status openvpn-status.log
;log openvpn.log
;log-append openvpn.log
# 9 is extremely verbose
verb 7
mute 20
El archivo viene lo suficientemente comentado, por lo que solo explicare las partes criticas:
push "redirect-gateway"
el primer parrafo se lee de esta forma, "El servidor openvpn esta corriendo en la ip 10.9.8.13, y se habilitan a los clientes de las direcciones 10.9.8.150 a la 10.9.8.159, obvio que deberan tener esas direcciones disponibles en su red, y su servidor dhcp debera funcionar correctamente (esto lo hace la mayor parte de los routers de manera automatica). Hay que verificar que este habilitado el port-forwarding agregando:
"vm.swappiness=10
net.ipv4.ip_forward=1"
al archivo /etc/sysctl.conf
El primero no es necesario, pero me no ara daño, uhhh se me olvidaba, deberan tener una ip estática, de lo contrario el servicio no funcionara de manera adecuada, para asignar una ip estática en cada arranque en ubuntu editen el archivo /etc/network/interfaces y agreguen:
iface eth0 inet static
address 10.9.8.13
netmask 255.255.255.0
network 10.9.8.0
broadcast 10.9.8.255
gateway 10.9.8.1
despues de ello tendran que reiniciar la red, 'sudo /etc/init.d/networking restart' para aplicar los cambios.
Siguiendo con el tutorial, deberan asegurarse que las interfaces TAP se creen ANTES de levantar siquiera el servicio, para esto se descargan este archivo: http://pastebin.com/rtBXhg5u y lo agregan al nivel 5 de init, en ubuntu con update-rc.d
Por supuesto que hay que cambiarle los parametros de red:
sudo chmod +x ./bridge; sudo update-rc.d ./bridge defaults
Con esto el script se ejecutara cada vez que la maquina arranque, y podran usar openvpn sin problemas, OJO: esto solo se hace en el servidor, en el cliente como veremos mas adelante, el proceso quedara bastante simplificado.
Despues de ello, solo quedará crear y distribuir las claves de acceso, crearemos nuestras llaves con easy-rsa, en ubuntu:
sudo cp -v /usr/share/doc/openvpn/examples/easy-rsa/2.0 /etc/openvpn/easy-rsa
lo que creara un directorio llamado 'easy-rsa' en /etc/openvpn que trae algunos scripts para generar las claves y los certificados, OJO: esto tambien se puede hacer directamente con openssl (no estoy seguro si tambien se puede con gnutsl, alguien sabe?)
El primer paso sera editar el archivo VARS, con los datos de la empresa o del lugar donde estes implementando la vpn, luego hay que logearse como root:
sudo su
Y ejecutar:
# source ./vars
esto inicializara las variables, luego:
# ./clean-all
OJO: solo deberan ejecutar ./clean-all cuando esten instalando la vpn, despues para remover certificados y agregar clientes extra se ejecuta source ./vars y ./build-key o ./revoke-full cliente directamente, si en esas instancias ejecutan ./clean-all eliminaran las claves que tenian hasta entonces y tendran que volver a configurar TODOS los clientes.
OJO: los scripts deben ejecutarse desde una consola de root '#', obtendran algunos errores si lo intentan con 'sudo'
# ./build-ca
Se crea el certificado, y luego la llave del servidor
./build-key-server servidor
OJO: aqui debe tener el mismo nombre que se especifica en el archivo de configuracion, para este ejemplo puntual, seria 'servidor', una vez generado este archivo sera el más importante, asegurense que solo root pueda "verlo".
Se genera los parametros diffie-helman, ahora, para ser sinceros, no tengo la mas remota idea para que sirve esto, pero no funciona sin el, asi que hay que generarlo:
# ./build-dh
Finalmente se crearan los certificados de los clientes:
# ./build-key nombre_cliente
Este último proceso se puede hacer las veces que se requiera para un numero ilimitado de clientes, se generarán por cada cliente 3 archivos:
-
nombre_cliente.crt
nombre_cliente.key
nombre_cliente.csr
Los clientes solo requieren los 2 primero y el certificado del servidor 'ca.crt', todas las claves se guardan por default y para este ejemplo, en '/etc/openvpn/easy-rsa/keys', entonces juntan esos 3 archivos de cada usuario y se los pasan, de preferencia que todos queden en el mismo folder.
Se reinicia el servidor y todo deberia estar funcionando
sudo /etc/init.d/openvpn start
deberan un mensaje como este en /var/log/syslog :
Entonces sabran que al menos del lado del servidor todo funciona : ) , la configuración de los clientes es realmente ridicula, y más si instalan:
sudo apt-get install network-manager-openvpn
Entonces podran ir a "editar conexiones" -> vpn -> add -> agregan su conf y listo, sus clientes solo tendran que dar click en network-manager y seleccionar su vpn, el final feliz tendra que ser + o - asi:

Listo! : )
En caso de que no funcione pueden hacer la conexión e ir viendo los mensajes que se generan en '/var/log/syslog', tambien se puede lanzar openvpn desde consola con una salida más verbosa, para lo cual se necesitará un archivo muy básico de configuración, para este ejemplo puntual, sería este:
client
dev tun
proto tcp
remote ejemplo.com
float #debido a que la IP de arriba es dinamica
resolv-retry infinite
nobind
persist-key
persist-tun
ca "/home/chilicuil/ca.crt"
cert "/home/chilicuil/chilicuil.crt"
key "/home/chilicuil/chilicuil.key"
comp-lzo
verb 4
sudo openvpn --config cliente.conf
PD: Aunque hay mucha documentación, al principio puede ser intimidamente/no muy clara por lo que la mejor forma de agarrarle la onda es intentar varias configuraciones hasta encontrar la que mejor se adapte a sus necesidades, openvpn puede usarse de muchas y diversas formas. Dejo la liga: http://openvpn.net/howto.html
PD2: No hay que olvidar redireccionar las peticiones de openvpn hacia su servidor desde su router
PD3: Gracias de nuevo @rnstux es mucho más comodo bloggear con este editor
Permalink: http://www.mononeurona.org/entries/view/chilicuil/2145
Commentblogs:chingon, solo dos sugerencias:
Se me hace menos complicado y mas elegante ligar la MAC a la IP que quieres fijar (servidor OpenVPN) mediante el servicio dhcp del router. Es una configuración independiente de la Distribución o SO.
La segunda es que no estoy seguro que tus llaves sean de calidad, en un ubuntu para X86_64 instalación por default + openvpn no creo que la entropia disponible en la generación de Números Pseudo-aleatorios supere 300 (puedes verlo en /proc/sys/kernel/random/entropy_avail), para la generación de llaves lo ideal esta entre 1500 y 4000.
Saludos Cordiales.
Saludos cordiales.
2010-03-17 09:40:28-06
Chido post, vamos a estar chambeando para que se puedan exportar a PDF..
2010-03-17 09:58:44-06
@vendaval, voy a considerar lo de la MAC, tienes razón sería menos rollo para cuando se tuviera que migrar a otro servidor
Respecto a las claves, pues en este sistema la salida de /proc/sys/kernel/random/entropy_avail es de 3250 en promedio así que no esta tan mal, además (aunque no se si este ligado) he declarado que el tamaño de las llaves sean de 2048 bits en lugar de 1024, espero que aguante vara por un raton.
En todo caso, si la salida no fuera lo suficiente buena bastaría con hechar a correr algunos procesos mas, no?
@rnstux pues ya ni como pedirlo, ahi llevatela relax no te sobrecargues
Gracias por sus comentarios.
2010-03-17 11:38:18-06
3250!!!! orale hasta te voy a pedir que generes mis certificados jejeje.
2010-03-18 06:19:25-06
Buenos días,
Muy buen tutorial, llevo varios días con esto y es uno de los tutoriales más completos que he encontrado.
He conseguido montar la vpn casi sin complicaciones
yo la creo con:
server-bridge 192.168.1.3 255.255.255.0 192.168.1.128 192.168.1.254
y el resto es basicamente igual.
Mi problema radica que al mapear la red local, con por ejemplo nast -m consigo ver todos los equipos locales pero no los de la vpn, aunque tengo conexión a ellos sin problema. Alguna idea de por qué es así?
Gracias y salu2.
2010-07-09 01:02:13-05
Hola,
Gracias por tu comentario, hablando sobre tu problema, pues no tengo experiencia con $ nast, lo que yo hago para ver quienes esta online es usar nmap, por ejemplo: $ nmap 10.0.0.0/16 -sP
Perdón por la respuesta tan incompleta.
2010-07-10 07:02:06-05
Buenas,
En primer lugar gracias por tu respuesta. La verdad es que ya había probado nmap, incluso con timeout alto por si era un problema de latencia. Por lo que he llegado a ver debe ser un problema con el DHCP. No sabrías por casualidad como conectar la vpn con el DHCP en vez de hacerlo con la opción bridge?
Mucha gracias y perdona las molestias.
2010-07-12 03:10:55-05
Hola profetious,
Mira, la verdad nunca he tenido la necesidad de habilitar dhcp en los clientes vpn, veo que esta cubierto brevemente e incompletamente en la faq: http://tinyurl.com/24h7ook
Lo que si he notado es que el pool de ips de tu servidor esta en el rango 192.168.1.0/24, al comienzo del tutorial recomiendo que se use un rango diferente al de los clientes, esto porque tambien tuve errores parecidos cuando usaba el mismo rango en ambos lados. La gran mayoria de los clientes se conectan desde redes del tipo 192.168.x.x . Ya se que no es facil cambiar de rango cuando tienes muchos equipos, a mi me tomo 1 semana cambiar todas las maquinas, pero desde entonces no he tenido ningun problema. Te recomiendo que hagas una prueba rapida conectando un cliente desde una subnet diferente y viendo si aun asi no encuentra el dispositivo.
Saludos y suerte.
2010-07-12 06:59:24-05
Buenas Chilicuil,
Gracias por tu respuesta. He cambiado el direccionamiento cambiando a una 192.168.0.0/22
dejando 192.168.1.0/24 para la local y el resto remoto.
Lo curioso es que los mapeos de red siguen sin funcionar si los hago a toda la red local, es decir, solo detecta los equipos locales. Sin embargo si los hago sobre la zona vpn
nmap -sP 192.168.2.0/24 p. ejem. si encuentra los equipos conectados. Es curioso.
Seguire investigando y si encuentro algo mas te lo comento.
De nuevo gracias por tu ayuda.
Salu2.
2010-07-13 01:17:46-05
Hola,
He seguido haciendo pruebas y creo que el problema radica en el retardo de la conexión de los equipos remotos ya que utilizan una conexión a internet muy lenta. Por lo demás todo funciona a la perfección magnifico tutorial y gracias por los consejos.
2010-07-14 07:28:16-05
Hola de nuevo,
Después de tener el sistema durante varias semana todo parece funcionar perfectamente pero me surge una duda si quisiese cambiar el servidor openvpn y conservar los certificados ¿qué ha de hacerse?
Muchas gracias por todo.
2010-07-26 06:35:55-05
Hola
Perdon por volver al mismo hilo pero no tengo muy claro donde buscar para este problema.
La vpn me funciona de lujo, pero he detectado que envia muchisimo trafico del servidor a lso clientes. No creo q sea un problema de configuracion y no se si es normal. ¿Alguna idea?
2010-09-08 10:04:37-05









