[FUGSPBR] roteamento por origem

Patrick Tracanelli eksffa em freebsdbrasil.com.br
Qui Ago 5 10:44:10 BRT 2004


> exemplo de uma das maquinas
> 1 - Para os clientes de IP real não vou fazer nada

Isso significa que continuara saindo pela rota padrao, correto?

> 2 - se a origem for 10.1.0.0/16 o default é o link A
> 3 - se a origem for 10.2.0.0/16 o default é o link B

Vamos partir do principio que essa maquina fara NAT? Ou apenas 
encaminhara para o GW do Link A e esse por sua vez se encarrega do NAT?

Note, 2 links, 2 NATD rotando, OK?

natd -f /etc/natd_linkA.conf

No /etc/natd_linkA.conf:

interface <interface_linkA>
same_ports yes
use_sockets yes
punch_fw 00001:99
log_ipfw_denied yes
port 8669

natd -f /etc/natd_linkB.conf

No /etc/natd_linkB.conf:

interface <interface_linkB>
same_ports yes
use_sockets yes
punch_fw 00001:99
log_ipfw_denied yes
port 8668

Note que o daemon do NAT para o Link A esta em uma porta distinta da do 
Link B. Isso se aplicara as regras.

As regras.

...

${fwcmd} add 100 set 1 divert 8669 ip from any to IP_REAL_LOCAL_A in
${fwcmd} add 200 set 1 divert 8669 ip from 10.1.0.0/16 to any out
${fwcmd} add 300 set 1 fwd GATEWAY_A ip from IP_REAL_LOCAL_A to any

${fwcmd} add 400 set 2 divert 8668 ip from any to IP_REAL_LOCAL_B in
${fwcmd} add 500 set 2 divert 8668 ip from 10.2.0.0/16 to any out
${fwcmd} add 600 set 2 fwd GATEWAY_B ip from IP_REAL_LOCAL_B to any

# O restante do seu fireall ou pelo menos (pra testar)
# um allow all from any to any

...

Essas regras podem ser otimizadas definindo de forma explicita as 
interfaces, alem do fluxo (in, out)

Resumindo o segredo da coisa,

1 - Voce tem 2 Links alem do padrao, portanto tera que fazer 2 NAT (1 
por interface).
2 - Voce tem que jogar para o NATD (divert) todos os pacotes vindo de 
qualquer local (voce nao tem como adivinhar) para o seu IP verdadeiro 
(estara destinado ao IP) *ANTES* de qualquer coisa, para o NATD 
verificar se o pacote em questao eh resposta de uma requisicao em sua 
tabela.
3 - Voce tem que jogar para o NATD (divert) todos pacotes cuja origem 
for sua rede falsa para *qualquer* local, com tanto que o pacote esteja 
*saindo* pela interface do link (nao entrando pela interface interna).
Note que, voce soh pode fazer o 3 depois do 2.
4 - Voce tem que fazer proximo-salto, como se fosse um roteador. Vai 
dizer que tudo que for sair da sua maquina com seu IP real do link que 
voce esta tratando, o proximo-salto (next-hop) deve ser o gateway para o 
seu IP.
5 - Voce TEM QUE SABER qual seu IP real no momento do NAT. Ou seja, se 
for dinamico, faca um script que pega o IP na hora de carregar o firewall.

6 - DEVE existir uma rota padrao! Pense que rota padrao vai apenas te 
ajudar. Por exemplo, se voce tem 4 links, soh precisa fazer 
policy-routing para 3. O que vier do quarto voce deixa passar (vai pra 
rota padrao). A rota deve existir NEM que seja falsa, por exemplo 
apontando para um GW que nem esta na rede. Do contrario o ip.forward 
(gateway_enable="YES") nao vai rotear *nada*. Suas regras de firewall 
nao terao o menor efeito.

-----------------------------------------------------------------------

Pra ilustrar, se for uma situacao onde voce nao vai precisar fazer NAT 
na maquina local (por exemplo, policy-routing de IP registrado (IP real) 
ou de IP nao registrado pra nao registrado, basta usar o "fwd" do IPFW.

Por exemplo, temos uma situacao em um cliente que e' empresa de hosting, 
seu webserver tem 3 nics, e os <VirtualHost> sao feitos pelos IPs de 3 
links distintos. O padrao, sai pela rota default, o restante sai assim

${fwcmd} add 50100 set 5 fwd GW_2 ip from IP_2 to not IP_2 out via em1
${fwcmd} add 50200 set 5 fwd GW_3 ip from IP_3 to not IP_3 out via em2

Funciona *perfeito*. Como a maquina nao eh firewall ela soh tem essas 
regras.

Em outra situacao temos em producao balanceamento de carga em um 
ambiente muito parecido com o anterior. Como balancear a carga? Nehum 
segredo obscuro nao documentado, nada que o IPFW nao tenha e nao seja de 
conhecimento de todos...

# ipfw -S sh 5100
05100        842030        197749819 set 5 prob 0.500000 fwd 200.X.Y.Z 
ip from 200.X.Y.K to not 200.X.Y.K out via em0 keep-state

Omiti o IP por motivos obvios (ja que eh de producao hehe). A unica 
diferenca ai eh nosso amigo prob (probability match) que eh de 50%, ou 
seja metade do que sai eh atendido por esse gateway, a outra metade ou 
sai pela rota padrao ou por outra regra de fwd. keep-state esta ai pra 
nao matar sessoes.

Enfim..

O fato e' que policy-routing funciona e muito bem no FreeBSD. Talvez nao 
seja a coisa mais obvia do mundo implementar. Mas funciona e usamos isso 
com certa frequencia. Qualquer duvida mais especifica Eugenio, voce tem 
nosso telefone :D hehe

Mais uma nota, isso se chama policy-routing; source-routing por 
definicao eh outra coisa, que obviamente o FreeBSD tambem suporte; e´ 
controlada pelas seguintes variaveis sysct(8):

(eksffa em code-veronica)~> sysctl -d net.inet.ip.sourceroute 
net.inet.ip.accept_sourceroute
net.inet.ip.sourceroute: Enable forwarding source routed IP packets
net.inet.ip.accept_sourceroute: Enable accepting source routed IP packets

-- 
Atenciosamente,

Patrick Tracanelli

FreeBSD Brasil LTDA.
The FreeBSD pt_BR Documentation Project
http://www.freebsdbrasil.com.br
patrick @ freebsdbrasil.com.br
"Long live Hanin Elias, Kim Deal!"

_______________________________________________________________
Para enviar um novo email para a lista: fugspbr em fugspbr.org
Sair da Lista: http://lists.fugspbr.org/listinfo.cgi
Historico: http://www4.fugspbr.org/lista/html/FUG-BR/



Mais detalhes sobre a lista de discussão freebsd