openvpn + balanceo ADSL

Imagen de plcabgut

Tema: 

Después de haber conseguido balancear la carga de los dos routers que en este momento tenemos
todo iba fenomenal hasta que me di cuenta de que la vpn no conectaba a veces.

La situación actual es:

  • router0 tiene externamente IP fija asociada a un dominio www.dominio-ficticio.com
  • router1 tiene IP dinámica y solo se utiliza para salir a Internet desde el centro de trabajo.

El programa para conectar los pc's externamente a la VPN es openVPN GUI
El servidor de vpn es openvpn sobre Ubuntu 8.04

El problema: Las peticiones de conexión hacia la vpn provienen siempre del router que tiene asociado el dominio. Debido al balanceo de carga entre los dos router, el servidor devuelve la conexión por cualquiera de los dos routers.
Había veces que la vpn devolvía los paquetes por el router que tiene asociado el dominio y otras por el que no lo tiene. Por
lo que aleatoriamente se podía conectar si elegía el router con el dominio o no si elegía el otro, y luego al rato podía perderse la conexión cuando mandaba los paquetes por UDP por el router que no tiene dominio.

La solucion: Después de darle muchas vueltas resulta que la vpn usaba como protocolo el UDP por lo que si le indicamos que use TCP mantendrá las conexiones persistentes y así siempre devolverá los paquetes por el router por el que le llegan la peticiones de conexión.

el fichero server.conf del la vpn es

port 1194
proto udp
dev tun
ca /etc/openvpn/certs/keys/ca.crt
cert /etc/openvpn/certs/keys/server.crt
key /etc/openvpn/certs/keys/server.key
dh /etc/openvpn/certs/keys/dh1024.pem
server 10.10.11.0 255.255.255.0
ifconfig-pool-persist ipp.txt

client-to-client
keepalive 10 120
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
status openvpn-status.log
verb 3
push "route 10.1.0.0 255.255.0.0"
push "route 10.2.0.0 255.255.0.0"
push "route 10.3.0.0 255.255.0.0"
push "route 10.5.0.0 255.255.0.0"
push "route 10.10.0.0 255.255.0.0"

La solución por tanto es modificar la linea del protocolo y cambiarla por:

proto tcp

Y lo mismo hay que cambiar en los clientes en [quote]C:\Archivos de programa\OpenVPN\config[/quote] el fichero de configuración
en mi caso configuracion.ovpn

client
dev tun
proto tcp
route-method exe
route-delay 2
resolv-retry infinite
nobind
persist-key
persist-tun
comp-lzo
verb 3
ca servidor.crt
dev-node "VPN"
remote www.dominio-ficticio.com 1194
cert plcabgut.crt
key plcabgut.key

Comentarios

excelente, y cómo lograste el

Imagen de Epe

excelente, y cómo lograste el balanceo? Te fue fácil?

sobre tcp mi comentario es que técnicamente es un tanto más lento, pero definitivamente no deja de ser una solución lo que hallaste!

Saludos
epe

EcuaLinux.com

+(593) 9 9924 6504

Servicios en Software Libre

Hola Te cuento: el balanceo

Imagen de plcabgut

Hola
Te cuento:
el balanceo al principio pensé que iba a ser sencillo porque había muchas cosas tanto aquí en el foro como en
Internet pero probé varias cosas y no me funcionaron como quería porque tenía que tener scripts para el balanceo y luego scripts para el failover, etc...
Pero al final encontré como hacerlo y va bastante bien y es sencillo aparte de que usa el comando ip (en vez de route e ifconfig) y es dinámico porque esta casi todo definido en el fichero /etc/network/interfaces.
Lo tienes aquí explicado paso a paso.
Balanceo de carga sobre varios ADSL

Estoy pendiente de poner el script para el failover, para detectar cuando se cae un enlace que deje de enviar paquetes por ese router. El script que uso lo que he tenido que modificar porque no iba bien del todo.
cuando lo tenga listo postearé el resultado.

