[FUG-BR] Dúvida Natd (fluxo de pacotes pelo ipfw)
Rodolfo Zappa
listas-rod em zappa.eti.br
Segunda Agosto 27 13:50:40 BRT 2007
Luiz Otavio Souza escreveu:
> Rodolfo Zappa escreveu:
>
>> (...)
>>
>> Ok, mas o pacote é reavaliado desde o início das regras, ou a partir do
>> ponto do divert?
>>
>> O problema que eu tenho é o seguinte: eu quero bloquear ou liberar
>> pacotes da minha lan para a internet, baseados no ip de origem. Mas,
>> após passar pelo natd, o pacote perde a referência do ip de origem, e a
>> terceira regra abaixo, nunca é acionada.
>>
>> ${ipfw} 100 divert natd ip from any to any via ${ext_if}
>> ${ipfw} 101 chek-state
>> ${ipfw} 102 allow tcp from 192.168.0.25 to any 80 out via ${ext_if}
>>
>> Estou estudando o IPFW, acho a sintaxe maravilhosa e simples, os
>> controles de banda facílimos de aprender, mas o fluxo do pacote pelo
>> firewall, quando tem um divert para o natd, são muito mal documentados
>> e completamente diferentes do PF, IPF e até do IPTABLES do netfilter.
>>
>> Por exemplo, no netfilter o fluxo é assim (simplificando):
>>
>> nat prerouting --> forward --> nat postrouting
>>
>> e quando eu quero liberar ou bloquear um pacote, baseado na origem, uso
>> a chain forward, que memso depois de pasara pelo nat, não perde a
>> referência do ip de origem.
>>
>> Alguém tem um bom doc sobre ipfw + natd, mostrando o fluxo dos pacotes
>> pelo firewall?
>>
>> Patrick, pode dar uma mãozinha de novo?
>>
>>
>>
> Rodolfo,
>
> Os são pacotes enviados para o natd através do divert no ipfw e voltam
> (do natd para o ipfw) na mesma regra, o processamento continua a partir
> da linha do natd.
>
> Mas seu problema é que você esta procurando pelo pacote depois que ele
> já foi nateado e ai realmente você perde a referencia ao IP interno.
>
> É só fazer a regra utilizando a interface interna e não a externa.
>
> O fluxo do ipfw (com duas placas e pacotes passando da rede interna para
> a rede externa) é o seguinte: in via intif -> out via intif -> in via
> outif -> out via outif.
>
> Já o fluxo do natd é o seguinte:
>
> - O IP de origem é substituido apenas em pacotes que estão saindo pela
> interface (out via outif) e é criado um estado para essa "tradução".
>
> - Já os pacotes chegando na interface (in via outif) são verificados
> contra a tabela de estados do natd e caso seja identificado como um
> pacote traduzido ele é nateado de volta (o IP de destino dessa vez é
> alterado para o IP interno utilizando as informações salvas na tabela de
> estado).
>
> Ou seja, para o natd funcionar são necessárias duas linhas:
>
> # ipfw add divert natd ip from 192.168.0.0/24 to any out via bge0 # =>
> faz o nat de saída
> # ipfw add divert natd ip from any to 200.200.200.200 in via bge0 # =>
> faz o nat do retorno
>
> Considerando que sua rede interna seja 192.168.0.0/24 e o IP do seu
> servidor seja 200.200.200.200.
>
> Como nem sempre o servidor tem IP fixo, a maioria dos exemplo simplifica
> essas duas regras em uma única (como nos exemplos em /etc/rc.firewall),
> mas isso normalmente acaba passando mais trafego do que o preciso pelo
> natd (o trafego que não precisa ser nateado é ignorado, mas consome
> alguns recursos extras, já que o natd roda no espaço usuário e os
> pacotes precisam ser copiados do kernel para o natd e depois reinjetados
> pelo natd através de outra copia no sentido inverso).
>
> []s
> Luiz
> PS: Regras check-state e stablished após o natd são potencialmente
> "perigosas", elas passam os pacotes baseados no estado de cada conexão e
> podem confundir bastante. Faça todo trabalho sujo (fwd por exemplo) logo
> depois do natd para evitar problemas.
> -------------------------
> Histórico: http://www.fug.com.br/historico/html/freebsd/
> Sair da lista: https://www.fug.com.br/mailman/listinfo/freebsd
>
> !DSPAM:8,46d19726816441013332718!
>
>
>
Luiz,
Muito grato pela informação!!!
Mas gostaria também de ler mais sobre o assunto. Neste aspecto em
particular, o handbook é bem fraco. Já vi o ipfw-howto e o ipfw-advanced
howto, e eles se atém muito a sintaxe, em vez da lógica do firewall
(como o fluxo).
Além disso, muito pouca documentação sobre ipfw + natd, ambas
documentações tratam deles em separado, ou em ambientes pobres, para
exemplos.
Até hoje não consegui formar uma opinião, sobre a viabilidade do uso do
natd para ambientes grandes (mais de 300 usuários simultâneos), se ele
comporta (obviamente, num mesmo hardware que hoje tem o pf).
Apesar do pf estar atendendo, tenho cogitado mudar para o ipfw, por
conta do maior controle de pacotes e traffic shapping do ipfw, mas o
natd é de tirar o sono.
Pelo menos pra mim, as regras com natd não são tão claras quanto as
regras do nat com o pf.
A propósito, alguém na lista comentou que o ipfw no freebsd 7 vem com
nat builtin no kernel. É verdade? Faz sentido?
--
Cordialmente,
Rodolfo Zappa
Archive TSP - Total Solution Provider
Nosso negócio é garantir que a sua rede de informações não pare!
(21) 2567-1842
rodolfo em archive.com.br
http://www.archive.com.br
"Se a gente se lança sem vigor, sete de dez ações tomadas não dão certo. É extremamente difícil tomar decisões num estado de agitação. Por outro lado, se sem se preocupar com as conseqüências menores, abordamos os problemas com o espírito afiado como uma lâmina, sempre encontramos a solução em menos tempo do que é necessáio para respirar sete vezes." Nabeshima Naoshige (1538-1618)
Mais detalhes sobre a lista de discussão freebsd