Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Referència de filtres BPF

Les expressions BPF (Berkeley Packet Filter) indiquen al nucli quins paquets ha de transmetre a lippycat i quins ha de descartar. El filtratge es fa abans que els paquets arribin a l’espai d’usuari, de manera que un filtre BPF ben triat és la manera individual més efectiva de reduir la càrrega de CPU i evitar descarts de paquets en enllaços ocupats. lippycat utilitza la sintaxi BPF estàndard de libpcap, el mateix llenguatge que accepten tcpdump, tshark i Wireshark, mitjançant l’indicador --filter / -f en totes les ordres de captura (sniff, hunt, tap).

Referència ràpida de sintaxi BPF

Una expressió BPF es construeix amb primitives unides per operadors.

Primitives

Una primitiva consisteix en un qualificador opcional seguit d’un valor:

QualificadorSignificatExemple
hostCoincidència amb una adreça IPhost 10.0.1.5
netCoincidència amb una subxarxa (CIDR)net 10.0.1.0/24
portCoincidència amb un número de portport 5060
portrangeCoincidència amb un interval de portsportrange 10000-32768
protoCoincidència amb un número de protocolproto 17 (UDP)

Qualificadors de direcció

Els qualificadors de direcció restringeixen les coincidències a l’origen o la destinació:

QualificadorSignificatExemple
srcNomés origensrc host 10.0.1.5
dstNomés destinaciódst port 443
src or dstQualsevol dels dos (per defecte)host 10.0.1.5
src and dstTots dossrc and dst net 10.0.0.0/8

Qualificadors de protocol

QualificadorDescripció
tcpSegments TCP
udpDatagrames UDP
icmpMissatges ICMP
icmp6Missatges ICMPv6
arpPaquets ARP
ipPaquets IPv4
ip6Paquets IPv6
etherTrames Ethernet
vlanTrames amb etiqueta VLAN (802.1Q)

Operadors

OperadorÀliesSignificat
and&&Totes dues condicions han de coincidir
or||Una de les dues condicions ha de coincidir
not!Nega una condició
()—Agrupa subexpressions

Expressions bàsiques

Una sola primitiva:

udp port 5060

Combinades amb and:

host 10.0.1.5 and udp port 5060

Combinades amb or:

tcp port 80 or tcp port 443

Negació:

not host 10.0.1.254

Subexpressions agrupades:

host 10.0.1.5 and (tcp port 80 or tcp port 443)

Cometes de l’intèrpret d’ordres: poseu sempre el filtre entre cometes dobles quan el passeu a -f perquè l’intèrpret no interpreti els parèntesis ni els caràcters especials:

sudo lc sniff -i eth0 -f "host 10.0.1.5 and (tcp port 80 or tcp port 443)"

Patrons habituals de filtre

Captura VoIP

El trànsit VoIP consisteix en senyalització SIP (normalment al port UDP 5060) i fluxos de mitjans RTP (en ports UDP de numeració alta). Capturar tots dos requereix un filtre que cobreixi el port de senyalització i l’interval de mitjans esperat.

Només senyalització SIP:

sudo lc sniff voip -i eth0 -f "udp port 5060"

SIP + RTP (interval habitual de ports de mitjans):

sudo lc sniff voip -i eth0 -f "udp port 5060 or udp portrange 10000-32768"

SIP en un port no estàndard:

sudo lc sniff voip -i eth0 -f "udp port 5080"

SIP d’una centraleta PBX específica:

sudo lc sniff voip -i eth0 -f "host 10.0.1.100 and udp port 5060"

Múltiples ports SIP (disjunció):

sudo lc sniff voip -i eth0 -f "udp port 5060 or udp port 5061 or udp port 5080"

L’indicador de conveniència --sip-port genera filtres de ports optimitzats sense BPF manual:

Equivalent al filtre multiport anterior, però més clar:

sudo lc sniff voip -i eth0 --sip-port 5060,5061,5080

Per a VoIP, preferiu restriccions explícites de ports SIP i RTP. Això restringeix el trànsit al nucli i encara permet SIP sobre TCP:

sudo lc sniff voip -i eth0 --sip-port 5060 --rtp-port-range 10000-20000

L’antic indicador VoIP --udp-only encara s’accepta per compatibilitat, però està ocult i obsolet perquè pot perdre trànsit SIP TCP.

Anàlisi de DNS

DNS estàndard (port 53):

sudo lc sniff dns -i eth0 -f "udp port 53"

Inclou mDNS:

sudo lc sniff dns -i eth0 -f "udp port 53 or udp port 5353"

Respostes d’un resolutor específic:

sudo lc sniff dns -i eth0 -f "src host 8.8.8.8 and udp port 53"

DNS sobre TCP (transferències de zona, respostes grans):

sudo lc sniff dns -i eth0 -f "port 53"

O utilitzeu l’indicador de conveniència:

sudo lc sniff dns -i eth0 --dns-port 53,5353

TLS / HTTPS

Només HTTPS:

sudo lc sniff tls -i eth0 -f "tcp port 443"

Múltiples serveis TLS:

