pcap_compile()是用來把用戶輸入的過濾字符串編譯進過濾信息的,這個過濾信息可以決定哪些包是用戶可獲取到的 。
過濾表達式包含一個或多個元素。每個元素通常包含由多個或一個被修飾符修飾的id名稱或數字,有三種不同的修飾符:
類型修飾符 說明id屬於那種類型。可以用的類型修飾符有host,net,port,portrange。例如‘host foo’, ‘net 128.3’, ‘port 20’, ‘por-trange 6000-6008’。如果id沒有指定類型,則host是默認。
路徑方向修飾符 指定id的路徑方向。可以用的路徑修飾符有src, dst, src or dst,srcand dst, addr1, addr2, addr3, and addr4.舉例‘src foo’, ‘dst net 128.3’, ‘src or dst port ftp-data’.如果id沒有路徑修飾符,默認src or dst。addr1, addr2, addr3, and addr4僅用於無限網絡,在鏈路層,如果是混雜模式,可以用inbound,outbound來指定過濾方向
協議修飾符 來限制匹配的協議。可以用的協議修飾符ether, fddi, tr, wlan, ip, ip6, arp, rarp, decnet, tcp and udp。舉例ether src foo’,‘arp net 128.3’, ‘tcp port 21’, ‘udp portrange 7000-7009’, ‘wlan addr2 0:2:3:4:5:6’. 如果沒有制定協議,則默認是所有協議都匹配,比如‘src foo’,ip arp rarp的協議都匹配
fddi協議等同於ether協議,在語法解析器中,fddi與ether含義一樣,fddi頭部信息包含以太網源、目的地址,還包含包的類型,可以指定fddi頭部域的信息來過濾指定的域。fddi頭還包含其他的域,但是不能應用與過濾。
tr和wlan在過濾解析器中,含義等同於ether。以前版本的fddi頭部信息也適用於802.11無線局域網的頭。
除了以上三種修飾符,還有一些特殊的修飾符和算術運算式:gateway, broadcast, less, greater。如下所示算術運算式:
and or not
可以用and、or、not來組合復雜的過濾表達式。比如‘host foo and not port ftp and not port ftp-data’,如果多個表達式以and、 or、 not來組合,多個表達式有相同的修飾符,則可以省略除第一個表達式以外,比如‘tcp dst port ftp or ftp-data or domain’等同於‘tcp dst port ftp or tcp dst port ftp-data or tcp dstport domain’
允許的過濾表達式:
dst host host
包的目的ip,可以是ip地址也可以是域名
src host host
包的源ip
host host
匹配包的源或則目的ip
以上的表達式都可以用ip、arp、rarp、ip6,比如ip host host,包是ip協議,包的源ip或目的ip是host的,如果host是多播ip地址,那么每個地址都會匹配。
ether dst ehost
匹配以太網頭的目的地址
ether src ehost
匹配以太網頭的源地址
ether host ehost
匹配以太網源或目的地址
gateway host
匹配網關地址,以太網頭的目的或者源地址是網關但不能以ip頭的源或目的地址為網關,網關host必須存在於設備的域名解析文件中,不適用於ipv6
dst net net
匹配范圍內包的目的ip地址(一段范圍的ip地址),net可以是網絡文件中的名稱,也可以是一個網ip地址,一個ipv4的ip地址可以是以點分制的數字,如192.168.1.1則對應的網絡掩碼是255.255.255.255,192.168.1則對應的網絡掩碼是255.255.255.0,192.168則對應的網絡掩碼是254.254.0.0,ipv6的ip地址必須是完整的,所以ipv6的匹配等同於ip地址匹配
src net net
匹配范圍內包的源ip地址
net net
匹配范圍內包的源或者目的ip地址
net net mask netmask
匹配指定的ip地址net以及掩碼netmask,可以指定src或者dst。不支持ipv6
net net/len
匹配指定的ip地址,類似192.168.10.1/24 等同於 192.168.10.1 和掩碼254.254.254.0,可以指定src或dst
dst port port
匹配指定的包的目的端port,port可以是數字或者/etc/services 文件中的端口對應的名稱,如果使用名稱,則只匹 配名稱對應的端口和協議,如果是數字,則只匹配端口號
src port port
匹配包的指定源端口
port port
匹配源或在目的端口為port的包
dst portrange port1-port2
匹配目的端口在port1-port2之間的包
src portrange port1-port2
匹配源端口在port1-port2之間的包
portrange port1-port2
匹配源端口或目的端口在port1-port2之間的包
以上關於端口和端口范圍匹配的表達式可以用tcp或udp來指定協議
less length
匹配長度小於指定的長度length的包
greater length
匹配長度大於指定長度length的包
ip proto protocol
匹配協議為protocol的ip包,protocol可以使一個數字也可以是字符串(icmp, icmp6, igmp, igrp, pim, ahesp, vrrp, udp, tcp),注意因為tcp udp icmp本身是修飾符所以可以前面
加用反斜杠來表示
ip6 proto protocol
匹配協議為protocol的ipv6的包