Balanceo de carga WAN y túneles

En este artículo de Knowledge Base cubriremos algunas de las consideraciones especiales que sean necesarias con combinación de balanceo de carga WAN y túneles.  Para simplificar este ejemplo utilizará un tunnnel GRE (depuración más fácil con la captura de paquetes de datos no encyrpted), pero si la teoría debería funcionar para otros túneles.

La topología:

 

Router R1                                                                         Router R2

 

eth0 WAN1 20.0.0.2/30                                             30.0.0.2/30 WAN eth0

eth1 LAN 192.168.1.1/24                                        eth1 LAN 172.16.1.1/24

pppoe0 WAN2

tun0 GRE 40.0.01/30                                               tun0 GRE 40.0.0.2/30

A empezar con el túnel GRE, luego añadir el balanceo de la carga después de.

Queremos que nuestro túnel GRE para ir de eth0 de R1 a R2 eth0.  Así que para R1 agregamos:

 tunnel tun0 {
     address 40.0.0.1/30
     encapsulation gre
     local-ip 20.0.0.2
     remote-ip 30.0.0.2
 } 

Para R2:

 tunnel tun0 {
     address 40.0.0.2/30
     encapsulation gre
     local-ip 30.0.0.2
     remote-ip 20.0.0.2
 }

 

Entonces tenemos que abrir el firewall para el protocolo GRE para WAN_LOCAL:

 

ubnt@R1# show firewall name WAN_LOCAL rule 40
 action accept
 description "Allow GRE"
 protocol gre
 source {
     address 30.0.0.2
 }

 

Entonces probablemente necesitaremos TCP mss-abrazadera:

 

ubnt@R1# show firewall options 
 mss-clamp {
     interface-type tun
     interface-type pppoe
     mss 1412
 }

 

Último tenemos que añadir una ruta estática para indicar al sistema que la red LAN de R2 debe enviarse interfaz tun0.

     interface-route 172.16.1.0/24 {
         next-hop-interface tun0 {
         }
     }

En este punto nuestro túnel GRE debería funcionar, pero

ubnt@R1:~$ ping 172.16.1.1
PING 172.16.1.1 (172.16.1.1) 56(84) bytes of data.
64 bytes from 172.16.1.1: icmp_req=1 ttl=64 time=0.832 ms
64 bytes from 172.16.1.1: icmp_req=2 ttl=64 time=0.741 ms
64 bytes from 172.16.1.1: icmp_req=4 ttl=64 time=0.635 ms
64 bytes from 172.16.1.1: icmp_req=5 ttl=64 time=0.654 ms
64 bytes from 172.16.1.1: icmp_req=6 ttl=64 time=0.644 ms
64 bytes from 172.16.1.1: icmp_req=7 ttl=64 time=0.614 ms
^C
--- 172.16.1.1 ping statistics ---
8 packets transmitted, 6 received, 25% packet loss, time 7006ms
rtt min/avg/max/mdev = 0.614/0.686/0.832/0.082 ms 

Así que tipo de trabajos, pero 25% pérdida de paquetes no es buena.  Una teoría es ya tenemos conexión a Internet 2, que van algunos paquetes a la interfaz incorrecta.  Para probar tomaremos a la interfaz WAN 2 º.

ubnt@R1:~$ disconnect interface pppoe0 
Bringing interface pppoe0 down...
ubnt@R1:~$ 
ubnt@R1:~$ 
ubnt@R1:~$ ping 172.16.1.1
PING 172.16.1.1 (172.16.1.1) 56(84) bytes of data.
64 bytes from 172.16.1.1: icmp_req=1 ttl=64 time=0.789 ms
64 bytes from 172.16.1.1: icmp_req=2 ttl=64 time=0.606 ms
64 bytes from 172.16.1.1: icmp_req=3 ttl=64 time=0.585 ms
64 bytes from 172.16.1.1: icmp_req=4 ttl=64 time=0.667 ms
64 bytes from 172.16.1.1: icmp_req=5 ttl=64 time=0.650 ms
64 bytes from 172.16.1.1: icmp_req=6 ttl=64 time=0.707 ms
64 bytes from 172.16.1.1: icmp_req=7 ttl=64 time=0.752 ms
64 bytes from 172.16.1.1: icmp_req=8 ttl=64 time=0.613 ms
^C
--- 172.16.1.1 ping statistics ---
8 packets transmitted, 8 received, 0% packet loss, time 7007ms
rtt min/avg/max/mdev = 0.585/0.671/0.789/0.069 ms

Problema resuelto! Pero cómo utilizamos la WAN 2 º. Una forma es agregar una ruta estática para el lejano final GRE y forzarlo a salir eth0.

     route 30.0.0.2/32 {
         next-hop 20.0.0.1 {
         }
     }

Ahora podemos traer de vuelta la interfaz pppoe0 y sigue el túnel GRE funciona bien.

La configuración completa para el router R1 y R2 para esta parte de la KB están:

R1 /config/config.boot GRE

R2 /config/config.boot GRE

 

