[OpenBSD]

[Anterior: Fila 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 tem seu uso compartilhado entre os usuários. Pode ser usado como endereço de redirecionamento em regras rdr, em traduções de endereçamento em regras nat e como alvo de regras de filtragem com opções route-to, reply-to e dup-to.

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

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

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

Grupos de Endereços NAT

Um grupo de endereços pode ser usado como endereços de tradução em regras nat. As conexões terão seus endereços de origem traduzidos para um endereço no grupo baseado no método escolhido. Isto 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 válido é limitado, adicionando mais endereços válidos para tradução fornece ao gateway NAT poder de escalabilidade para servir a 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.

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

Uma desvantagem com este método é que conexões sucessivas vindas do mesmo endereço interno não serão sempre traduzidas para o mesmo endereço. Isto pode causar interferência, por exemplo, ao navegar sites web que registram logins de usuário baseado no endereço IP. Um método alternativo é usar source-hash para que cada endereço interno seja sempre traduzido no mesmo endereço. Para que isso seja possível o grupo de endereços deve estar em notação CIDR.

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

Esta regra nat usa a faixa de endereçamento 192.0.2.4/31 (192.0.2.4 - 192.0.2.5) como seus endereços de tradução para pacotes saindo da rede. Cada endereço interno será sempre traduzido para o mesmo endereço, conseguimos isso fazendo uso da palavra-chave source-hash.

Balanceamento de Conexões Entrantes

Grupos de endereçoes também podem ser usados para balancear conexões entrantes. 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 }"

rdr on $ext_if proto tcp from any to any port 80 -> $web_servers \
    round-robin sticky-address

Conexões sucessivas serão redirecionadas para os servidores web alternadamente usando método round-robin com conexões com mesmo endereço de origem sendo redirecionadas ao mesmo servidor web. Esta "conexão fixa" (sticky) existirá enquanto existirem estados na tabela que referenciem esta conexão. Uma vez expirado o estado, expirará também a "conexão fixa". As demais conexões originadas deste host serão redirecionadas para o próximo servidor web na sequência round robin.

Balanceando 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 Internet quando um protocolo de multi-path apropriado (como BGP4) não está disponível. Usando route-to com o método round-robin, conexões com destino externo 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 de saída do pacote.

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 route-to \
   { ($ext_if1 $ext_gw1), ($ext_if2 $ext_gw2) } round-robin \
   from $lan_net to any keep state

A oção route-to é utilizada no tráfego 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 regra de filtragem que o tráfego deva ser balanceado. Pacotes de retorno serão roteados de volta na mesma interface externa em que eles saíram (isto é feito pelos ISPs) e retornará para a rede interna normalmente.

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:

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

nat on $ext_if1 from $lan_net to any -> ($ext_if1)
nat on $ext_if2 from $lan_net to any -> ($ext_if2)

Um exemplo completo que balanceia tráfego de saída deve ficar 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" # faz nat em ambas as interfaces da internet nat on $ext_if1 from $lan_net to any -> ($ext_if1) nat on $ext_if2 from $lan_net to any -> ($ext_if2) # default deny block in from any to any block out from any to any # passa todo tráfego de saída na interface interna pass out on $int_if from any to $lan_net # aceita (quick) quaisquer pacotes destinados ao próprio gateway pass in quick on $int_if from $lan_net to $int_if # faz balanceamento de carga no tráfego da rede 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 # balanceamento de carga em pacotes udp e icmp vindos da rede 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 # regras gerais "pass out" para as 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 # roteia pacotes de qualquer IP na $ext_if1 para $ext_gw1 e o mesmo para # $ext_if2 e $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: Fila de Pacotes e Priorização] [Conteúdo] [Próximo: Marcação de Pacotes]


[voltar] www@openbsd.org
$OpenBSD: pools.html,v 1.10 2007/12/16 17:18:35 tobias Exp $