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:
| Qualificador | Significat | Exemple |
|---|---|---|
host | Coincidència amb una adreça IP | host 10.0.1.5 |
net | Coincidència amb una subxarxa (CIDR) | net 10.0.1.0/24 |
port | Coincidència amb un número de port | port 5060 |
portrange | Coincidència amb un interval de ports | portrange 10000-32768 |
proto | Coincidència amb un número de protocol | proto 17 (UDP) |
Qualificadors de direcció
Els qualificadors de direcció restringeixen les coincidències a l’origen o la destinació:
| Qualificador | Significat | Exemple |
|---|---|---|
src | Només origen | src host 10.0.1.5 |
dst | Només destinació | dst port 443 |
src or dst | Qualsevol dels dos (per defecte) | host 10.0.1.5 |
src and dst | Tots dos | src and dst net 10.0.0.0/8 |
Qualificadors de protocol
| Qualificador | Descripció |
|---|---|
tcp | Segments TCP |
udp | Datagrames UDP |
icmp | Missatges ICMP |
icmp6 | Missatges ICMPv6 |
arp | Paquets ARP |
ip | Paquets IPv4 |
ip6 | Paquets IPv6 |
ether | Trames Ethernet |
vlan | Trames amb etiqueta VLAN (802.1Q) |
Operadors
| Operador | Àlies | Significat |
|---|---|---|
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
-fperquè 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 equivalent | Disponible a |
|---|---|---|
--sip-port 5060,5080 | Restricció de ports SIP per a TCP i UDP | sniff voip, hunt voip, tap voip |
--rtp-port-range 10000-20000 | Restricció de l’interval de ports RTP | sniff voip, hunt voip, tap voip |
--udp-only | Afegeix udp al filtre | sniff dns, hunt dns, tap dns; indicador antic ocult en modes VoIP |
--dns-port 53,5353 | udp port 53 or udp port 5353 | sniff dns, hunt dns, tap dns |
--radius-port 1812,1813,1912 | Ports UDP indicats i candidats UDP IPv6 per a validació RADIUS a l’espai d’usuari | sniff radius, hunt radius, tap radius |
--http-port 80,8080 | tcp port 80 or tcp port 8080 | sniff http, tap http |
--tls-port 443,8443 | tcp port 443 or tcp port 8443 | sniff 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-onlyencara 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
- Sintaxi de filtres tcpdump (pàgina de manual pcap-filter) — la referència autoritzada de sintaxi d’expressions BPF
- Optimització del rendiment — ajust del rendiment de captura amb perfils TCP i acceleració GPU
- Arquitectura distribuïda — com encaixen els filtres BPF en desplegaments Hunter/processador