Por: @jonasc
Publicado em: 2021-01-27

Inspeção de Pacotes Com nDPI

O nDPI é uma biblioteca open source (licença LGPLv3) para inspeção profunda de pacotes (ou deep-packet inspection), mantida pela NTOP. Seu valor está na capacidade de analisar o payload do pacote, ou seja, o dado/conteúdo em si que está sendo transportado. Enquanto um firewall stateful analisa superficialmente o cabeçalho de transporte para identificar o protocolo com base na porta utilizada, o nDPI detecta protocolos e serviços através da camada de aplicação. Isso significa, que ele é capaz de identificar um tráfego HTTP em uma porta 5722, por exemplo, e ao mesmo tempo detectar a aplicação Skype na porta 80, diferenciando da navegação web padrão. Atualmente detecta mais de 200 tipos de protocolos e aplicações, além de permitir criar regras personalizadas para inspeção.

Neste laboratório será documentado a implentação pura da biblioteca nDPI fornecida pela NTOP.

Topologia

Topologia de rede padrão com FWFLEX sobre CentOS 8.

Pacotes necessários

  • Necessário suporte a ferramentas de desenvolvedor para compilação do software.
  • Necessário repositórios EPEL, remi e powertools ativos.
yum groupinstall "Development tools"
yum install automake libpcap-devel gcc-c++ libtool
yum install epel-release
rpm -ivh http://rpms.remirepo.net/enterprise/remi-release-8.rpm
dnf config-manager --set-enabled powertools
dnf config-manager --set-enabled remi

Instalação

O nDPI já vem incluso na instalação padrão do ntop e do nProbe, mas é possível instalar apenas a biblioteca nDPI. Será descrito como instalar os binários via repositório RPM para o CentOS e também como compilar o código fonte (este segundo, necessário para apresentar a ferramenta de demo ndpiReader).

Instalação via repo:

yum update
yum install pfring-dkms n2disk nprobe ntopng cento pfring-drivers-zc-dkms

Instalação via compilação:

cd /usr/src/
git clone https://github.com/ntop/nDPI.git
cd nDPI/
yum install json-c json-c-devel
./autogen.sh 
./configure
make
cd example/
make

Testes

Ferramenta de demonstração:

[root@localhost nDPI]# ndpiReader -i ens18 -s 20

-----------------------------------------------------------
* NOTE: This is demo app to show *some* nDPI features.
* In this demo we have implemented only some basic features
* just to show you what you can do with the library. Feel 
* free to extend it and send us the patches for inclusion
------------------------------------------------------------

Using nDPI (3.4.0-2818-75898a4f) [1 thread(s)]
Using libgcrypt version 1.8.5
Capturing live traffic from device ens18...
Capturing traffic up to 20 seconds
Running thread 0...
Error while reading pcap file: ''

nDPI Memory statistics:
	nDPI Memory (once):      223.89 KB    
	Flow Memory (per flow):  2.21 KB      
	Actual Memory:           3.75 MB      
	Peak Memory:             3.75 MB      
	Setup Time:              24 msec
	Packet Processing Time:  20149 msec

Traffic statistics:
	Ethernet bytes:        21034         (includes ethernet CRC/IFC/trailer)
	Discarded bytes:       2280         
	IP packets:            174           of 212 packets total
	IP bytes:              16858         (avg pkt size 79 bytes)
	Unique flows:          7            
	TCP Packets:           160          
	UDP Packets:           10           
	VLAN Packets:          0            
	MPLS Packets:          0            
	PPPoE Packets:         0            
	Fragmented Packets:    0            
	Max Packet size:       220          
	Packet Len < 64:       68           
	Packet Len 64-128:     99           
	Packet Len 128-256:    7            
	Packet Len 256-1024:   0            
	Packet Len 1024-1500:  0            
	Packet Len > 1500:     0            
	nDPI throughput:       8.64 pps / 8.16 Kb/sec
	Analysis begin:        27/Jan/2021 19:08:56
	Analysis end:          27/Jan/2021 19:09:16
	Traffic throughput:    8.64 pps / 8.16 Kb/sec
	Traffic duration:      20.150 sec
	Guessed flow protos:   0            


Detected protocols:
	DNS                  packets: 6             bytes: 800           flows: 2            
	SSH                  packets: 152           bytes: 14776         flows: 2            
	YouTube              packets: 4             bytes: 328           flows: 1            
	Google               packets: 4             bytes: 392           flows: 1            
	Amazon               packets: 8             bytes: 562           flows: 1            


Protocol statistics:
	Acceptable                   16138 bytes
	Fun                            328 bytes
	Unrated                        392 bytes

Na demonstração acima, já foi possível observar a eficácia da feramenta, que detectou os acessos de DNS, SSH, YouTube, Google e Amazon.

Resultados

Para análise passiva de fluxos, a ferramenta pura pode ser interessante. Uma alternativa, é usá-la em conjunto ao NTOP e suas APIs, para consultar informações dos fluxos de rede. Porém, para usar de forma ativa, criando bloqueios de firewall junto ao produto FWFLEX, não é uma alternativa viável.

Para o uso ativo do nDPI, será avaliado outras ferramentas como o Netify Agent e o Netify Firewall Agent.