[GTER] Patch para guardar dados de NAT no PF do FreeBSD 10.2-RELEASE

Raimundo Santos raitech at gmail.com
Thu May 19 14:06:52 -03 2016


Olá, pessoas!

Eis o patch que comentei estar no forno. Saiu! Pra pequenos - talvez
pequenos-médios - isso pode ajudar. No mais, valeu cada segundo de
aprendizado.

https://gist.github.com/raitech/4150c8767d8f1f8642ccd9d44c4c57c6

Já está em operação no provedor para o qual prestava serviços há algumas
semanas.

O PF exporta informações no formato PCAP, aquele que o tcpdump é capaz de
ler via BPF. Pra que tudo dê certo, ele usa o Link Type do PCAP pra dizer
que é um quadro do PF e não um quadro Ethernet comum, então o que sobra é o
datagrama IP, que é exatamente o alvo do trabalho do PF.

Alterei os headers dentro do kernel para guardar as informações que antes
não o eram, a saber, os dados de origem não traduzidos. Isso implicou em
alterar um pouco do código do PF em si também pra guardar nas estruturas
esses dados. Ainda em código do kernel, alterei a interface pflog para
exportar corretamente os novos dados.

Depois o trabalho foi fazer o pflogd saber da alteração, assim como o
tcpdump. Dessa forma, ninguém precisa desenvolver um leitor do novo formato
que a pflog vai retornar, um

tcpdump -ner /var/log/pflog

já deve ser suficiente.

Mas há de se ter um cuidado extra: como o snaplen (tamanho da captura que
um aplicatico que escreve PCAP vai guardar) padrão do pflogd (160 bytes), o
que teremos é: headers do "frame" pflog, o header IP inteiro e parte do
TCP/UDP; ou seja: todo o trabalho de não guardar as informações de destino,
em conformidade com o Marco Civil da Internet, é perdido.

Então, na hora de configurar o novo pflogd no rc.conf:

pflogd_flags="-s 104"

Assim ele só guarda o "frame" do pflog, contendo as informações de origem
antes e depois da tradução. Porém, se for para debug, é interessante poder
colocar qualquer snaplen e ter um snaplen padrão que abarque não só o caso
de log previsto (ou sugerido) no MCI.


---Para aplicar o patch:

. Prepare um ambiente de testes! NÃO EXECUTE ABSOLUTAMENTE NADA, EM
PRODUÇÃO, QUE VOCÊ NÃO TENHA TESTADO ANTES!

. Obtenha o código fonte do FreeBSD 10.2-RELEASE da maneira que preferir.
. Obtenha o patch do Gist no link do Github que está no começo dessa
mensagem.
. Vá ao diretório onde foi parar o código fonte (usualmente: /usr/src) e
execute

patch -Nup 1 < /caminho/pro/arquivo_do_patch.patch

. Depois (observe qualquer especificidade do seu kernel! Essa é uma forma
bem genérica de fazer)

make buildworld && make installworld && buildkernel && installkernel

Feito isso, reinicie e configure seu PF como lhe aprouver. Não esqueça que:

. a primeira regra com log que pegar um pacote é a que vale, mesmo que não
seja a que gerou a decisão/ação do PF.

. regras de NAT só valem no direção de entrada de pacotes, são checadas
depois de BINAT e levam um pacote já traduzido para a parte de filtro de
fato do PF.

Se alguém puder testar, mesmo que pra escrutínio do meu trabalho, ficarei
imensamente grato!

Notas:

. Por não ter banda suficiente disponível durante meu processo de análise e
codificação, usei o src.txz disponível na mídia pela qual instalei o
sistema. Isso é perigoso, pois posso ter regredido em alguns patches
importantes desde a última atualização do sistema. Procure atualiazar o
sistema já tendo um /usr/src preenchido ou obter a versão mais nova do
código fonte, assim, de quebra, terá patches pro sistema compilados e
instalados. (Não sei dizer se esse código mais novo vem do 10.2-STABLE.)

. Apesar de estar em produção em um ambiente, não tenho como garantir
absolutamente nada da operação no seu ambiente.

. "Por quê não usar método XYZ ao invés de ter esse trabalhão?" - a
liberdade a mim conferida não permitiu :P

. Tive o cuidado de invadir o código do PF o mínimo que consegui, pensando
um pouco em performance.

. Esse é meu primeiro grande patch, portanto reitero: ficarei imensamente
grato com feedbacks!

[]s
Raimundo Santos



More information about the gter mailing list