[Anterior: Enfileiramento de Pacotes e Priorização] [Conteúdo] [Próximo: Marcação de Pacotes]
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.
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 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.
nat on $ext_if inet from any to any -> 192.0.2.4/31 source-hash
Essa regra nat 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.
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 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.
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 route-to \
{ ($ext_if1 $ext_gw1), ($ext_if2 $ext_gw2) } round-robin \
from $lan_net to any keep state
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 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 (isso é feito pelos ISPs) e será roteado de volta 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 no conjunto de regras:
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 usada 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 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"
# Faz nat em conexões de saída, 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)
# Nega por padrão
block in from any to any
block out from any to any
# Passa todo o tráfego de saída na interface interna
pass out on $int_if from any 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
# Faz balanceamento de carga no tráfego TCP de saída 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 tráfego udp e icmp vindo 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 de permissão de tráfego de saída 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 quaisquer IPs na $ext_if1 para $ext_gw1, e faz
# 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: Enfileiramento de Pacotes e Priorização] [Conteúdo] [Próximo: Marcação de Pacotes]