sudo lc sniff tls -i eth0 -f "tcp port 443 or tcp port 8443 or tcp port 993"

Negociacions TLS amb un servidor específic:

sudo lc sniff tls -i eth0 -f "dst host 10.0.1.50 and tcp port 443"

O bé:

sudo lc sniff tls -i eth0 --tls-port 443,8443,993

HTTP

Ports HTTP estàndard:

sudo lc sniff http -i eth0 -f "tcp port 80 or tcp port 8080"

HTTP amb un servidor de desenvolupament:

sudo lc sniff http -i eth0 -f "dst host 10.0.1.10 and tcp port 3000"

O bé:

sudo lc sniff http -i eth0 --http-port 80,8080,3000

Anàlisi de xarxa

Tot el trànsit d’una subxarxa:

sudo lc sniff -i eth0 -f "net 10.0.1.0/24"

Trànsit entre dos amfitrions:

sudo lc sniff -i eth0 -f "host 10.0.1.1 and host 10.0.1.2"

Exclou trànsit de gestió:

sudo lc sniff -i eth0 -f "not host 10.0.1.254"

Exclou SSH (útil quan es captura per SSH):

sudo lc sniff -i eth0 -f "not tcp port 22"

Adreça MAC específica:

sudo lc sniff -i eth0 -f "ether host aa:bb:cc:dd:ee:ff"

Trànsit SIP amb etiqueta VLAN:

sudo lc sniff voip -i eth0 -f "vlan and udp port 5060"

Només trànsit IPv6:

sudo lc sniff -i eth0 -f "ip6"

ICMP (ping, traceroute):

sudo lc sniff -i eth0 -f "icmp"

Peticions ARP:

sudo lc sniff -i eth0 -f "arp"

Captura distribuïda

En desplegaments distribuïts, els filtres BPF s’apliquen als nodes Hunter de la perifèria. Això redueix el volum de trànsit transmès al processador per gRPC.

Node Hunter amb filtre BPF:

sudo lc hunt --processor processor:55555 -i eth0 \
  -f "net 10.0.1.0/24 and udp port 5060" \
  --tls-ca ca.crt

Node Hunter VoIP amb indicadors de conveniència:

sudo lc hunt voip --processor processor:55555 -i eth0 \
  --sip-port 5060 --rtp-port-range 10000-20000 \
  --tls-ca ca.crt

Node Tap amb filtre:

sudo lc tap voip -i eth0 \
  -f "udp port 5060 or udp portrange 10000-32768" \
  --insecure

Indicadors de conveniència de lippycat

lippycat proporciona indicadors que coneixen els protocols i generen filtres BPF optimitzats. Aquests indicadors gestionen casos límit, com les llistes de ports, i es combinen de manera clara amb qualsevol filtre manual -f que proporcioneu.

OpcióBPF equivalentDisponible a
--sip-port 5060,5080Restricció de ports SIP per a TCP i UDPsniff voip, hunt voip, tap voip
--rtp-port-range 10000-20000Restricció de l’interval de ports RTPsniff voip, hunt voip, tap voip
--udp-onlyAfegeix udp al filtresniff dns, hunt dns, tap dns; indicador antic ocult en modes VoIP
--dns-port 53,5353udp port 53 or udp port 5353sniff dns, hunt dns, tap dns
--radius-port 1812,1813,1912Ports UDP indicats i candidats UDP IPv6 per a validació RADIUS a l’espai d’usuarisniff radius, hunt radius, tap radius
--http-port 80,8080tcp port 80 or tcp port 8080sniff http, tap http
--tls-port 443,8443tcp port 443 or tcp port 8443sniff tls, tap tls

Combinar indicadors de conveniència amb filtres manuals

Els indicadors de conveniència i els filtres -f es combinen amb lògica and. Això permet utilitzar un indicador de conveniència per seleccionar ports i un filtre manual per limitar amfitrions o subxarxes:

SIP als ports 5060/5080, però només d’una subxarxa específica:

sudo lc sniff voip -i eth0 --sip-port 5060,5080 -f "net 10.0.1.0/24"

DNS al port estàndard, excloent un amfitrió molt actiu:

sudo lc sniff dns -i eth0 --dns-port 53 -f "not host 10.0.1.100"

VoIP d’una centraleta PBX específica, restringit a ports SIP/RTP coneguts:

sudo lc sniff voip -i eth0 --sip-port 5060 --rtp-port-range 10000-20000 -f "host 10.0.1.50"

Implicacions de rendiment

Els filtres BPF s’executen al nucli com a codi de bytes compilat. El nucli descarta els paquets que no coincideixen abans de copiar-los a l’espai d’usuari i estalvia tant cicles de CPU com amplada de banda de memòria. En enllaços d’alta velocitat, la diferència entre una captura àmplia i un filtre BPF específic pot determinar si lippycat segueix la taxa de l’enllaç o descarta paquets.

Complexitat i cost del filtre

