[OpenBSD]

[Anterior: Formación de Colas y Prioridades de Paquetes] [Contenido] [Siguiente: Marcado de Paquetes]

PF: Pools de Dirección y Balanceo de Carga


Índice de Contenidos


Introducción

Un pool de dirección es un grupo de dos o más direcciones cuyo uso comparten un grupo de usuarios. Un pool de dirección puede especificarse como una dirección de redireccionamiento en las reglas de rdr, como una dirección de traducción en las reglas de nat, y como una dirección de objetivo en las opciones route-to, reply-to, y dup-to de las reglas de filtrado de paquetes.

Existen cuatro métodos para usar un pool de dirección:

A excepción del método round-robin, el pool de dirección 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.

Pool de Dirección de NAT

Se puede usar un pool de dirección como la dirección de traducción en las reglas de nat. La dirección de origen de las conexiones se traducirá a la de una de las direcciones del pool, 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 un pool de dos direcciones para traducir los paquetes salientes. Por cada conexión saliente, PF rotará las direcciones según el método round-robin.

nat on $ext_if inet from any to any -> { 192.0.2.5, 192.0.2.10 }

Una pega 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 de traducció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 de traducción. Para ello, el pool de dirección debe ser un bloque de red CIDR

nat on $ext_if inet from any to any -> 192.0.2.4/31 source-hash

Esta regla de nat usa el pool de dirección 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

Los pools de dirección 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 }"

rdr on $ext_if proto tcp from any to any port 80 -> $web_servers

Las conexiones sucesivas se redireccionarán a los servidores de web de acuerdo con el método round-robin.

Como con el ejemplo de NAT, si los servidores de web se encuentran dentro de un bloque de red CIDR, se puede usar la clave source-hash para que las conexiones desde una dirección IP dada se redireccionen siempre al mismo servidor físico de web. Esto es necesario en algunos casos para mantener la información de la sesión mientras se navega por un sitio web.

Balanceo de Carga en Tráfico Saliente

Los pools de dirección 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 un pool de dirección 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 route-to \
   { ($ext_if1 $ext_gw1), ($ext_if2 $ext_gw2) } round-robin \
   from $lan_net to any keep state

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. Los paquetes de respuesta se devolverán a la misma interfaz externa por la que salieron (esto es lo que hacen los ISP), y enrutados de vuelta a la red interna como paquetes normales.

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 route-to ($ext_if2 $ext_gw2) from $ext_if2 \
   to any
pass out on $ext_if2 route-to ($ext_if1 $ext_gw1) from $ext_if1 \
   to any

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

nat on $ext_if1 from $lan_net to any -> ($ext_if1)
nat on $ext_if2 from $lan_net to any -> ($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
nat on $ext_if1 from $lan_net to any -> ($ext_if1)
nat on $ext_if2 from $lan_net to any -> ($ext_if2)

#  denegación predeterminada
block in  from any to any
block out from any to any

#  permitir el paso a todos los paquetes salientes en la interfaz interna
pass out on $int_if from any 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 route-to \
    { ($ext_if1 $ext_gw1), ($ext_if2 $ext_gw2) } round-robin \
    proto tcp from $lan_net to any flags S/SA modulate state
#  balancear la carga del tráfico udp y icmp saliente desde la red interna
pass in on $int_if route-to \
    { ($ext_if1 $ext_gw1), ($ext_if2 $ext_gw2) } round-robin \
    proto { udp, icmp } from $lan_net to any keep state

#  reglas "pass out" genéricas para las interfaces externas
pass out on $ext_if1 proto tcp from any to any flags S/SA modulate state
pass out on $ext_if1 proto { udp, icmp } from any to any keep state
pass out on $ext_if2 proto tcp from any to any flags S/SA modulate state
pass out on $ext_if2 proto { udp, icmp } from any to any keep state

#  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 route-to ($ext_if2 $ext_gw2) from $ext_if2 to any 
pass out on $ext_if2 route-to ($ext_if1 $ext_gw1) from $ext_if1 to any 

[Anterior: Formación de Colas y Prioridades de Paquetes] [Contenido] [Siguiente: Marcado de Paquetes]


[Índice] www@openbsd.org
Originally [OpenBSD: pools.html,v 1.10 ]
$OpenBSD: pools.html,v 1.6 2004/01/04 22:29:12 horacio Exp $
$Translation: pools.html,v 1.6 2004/01/04 21:32:07 horacio Exp $