伯克利包過濾器(BPF)
什麼是BPF?
BPF,即伯克利包過濾器 Berkeley Packet Filter,誕生於1992年,其作用是提供一種過濾包的方法來避免在內核空間複製無用的數據到用戶空間。由於其簡化的語言以及存在於內核中的即時編譯器(JIT),使BPF成爲一個性能卓越的包過濾工具。
BPF語法
- BPF過濾規則由一個或多個原語(原子式)組成。原語通常由一個標識(id,名稱或數字)和標識前面的一個或多個限定詞組成。
- BPF過濾規則有三種類型的限定詞,分別爲type、dir和 proto。
type限定詞
- type限定詞用於說明標識的類型,即名字的類型或數字的類型,主要有host、net和port三種類型。
- 例如:host foo,net 128.3,port 20
- 注:如果不指定類型修飾字,就使用默認的host
dir限定詞
- dir限定詞用於說明相對於標識的傳輸方向,即數據是傳入還是傳出標識。
- 有src,dst,src or dst和 src and dst
- 例如:src host192.168.0.1,dst net128.3,src or dst port ftp-data
- 注:如果不指定方向限定詞,就使用默認的 src or dst。對於點到點類型的鏈路協議,用 inbound和 outbound限定詞指定所需的傳輸方向。
proto限定詞
- proto限定詞用於說明過濾規則指定的協議。
- 可以使用的協議有:ether,fddi,ip,arp,rarp,decnet,lat,sca,moprc,mopdl,tcp 和 udp。
- 例如,ether src foo,arp net 128.3,tcp port 21
- 注:如果不指定協議限定詞,就使用最優匹配的協議。例如,port 53指(tcp或udp)port 53
特殊原語
-
less length
- 如果報文的長度小於等於 length,則邏輯爲真。即只捕獲所有長度小於 length的網絡數據包。它等同於:len<= length
-
greater length
- 如果報文的長度大於等於 length,則邏輯爲真。即只捕獲所有長度大於 length的網絡數據包。它等同於:len>= length.
-
ip proto protocol
- 如果報文是 IP 數據報,其內容的協議類型是 protocol,則邏輯爲真。即只捕獲網絡協議類型是 protocol 的 ip 數據包。protocol 可以是數字,也可以是下列名稱中的一個:icmp, igrp,udp, nd 或 tcp。注意這些標識符 tcp, udp 和 icmp 也同樣是關鍵字,所以必須用反斜槓(\)義。
-
ether proto protocol
- 如果報文協議屬於以太類型的 protocol,則邏輯爲真。Protocol 可以是數字,也可以是名字,如 ip, arp 或 rarp。注意這些標識符也是關鍵字,所以必須用反斜槓(\)轉義。
-
ether broadcast
- 如果報文是以太廣播報文,則邏輯爲真。即捕獲以太網廣播數據包。關鍵字 ether是可選的。
-
ip broadcast
- 如果報文是IP廣播報文,則邏輯爲真。檢查全0和全1的廣播約定,並且檢查本地的子網掩碼。
-
ether multicast
- 如果報文是以太多目傳送報文(multicast),則過濾規則邏輯爲真。關鍵字 ether是可選的。這實際上是 ’ ether[0]&1!=0 ’ 的簡寫。
-
ip multicast
- 如果報文是IP多目傳送報文,則過濾規則邏輯爲真。即捕獲IP多目傳送報文。
-
proto [expr : size]
- proto是 ether,fddi,ip,arp,rarp,tcp,udp,or Icmp之一,同時也指出了下標操作的協議層。expr給出字節單位的偏移量,該偏移量相對於指定的協議層。Size是可選項,指出感興趣的字節數;它可以是1,2,4,默認爲1字節。
- ether[o] & 1 != 0捕捉所有的多目傳送報文。
- ip[0] & 0xf != 5捕捉所有帶可選域的IP報文。
- ip[6:2] & 0x1ff = 0只捕捉未分片和片偏移爲0的數據報。
複合過濾規則
- 複雜的過濾器表達式可以通過and(&&),or(||)和 not(!)連接原語來組建。
- host foo and not port ftp and not port ftp-data
- 爲了簡便,可以忽略相同的限定詞。
- 例如,tcp dst port ftp or ftp-data or domain實際上等價於tcp dst port ftp or tcp dst port ftp-data or tcp dst port domain
練習
-
ip src net 192.168.1 and tcp dst port 80
- 捕獲源地址來自於192.168.1網段,並且目的端口爲tcp的80端口的數據包
-
udp dst port 53 and udp[4: 2]<100
- 捕獲目的端口爲53,並且長度小於100字節的UDP報文
-
ip src net 200.100.1 and ip dst host 200.200.1.2 and tcp dst port 80 and tcp[13]&0x40=0x40
- 捕獲源網絡爲200.100.1,並且目的地址爲200.200.1.2,並且目的端口爲tcp的80端口,並且tcp控制位全零保留位最後一位爲1的數據包
-
若需捕獲192.168.1.0/24網絡中的主機telnet到服務器10.1.1.1的數據包
- ip src net 192.168.1 and ip dst host 10.1.1.1 and tcp dst port 23
-
若需捕獲源自200.1.1.0/24網絡,發送到服務器10.2.2.2的21端口的數據
- ip src net 200.1.1 and ip dst host 10.2.2.2 and dst port 21
-
若需捕獲所有RIPv2協議數據包(RIPV2協議採用組播方式傳輸,組播地址224.0.0.9,且使用UDP 520端口交換信息)
- ip dst host 224.0.0.9 and udp src or dst port 520