En cuanto al rendimiento de la vpn no me parece que vaya mas lento. de hecho usamos una carpeta compartida por samba entre los pcs externos a la red que acceden por la vpn y el servidor de vpn y no he visto que vaya mas lento en absoluto.

No he hecho mediciones porque como no veo que vaya mal, pues no he perdido tiempo en eso.

un saludo

jaja, bien ! Te comento mira:

Imagen de Epe

jaja, bien ! Te comento mira: Este script de nano.txt y varias de las referencias que haces las usé hace unos 6 o 7 años cuando en una empresa donde trabajaba me pidieron le implementara.. y me acordé porque ahora indicas del script de failover.. que yo recuerde era un ping.. y si el ping al GW de esta red fallaba, le apagaba... era medio brutal y precisamente por esono me gustaba...

Por lo que veo que has publicado, se sigue usando la misma técnica.. deja ver si hago un tiempo uno de estos días para probarle... ojalá funcione al 100%.... recuerdo qeu tenía un defectito y era que si se caía el enlace, las conexiones que por ahi estaban establecidas daban timeout por unos segundos a un minuto, entonces comenzaban a funcionar... pero bueno, eso no es malo, es normal para lo que se intenta.

sí, sobre la vpn, realidad no notarás nada a no ser que tengas un tráfico muy grande (Varios mbit/s) para la vpn.. pero definitivamente tcp sí tiene un payload que es el ehcho de tener que confirmar cada paquete, problema que se quita udp

Saludos
epe

EcuaLinux.com

+(593) 9 9924 6504

Servicios en Software Libre

Hola epe Tienes razón

Imagen de plcabgut

Hola epe
Tienes razón respecto al "payload" añadido al tener que confirmar cada paquete (entrara en juego el tema del protocolo de ventana deslizante para confirmar paquetes recibidos) que no había tenido en cuenta, jo!!! hace mucho que me estudie el tcp/ip.

Pero como te comentaba solo se usa la vpn para acceder a una web interna de gestión de la red del centro y una carpeta samba por lo que el trafico no es muy alto.

Con respecto al failover estoy probando el ping usando el parámetro -I eth0 o -I eth1

  • ping -W 2 -I eth0 -c 1 www.google.es
  • ping -W 2 -I eth1 -c 1 www.google.es

si falla uno de los enlaces, bajo el interface eth0 o eth1 y como esta definido en los interfaces esta linea que esta en negrita pues se auto quita de la tabla de rutas por el post-down ip.
Y si vuelve a estar activo pues le levanto y se ejecutan las sentencias post-up ip ..

# interfaz conectado al Router 0
iface eth0 inet static
address 192.168.0.11
netmask 255.255.255.0
post-up ip route add 192.168.0.0 dev eth1 src 192.168.0.11 table router0
post-up ip route add default via 192.168.0.100 table router0
post-up ip rule add from 192.168.0.11 table router0
post-down ip rule del from 192.168.0.11 table router0
auto eth0

# interfaz conectado al Router 1
iface eth1 inet static
address 192.168.1.11
netmask 255.255.255.0
post-up ip route add 192.168.1.0 dev eth0 src 192.168.1.11 table router1
post-up ip route add default via 192.168.1.100 table router1
post-up ip rule add from 192.168.1.11 table router1
post-down ip rule del from 192.168.1.11 table router1
auto eth1

El estado de enrutamiento con ip route show sale:
......
default
nexthop via 192.168.0.100 dev eth0 weight 1
nexthop via 192.168.1.100 dev eth1 weight 1

Si detecto que se ha caído una línea por ejemplo la que va por el router conectado a eth1 pues
hago en el script de failover ifdown eth1 y el resultado que sale es:
......
default
nexthop via 192.168.0.100 dev eth0 weight 1
nexthop via 192.168.1.100 dev eth1 weight 1 dead

Con lo cual indica que el enlace esta caído y se irá el tráfico por el otro lado (espero).
Pero vamos que todavía estoy probando, cuando lo tenga listo pues lo pondré en el blog. Por cierto si tu tienes un script de estos pues ya sabes aquí no le hacemos ascos a nada jejejeje.

un saludo.