[OpenBSD]

[Anterior: Formación de colas y prioridades de paquetes] [Contenido] [Siguiente: Marcado de paquetes]

PF: Reservas de direcciones y balanceo de carga


Índice de contenidos


Introducción

Una reserva (pool) de direcciones es un grupo de dos o más direcciones cuyo uso comparten un grupo de usuarios. Una reserva de direcciones puede especificarse como la dirección de destino en las opciones de filtrado nat-to, rdr-to,route-to, reply-to y dup-to.

Existen cuatro métodos para usar una reserva de direcciones:

A excepción del método round-robin, la reserva de direcciones se debe expresar como un bloque CIDR (Enrutamiento de Inter-Dominios Sin Clase). El método round-robin aceptará más de una dirección individual cuando se use una lista o una tabla.

La opción sticky-address puede ser usada con los tipos de reserva random y round-robin para asegurarse de que una dirección de origen en particular sea siempre asignada a la misma dirección de redirección.

Reserva de direcciones de NAT

Se puede usar una reserva de direcciones como la dirección de traducción en las reglas nat-to. La dirección de origen de las conexiones se traducirá a la de una de las direcciones de la reserva, basándose en el método escogido. Esto puede ser muy útil en situaciones en las que PF esté realizando NAT para una red muy grande. Dado que el número de conexiones con NAT por dirección de traducción es limitado, al añadir direcciones de traducción adicionales la pasarela de NAT podrá escalar y así servir a un número mayor de usuarios.

En el siguiente ejemplo, se usa una reserva de dos direcciones para traducir los paquetes salientes. Por cada conexión saliente, PF rotará las direcciones según el método round-robin.

match out on $ext_if inet nat-to { 192.0.2.5, 192.0.2.10 }

Un problema con este método es que las conexiones sucesivas desde una misma dirección interna no se traducirán siempre a la misma dirección. Esto puede causar interferencias, por ejemplo, cuando se esté navegando por sitios web que realicen seguimientos de los ingresos de los usuarios basándose en la dirección IP. Una alternativa es usar el método source-hash, para que siempre se traduzca cada dirección interna a la misma dirección. Para ello, la reserva de direcciones debe ser un bloque de red CIDR

match out on $ext_if inet nat-to 192.0.2.4/31 source-hash

Esta regla usa la reserva de direcciones 192.0.2.4/31 (192.0.2.4 - 192.0.2.5) como la dirección de traducción de los paquetes salientes. Cada dirección interna se traducirá siempre a la misma dirección de traducción, por indicación de la clave source-hash.

Balanceo de carga en conexiones entrantes

Las reservas de direcciones también se pueden usar para el balanceo de carga de las conexiones entrantes. Por ejemplo, se pueden distribuir a través de varios servidores de web las conexiones entrantes al servidor de web:

web_servers = "{ 10.0.0.10, 10.0.0.11, 10.0.0.13 }"

match in on $ext_if proto tcp to port 80 rdr-to $web_servers \
    round-robin sticky-address

Las conexiones sucesivas se redireccionarán a los servidores de web de acuerdo con el método round-robin, enviando al mismo servidor web las conexiones provenientes del mismo origen. Esta "conexión pegajosa" existirá mientras haya estados que hagan referencia a esta conexión. Una vez que los estados expiren, esta "conexión pegajosa" lo hará también. Las siguientes conexiones provenientes de este host serán redirigidos al siguiente servidor web en el round robin.

Balanceo de carga en tráfico saliente

Las reservas de direcciones se pueden usar en combinación con la opción de filtrado route-to, con el fin de balancear la carga de dos o más conexiones de Internet cuando no se encuentre disponible un protocolo de enrutamiento de múltiples caminos apropiado (como BGP4). Usando route-to con una reserva de direcciones round-robin, se pueden distribuir las conexiones salientes a partes iguales entre múltiples caminos salientes.

Un pieza adicional de información necesaria para esto es la dirección IP del enrutador adyacente en cada conexión de Internet. Esta información se pasa a la opción route-to para controlar el destino de los paquetes salientes.

El siguiente ejemplo balancea el tráfico saliente a través de dos conexiones de Internet:

lan_net = "192.168.0.0/24"
int_if  = "dc0"
ext_if1 = "fxp0"
ext_if2 = "fxp1"
ext_gw1 = "68.146.224.1"
ext_gw2 = "142.59.76.1"

pass in on $int_if from $lan_net \    route-to { ($ext_if1 $ext_gw1), ($ext_if2 $ext_gw2) } \    round-robin

La opción route-to se usa sobre el tráfico que entra en la interfaz interna para especificar las interfaces de red salientes a través de las cuales se balanceará el tráfico, junto con sus respectivas pasarelas. Nótese que la opción route-to debe estar presente en cada una de las reglas de filtrado para las que se balanceará el tráfico (no puede usarse con reglas match).

Para asegurarse de que los paquetes con una dirección de origen que pertenezca a $ext_if1 sean siempre enrutados a $ext_gw1 (y lo mismo para $ext_if2 y $ext_gw2), hay que incluir las siguientes dos líneas en el grupo de reglas:

pass out on $ext_if1 from $ext_if2 \
   route-to ($ext_if2 $ext_gw2)
pass out on $ext_if2 from $ext_if1 \
   route-to ($ext_if1 $ext_gw1)

Finalmente, también se puede usar NAT en cada una de las interfaces salientes:

match out on $ext_if1 from $lan_net nat-to ($ext_if1)
match out on $ext_if2 from $lan_net nat-to ($ext_if2)

Un ejemplo completo que balancea la carga del tráfico saliente sería algo parecido al siguiente:

lan_net = "192.168.0.0/24"
int_if  = "dc0"
ext_if1 = "fxp0"
ext_if2 = "fxp1"
ext_gw1 = "68.146.224.1"
ext_gw2 = "142.59.76.1"

#  conexiones salientes de nat en cada interfaz de internet
match out on $ext_if1 from $lan_net nat-to ($ext_if1)
match out on $ext_if2 from $lan_net nat-to ($ext_if2)

#  denegación predeterminada
block in
block out

#  permitir el paso a todos los paquetes salientes en la interfaz interna
pass out on $int_if to $lan_net
#  permitir el paso 'quick' a cualquier paquete destinado para la pasarela
pass in quick on $int_if from $lan_net to $int_if
#  balancear la carga del tráfico tcp saliente desde la red interna.
pass in on $int_if from $lan_net \
    route-to { ($ext_if1 $ext_gw1), ($ext_if2 $ext_gw2) } \
    round-robin
#  mantener tráfico https en una única conexión; algunas aplicaciones web,
#  especialmente las "seguras", no permiten cambiar a mitad de sesión
pass in on $int_if proto tcp from $lan_net to port https \
    route-to ($ext_if1 $ext_gw1)

#  reglas "pass out" genéricas para las interfaces externas
pass out on $ext_if1
pass out on $ext_if2

#  enrutar paquetes desde cualquier IP en $ext_if1 hacia $ext_gw1
#  y lo mismo para $ext_if2 y $ext_gw2
pass out on $ext_if1 from $ext_if2 route-to ($ext_if2 $ext_gw2)
pass out on $ext_if2 from $ext_if1 route-to ($ext_if1 $ext_gw1) 

[Anterior: Formación de colas y prioridades de paquetes] [Contenido] [Siguiente: Marcado de paquetes]


[back] www@openbsd.org
$OpenBSD: pools.html,v 1.8 2011/03/04 16:16:15 ajacoutot Exp $