[OpenBSD]

[Anterior: Enfileiramento de Pacotes e Priorização] [Conteúdo] [Próximo: Marcação de Pacotes]

PF: Grupos de Endereços e Balanceamento de Carga


Conteúdo


Introdução

Um grupo de endereços é como um estoque de dois ou mais endereços que têm seu uso compartilhado entre um grupo de usuários. Um grupo de endereços pode ser especificado como endereços de destino nas opções para regras nat-to, rdr-to, route-to, reply-to e dup-to.

Existem quatro métodos de uso de grupos de endereços:

Exceto para o método round-robin, o grupo de endereços deve ser especificado em notação CIDR ("Classless Inter-Domain Routing"). O método round-robin aceita múltiplos endereços individuais usando-se uma lista ou tabela.

A opção sticky-address pode ser usada com os tipos de grupo random e round-robin para se certificar de que um endereço de origem em particular seja sempre mapeado para o mesmo endereço de redirecionamento.

Grupos de Endereços NAT

Um grupo de endereços pode ser usado como endereço de tradução em regras nat-to. As conexões terão seus endereços de origem traduzidos para um endereço no grupo baseando-se no método escolhido. Isso pode ser útil em situações onde o PF faz NAT para uma rede muito grande. Como o número de conexões "NATeadas" por endereço de tradução é limitado, adicionar mais endereços de tradução para a tradução fornece poder de escalabilidade ao gateway NAT para servir um grande número de usuários.

Neste exemplo, um grupo de dois endereços está sendo usado para traduzir pacotes que saem da rede. Para cada conexão o PF alterna entre os endereços utilizando o método round robin.

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

Uma desvantagem desse método é que conexões sucessivas do mesmo endereço interno não serão sempre traduzidas para o mesmo endereço de tradução. Isso pode causar interferência, por exemplo, ao navegar em sítios Web que registram sessões de usuários baseando-se no endereço IP. Um método alternativo é usar o método source-hash para que cada endereço interno seja sempre traduzido para o mesmo endereço de tradução. Para que isso seja possível, o grupo de endereços deve ser um bloco de rede CIDR.

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

Essa regra usa o grupo de endereços 192.0.2.4/31 (192.0.2.4 - 192.0.2.5) como seu endereço de tradução para pacotes saindo da rede. Cada endereço interno será sempre traduzido para o mesmo endereço de tradução por causa da palavra-chave source-hash.

Balanceamento de Conexões de Entrada

Grupos de endereços também podem ser usados para balancear conexões de entrada. Por exemplo, pedidos de conexões para um servidor Web podem ser distribuídos entre vários servidores.
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

Conexões sucessivas serão redirecionadas para os servidores Web usando o método round robin, com conexões da mesma origem sendo enviadas ao mesmo servidor Web. Essa "conexão fixa" existirá enquanto existirem estados na tabela de estados que referenciem essa conexão. Uma vez que os estados expiram, expira também a conexão fixa. As demais conexões originadas daquela máquina serão redirecionadas para o próximo servidor Web no método round robin.

Balanceamento de Tráfego de Saída

Grupos de endereços podem ser usados em combinação com a opção de filtragem route-to para balancear tráfego entre duas ou mais conexões com a Internet quando um protocolo apropriado de rota multicaminhos (como o BGP4) não está disponível. Ao usar route-to com um grupo de endereços round-robin, conexões de saída podem ser distribuídas até mesmo entre múltiplos caminhos de saída.

Outra informação necessária é o endereço IP do roteador adjacente em cada conexão com a Internet. Esse endereço é informado na opção route-to para controlar o destino dos pacotes de saída.

O exemplo a seguir balanceia o tráfego de saída entre duas conexões com a 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

A opção route-to é utilizada no tráfego chegando/entrando (in) na interface interna para especificar as interfaces de saída entre as quais será balanceado o tráfego, bem como seus respectivos gateways. Note que a opção route-to deve estar presente em cada regras de filtragem cujo tráfego esteja sendo balanceado (essa opção não pode ser usada com regras do tipo match).

Para ter certeza de que pacotes com endereço de origem pertencentes a $ext_if1 são sempre roteados para $ext_gw1 (e da mesma forma para $ext_if2 e $ext_gw2), as duas regras a seguir devem ser inseridas no conjunto de regras:

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, NAT pode ser usada em cada interface de saída:

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

Um exemplo completo que faz o balanceamento de tráfego de saída deve ficar mais ou menos assim:

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"

# nat em conexões de saída para cada interface 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)

# Nega por padrão
block in
block out

# Passa todo o tráfego de saída na interface interna
pass out on $int_if to $lan_net
# Aceita e passa direto quaisquer pacotes destinados ao próprio gateway
pass in quick on $int_if from $lan_net to $int_if
# Balanceamento do tráfego de saída partindo da rede interna.
pass in on $int_if from $lan_net \
    route-to { ($ext_if1 $ext_gw1), ($ext_if2 $ext_gw2) } \
    round-robin
# Manter tráfego HTTPS por apenas umas das conexões de saída para Internet;
#  algumas aplicações "mais seguras" não permitem alteração das sessões HTTPS
pass in on $int_if proto tcp from $lan_net to port https \
    route-to ($ext_if1 $ext_gw1)

# Regras gerais de permissão de tráfego de saída para as
# interfaces externas
pass out on $ext_if1
pass out on $ext_if2

# Roteia pacotes de quaisquer IPs na $ext_if1 para $ext_gw1, e faz
# o mesmo para $ext_if2 e $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: Enfileiramento de Pacotes e Priorização] [Conteúdo] [Próximo: Marcação de Pacotes]


[voltar] www@openbsd.org
$OpenBSD: pools.html,v 1.15 2013/01/18 07:15:55 ajacoutot Exp $