linux_netfilter-logo-120x120

Há poucas horas, disponibilizei uma atualização do projeto ndpi-netfilter, integrando com a versão mais recente da biblioteca nDPI. A atualização é recomendada porque correções críticas foram aplicadas e há inclusão de novos protocolos também.

Na detecção do protocolo SSL, por exemplo, o sistema estava sujeito a falhas de buffer-overflow. Como o ndpi-netfilter é módulo de kernel, esta falha congelava o sistema. Novos protocolos foram adicionados, como é o caso do OpenVpn, Teredo, DRDA, Git e Hotmail. Já os protocolos MSSQL e TDS foram unificados como MSSQL_TDS. Houve remoção também. Os protocolos envolvendo serviços da Tim e Globo foram removidos. Sinceramente, não entendo como foi que aceitaram a inclusão destes serviços anteriormente (não faz muito sentido).

Basicamente, existem duas variações do ndpi-netfilter circulando na Internet. A versão que mantenho é um fork do projeto de Ed Wildgoose (descontinuado). Mas, o código que serviu como base para todos os demais foi escrito por Elian Gidoni (opendpi-netfilter). O outro fork mais conhecido é um projeto mantido por Vitaly Lavrov, que aplicou ajustes mais significativos e incluiu o suporte ao IPv6.

Como tudo começou?

O código original controlava os fluxos de conexão (ndpi) “monitorando” as atualizações de “eventos da tabela de estados (conntrack)” – para remover o mapeamento de uma conexão que expirou na tabela de estados, por exemplo. Com o passar do tempo, os mantenedores do Kernel decidiram que o acesso aos eventos do conntrack seria único e exclusivo, autorizando apenas uma única chamada de sistema. Infelizmente, isto gerou um problema para o módulo xt_ndpi, que realizava uma segunda chamada. Por esta razão, foi desenvolvido um patch de kernel que permitia duas chamadas de sistema simultaneamente. O desenvolvedor (Ed Wildgoose) questionou os mantenedores, mas a limitação foi mantida, com a justificativa de que não existia razão técnica, visto que nenhuma outra extensão dependia disto. É complicado mesmo (risos). De qualquer forma, uma alternativa era remover da memória o módulo nf_conntrack_netlink, mas outros recursos de firewall eram afetados. Não demorou muito e o Ed Wildgoose deixou de dar suporte ao projeto. A partir daí surgiram duas variações do projeto: uma mantida por mim e outra por Vitaly Lavrov.

Comecei o fork com o objetivo de permitir a compatibilidade de compilação em distribuições mais novas. Como o projeto principal havia sido descontinuado, as correções para integração com as novas APIs do nDPI precisavam ser aplicadas manualmente – as mudanças eram rápidas e frequentes. Fatalmente, um administrador que não conhece programação, em linguagem C, dificilmente consegue ajustar o código. Foi aí que resolvi ajudar. Mas, com o passar do tempo, fiquei incomodado em ter que lidar com os patchs de kernel ou indicar a gambiarra da remoção do módulo nf_conntrack_netlink, antes de carregar o xt_ndpi. Sendo assim, fiz algumas otimizações na leitura das listas encadeadas (fluxos de conexão) e implementei um garbage collector, dispensando os patchs de kernel.

O código do nDPI apresentava, nativamente, suporte de kernel até pouco tempo. Porém, o responsável pelo projeto, chamado Luca Deri, solicitou que fizéssemos um “merge” do ndpi-netfilter para a árvore principal do nDPI. O problema é que eu mantive a essência do código de Ed Wildgoose e o Vitaly Lavrov incluiu rotinas que eu não gostaria de embutir (como a marcação de pacotes via xt_ndpi), apesar de apresentar vantagens como o suporte ao IPv6. Como não nos manifestamos, o Luca Deri decidiu remover do código o tratamento para chamadas de kernel. E também justificou que o ideal seria tratar isto em espaço de usuário (algo que concordo). Por este motivo, as atualizações do ndpi-netfilter ficaram mais trabalhosas!

Se houver interesse em contribuir, qualquer ajuda é sempre bem vinda. 😉

O link para download do projeto ndpi-netfilter é este:
https://github.com/betolj/ndpi-netfilter