Balanceo de carga

 

Ahora vamos a añadir el balanceo de carga WAN a R1.  Comenzar con la sección de equilibrio de la carga:

 

load-balance {
    group WLB {
        interface eth0 {
        }
        interface pppoe0 {
        }
    }
}

Esto es lo que realmente necesitamos, pero vamos a cambiar el destino de ping a una dirección para que el chequeo no necesita DNS.

load-balance {
    group WLB {
        interface eth0 {
            route-test {
                type {
                    ping {
                        target 8.8.8.8
                    }
                }
            }
        }
        interface pppoe0 {
            route-test {
                type {
                    ping {
                        target 8.8.8.8
                    }
                }
            }
        }
    }
}

 A continuación vamos a añadir un firewall modificar regla

    
   modify BALANCE {
        rule 10 {
            action modify
            description "Do not load-balance LAN to LAN traffic"
            destination {
                address 192.168.1.0/24
            }
            modify {
                table main
            }
        }
        rule 20 {
            action modify
            description "load-balance the rest of LAN to WAN traffic"
            modify {
                lb-group WLB
            }
        }
    }

Luego aplicar la regla de modificar a la LAN "en".

    ethernet eth1 {
        address 192.168.1.1/24
        description LAN
        firewall {
            in {
                modify BALANCE
            }
        }
    }

 En este punto nuestro tráfico LAN es ser equilibrado sobre ambas WAN bastante uniformemente:

 

ubnt@R1:~$ show load-balance status 
Group WLB
  interface   : eth0
  carrier     : up
  status      : active
  gateway     : 20.0.0.1
  weight      : 50
  flows
      WAN Out : 682
      WAN In  : 0
    Local Out : 20

  interface   : pppoe0
  carrier     : up
  status      : active
  gateway     : pppoe0
  weight      : 50
  flows
      WAN Out : 672
      WAN In  : 0
    Local Out : 22

 

Pero el túnel GRE no funciona ahora.  El primer problema es que realmente no queremos equilibrar carga el tráfico LAN que va a ir sobre el túnel GRE.  Así que vamos a añadir una regla antes de la regla de lb-grupo como:

 

ubnt@R1# show firewall modify 
 modify BALANCE {
     rule 10 {
         action modify
         description "Do not load-balance LAN to LAN traffic"
         destination {
             address 192.168.1.0/24
         }
         modify {
             table main
         }
     }
     rule 20 {
         action modify
         description "Do not load-balance traffic for gre tunnel"
         destination {
             address 172.16.1.0/24
         }
         modify {
             table main
         }
     }
     rule 30 {
         action modify
         description "load-balance the rest of LAN to WAN traffic"
         modify {
             lb-group WLB
         }
     }
 }

 Sobre todo está trabajando ahora, pero a veces necesito tomar abajo la interfaz pppoe del túnel GRE llegar correctamente.  El próximo número se relaciona con cómo la característica de equilibrio de la carga actualmente se implementa con una tabla de enrutamiento separada por la interfaz WAN que sólo tiene una ruta por defecto para WAN.  Esto funciona bien para LAN a WAN sesiones, pero se rompe cuando necesitamos una ruta conectada desde la tabla de enrutamiento "principal".  Por lo que el trabajo actual en torno es en lugar de utilizar la tabla de enrutamiento independiente sistema generado, en su lugar crear la tuya que tiene la ruta por defecto para WAN y las rutas conectadas que se necesitan.

 

ubnt@R1# show protocols static table 
 table 1 {
     interface-route 20.0.0.0/30 {
         next-hop-interface eth0 {
         }
     }
     interface-route 192.168.1.0/24 {
         next-hop-interface eth1 {
         }
     }
     route 0.0.0.0/0 {
         next-hop 20.0.0.1 {
         }
     }
 }
 table 2 {
     interface-route 0.0.0.0/0 {
         next-hop-interface pppoe0 {
         }
     }
     interface-route 20.0.0.0/30 {
         next-hop-interface eth0 {
         }
     }
     interface-route 192.168.1.0/24 {
         next-hop-interface eth1 {
         }
     }
 }

 

Y luego cambiar la configuración de equilibrio de carga para utilizar la tabla de enrutamiento de over-ride.

ubnt@R1# show load-balance           
 group WLB {
     interface eth0 {
         route {
             table 1
         }
         route-test {
             type {
                 ping {
                     target 8.8.8.8
                 }
             }
         }
     }
     interface pppoe0 {
         route {
             table 2
         }
         route-test {
             type {
                 ping {
                     target 8.8.8.8
                 }
             }
         }
     }
 }

El archivo de configuración completo de R1 con GRE y WAN balanceo de carga es:

 

R1 /config/config.boot GRE con balanceo de carga WAN

 

Abajo se encuentra el ejemplo los archivos de configuración para un túnel IPSec entre R1 y R2 mientras que R1 tiene configurar balanceo de carga WAN.

 

R1 /config/config.boot IPSec a R2 con balanceo de carga WAN

IPSec /config/config.boot de R2 a R1