Els filtres simples de port es compilen en unes poques instruccions BPF i afegeixen un cost negligible. Cada clàusula or addicional afegeix algunes instruccions, però continua sent ràpida: el nucli avalua el codi de bytes en un bucle estret sense cost de crides al sistema. A la pràctica, el cost de copiar paquets a l’espai d’usuari sempre supera àmpliament el del filtre; per això, els filtres més específics gairebé sempre són més ràpids globalment, encara que continguin més clàusules.

Poques instruccions BPF: molt ràpid:

-f "udp port 5060"

Més instruccions, encara ràpid, però captura moltes menys dades:

-f "udp port 5060 or udp portrange 10000-32768"

Sense filtre, cada paquet arriba a l’espai d’usuari, cosa que fa d’aquesta l’opció més lenta.

Utilitzeu portrange en lloc de llistes de ports

Quan filtreu un interval contigu de ports, portrange és més eficient que llistar ports individuals:

Eficient: una sola comprovació d’interval:

-f "udp portrange 10000-32768"

Menys eficient: milers de comparacions individuals de ports:

-f "udp port 10000 or udp port 10001 or udp port 10002 or ..."

Interacció amb altres opcions de rendiment

El filtratge BPF funciona conjuntament amb altres funcions de rendiment de lippycat:

  • --pcap-buffer-size — Estableix la memòria intermèdia de captura del nucli (en bytes). Una memòria més gran absorbeix les ràfegues de trànsit que superen la taxa de processament. El filtratge BPF redueix la taxa d’ompliment d’aquesta memòria i permet mides més petites. Consulteu optimització del rendiment per a orientacions de dimensionament.

  • Acceleració GPU — Els motors GPU processen paquets que ja han passat el filtre BPF. Un filtre BPF més restringit significa que entren menys paquets a la cadena GPU, cosa que deixa recursos GPU per a l’anàlisi de protocols rellevant.

  • Perfils de rendiment TCP — Els filtres BPF que restringeixen ports SIP i RTP redueixen el treball a l’espai d’usuari abans del reassemblatge TCP. Per a captures només DNS, --udp-only encara pot excloure DNS TCP quan no calen transferències de zona ni respostes DNS TCP grans.

Consells i paranys

Cometes de l’intèrpret d’ordres

Les expressions BPF sovint contenen parèntesis i operadors lògics que l’intèrpret d’ordres interpreta. Poseu sempre la cadena de filtre entre cometes:

Correcte: l’intèrpret passa la cadena completa a lippycat:

sudo lc sniff -i eth0 -f "host 10.0.1.5 and (port 80 or port 443)"

Incorrecte: l’intèrpret intenta executar “(port” com un subintèrpret:

sudo lc sniff -i eth0 -f host 10.0.1.5 and (port 80 or port 443)

Trànsit amb etiqueta VLAN

Les primitives BPF estàndard no troben coincidències dins de capçaleres VLAN (802.1Q). Si la xarxa utilitza VLAN, anteposeu el qualificador vlan:

Troba coincidències SIP en trames amb etiqueta VLAN:

-f "vlan and udp port 5060"

Sense ‘vlan’, els paquets SIP amb etiqueta VLAN són invisibles al filtre:

-f "udp port 5060"

IPv6

Els paquets IPv6 requereixen el qualificador ip6. host sol només coincideix amb IPv4:

Només IPv4:

-f "host 10.0.1.5"

Només IPv6:

-f "ip6 host 2001:db8::1"

Tots dos:

-f "host 10.0.1.5 or ip6 host 2001:db8::1"

Paquets fragmentats

Els paquets fragmentats a nivell IP plantegen un repte als filtres basats en ports. Només el primer fragment porta la capçalera TCP/UDP amb els números de port; els fragments posteriors no tenen aquesta informació i no coincideixen amb filtres basats en ports. En xarxes modernes amb Path MTU Discovery, la fragmentació és rara, però si sospiteu que es perden fragments:

Captureu tots els fragments d’un amfitrió (independentment del port):

-f "host 10.0.1.5"

Provar filtres amb tcpdump

Abans de desplegar un filtre en producció, proveu-lo amb tcpdump -d per inspeccionar el codi de bytes BPF compilat o amb tcpdump -c 10 per verificar que coincideix amb el trànsit esperat:

Mostra les instruccions BPF compilades (no cal capturar):

tcpdump -d "udp port 5060 or udp portrange 10000-32768"

Captura 10 paquets coincidents per verificar:

sudo tcpdump -i eth0 -c 10 "udp port 5060"

Difusió i multidifusió

Per excloure soroll de difusió o multidifusió d’una captura:

Exclou difusió:

-f "not ether broadcast"

Exclou multidifusió:

-f "not ether multicast"

Exclou totes dues:

-f "not ether broadcast and not ether multicast"

Longitud màxima del filtre

libpcap imposa un límit de longitud del programa BPF (normalment 4096 instruccions en Linux). Els filtres extremament complexos amb centenars de clàusules de port poden superar aquest límit. Si hi arribeu, consolideu les llistes de ports en expressions portrange o utilitzeu els indicadors de conveniència de lippycat, que generen filtres optimitzats.

Lectures addicionals