設置過濾規則就是讓網絡設備只是捕獲我們感興趣的網絡數據包,如果沒有設置過濾規則,即上面的 filter_app 是空字符串,那么網絡設備就捕獲所有類型的數據包,否則只是捕獲過濾規則設置的數據包,此時過濾規則的邏輯值為真。此過濾規則是通用的,由著名的網絡程序 tcpdump 推出,其他很多的網絡程序都是基於此規則進行設計的。此過濾規則的內部解析機制上面介紹過,下面我們參考 tcpdump 的過濾規則形式着重介紹一下過濾規則的定義形式。 過濾規則由一個或多個原語組成。原語通常由一個標識(id, 名稱或數字)和標識前面的一個或多個限定詞組成。 過濾規則有三種類型的限定詞,分別為 type、dir 和 proto。 1.type 類型限定詞,說明標識的類型,即名字的類型或數字的類型。大概有 host、net 和 port 三種類型。例如 ’host foo’, ’net 128.3’, ’port 20’。如果不指定類型修飾字,就使用默認的 host。 2.dir 方向限定詞,說明相對於標識的傳輸方向,即數據是傳入還是傳出標識。可以使用的方向有 src, dst, src or dst 和 src and dst。例如,’src foo’, ’dst net 128.3’, ’src or dst port ftp-data’。如果不指定方向限定詞,就使用默認的 src or dst。對於’null’ 鏈路層(就是說像 slip 之類的點到點協議),用 inbound 和 outbound 限定詞指定所需的傳輸方向。 3.proto 協議限定詞,說明過濾規則指定的協議。可以使用的協議有: ether, fddi, ip, arp, rarp, decnet,lat, sca, moprc, mopdl, tcp 和 udp。例如,’ether src foo’, ’arp net 128.3’, ’tcp port 21’。如果不指定協議限定詞,就使用所有符合類型的協議。例如,’src foo’ 指(ip 或 arp 或 rarp)src foo’ , ’netbar’ 指 ’ (ip 或 arp 或 rarp) net bar’, ’port 53’ 指(tcp 或 udp)port 53’。 更復雜的過濾器表達式可以通過 and(&&), or(||) 和 not(!) 連接原語來組建。例如,’host foo and notport ftp and not port ftp-data’。為了簡便,可以忽略相同的限定詞。例如,’tcp dst port ftp orftp-data or domain’ 實際上等價於 ’tcp dst port ftp or tcp dst port ftp-data or tcp dst port domain’。 下面介紹過濾規則的原語,允許的原語有以下幾種。 dst host host1 如果報文中 IP 的目的地址域是 host1,則邏輯為真。host1 既可以是地址,也可以是主機名。此過濾規則就是捕獲所有目的地址是 host1 的網絡數據包。 src host host1 如果報文中 IP 的源地址域是 host1,則邏輯為真。即捕獲所有源地址是 host1 的所有網絡數據包。 host host1 如果報文中 IP 的源地址或者目的地址是 host1,則邏輯為真。即捕獲所有源地址或者目的地址是 host1 的網絡數據包。 上面所有的 host 表達式都可以加上 ip, arp 或 rarp 關鍵字做前綴,就像: ip host host1 它等價於: ether proto \ip and host host1 如果 host1 是擁有多個 IP 地址的主機名, 它的每個地址都會被查驗。 ether dst ehost 如果報文的以太目的地址是 ehost,則邏輯為真。即捕獲所有以太網目的地址是 ehost 的網絡數據包。其中 ehost 既可以是名字,如 eth0 (/etc/ethers 里有),也可以是數字。 ether src ehost 如果報文的以太網源地址是 ehost,則邏輯為真。即捕獲所有以太網源地址是 ehost 的網絡數據包。 ether host ehost 如果報文的以太源地址或以太目的地址是 ehost,則邏輯為真。即捕獲所有以太網源地址或者目的地址是 ehost 的網絡數據包。 gateway host 如果報文把 host 當做網關,則邏輯為真。也就是說,報文的以太網源或目的地址是 host,但是 IP 的源目地址都不是 host。此 host 必須是個主機名,而且必須存在於/etc/hosts 和/etc/ethers 中。一個等價的表達式是: ether host ehost and not host host1 對於 host1 和 ehost,它既可以是名字,也可以是數字。 dst net net1 如果報文的 IP 目的地址屬於網絡號 net1,則邏輯為真。net1 既可以是名字(存在/etc/networks 中),也可以是網絡號。即捕獲所有目的地址屬於網絡 net1 的網絡數據包。 src net net1 如果報文的 IP 源地址屬於網絡號 net1,則邏輯為真。即捕獲所有源地址屬於網絡 net1的網絡數據包。 net net1 如果報文的 IP 源地址或目的地址屬於網絡號 net1,則過濾規則邏輯為真。即捕獲所有源地址或者目的地址屬於網絡 net1 的網絡數據包。 net net1 mask mask1 如果 IP 地址匹配指定網絡掩碼 mask1 的 net1,則邏輯為真。本原語可以用 src 或 dst 修飾。 net net1/len 如果 IP 地址匹配指定網絡掩碼的 net1,則邏輯為真,掩碼的有效位寬為 len。本原語可以用 src 或 dst 修飾。 dst port port1 如果報文是 ip/tcp 或 ip/udp,並且目的端口是 port1,則邏輯為真。port1 是一個數字,也可以是/etc/services 中定義過的名字。如果使用名字,則檢查端口號和協議。如果使用數字,或者有二義的名字,則只檢查端口號。例如,dst port 513 將顯示 tcp/login 的數據和 udp/who的數據,而 port domain 將顯示 tcp/domain 和 udp/domain 的數據。 src port port1 如果報文的源端口號是 port1,則邏輯為真。即捕獲所有源端口號是 port1 的網絡數據包。 port port 如果報文的源端口或目的端口是 port,則邏輯為真,上述的任意一個端口表達式都可以用關鍵字 tcp 或 udp 做前綴,就如: tcp src port port1 它只匹配源端口是 port1 的 TCP 報文。即捕獲所有源端口號是 port1 的協議是 tcp 的網絡數據包。 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 也同樣是關鍵字,所以必須用反斜杠(\)義,在 C-shell 中應該是\\。 ether broadcast 如果報文是以太廣播報文,則邏輯為真。即捕獲以太網廣播數據包。關鍵字 ether 是可選的。 ip broadcast 如果報文是 IP 廣播報文,則邏輯為真。檢查全 0 和全 1 的廣播約定,並且檢查本地的子網掩碼。 ether multicast 如果報文是以太多目傳送報文(multicast),則過濾規則邏輯為真。關鍵字 ether 是可選的。這實際上是 ’ether[0] & 1 != 0’ 的簡寫。 ip multicast 如果報文是 IP 多目傳送報文,則過濾規則邏輯為真。即捕獲 ip 多目傳送報文。 ether proto protocol 如果報文協議屬於以太類型的 protocol,則邏輯為真。Protocol 可以是數字,也可以是名字,如 ip, arp 或 rarp。注意這些標識符也是關鍵字,所以必須用反斜杠(\)轉義。如果是 FDDI(例如,’fddi protocol arp’),協議標識來自 802.2 邏輯鏈路控制(LLC)報頭,它通常位於FDDI 報頭的頂層。當根據協議標識過濾報文時,那么就假設所有的 FDDI 報文含有 LLC 報頭,而且 LLC 報頭用的是 SNAP 格式。 decnet src host 如果 DECNET 的源地址是 host,則邏輯為真,該主機地址的形式可能是’’10.123’’,或者是 DECNET 主機名。只有配置成運行 DECNET 的 Ultrix 系統支持 DECNET 主機名。 decnet dst host 如果 DECNET 的目的地址是 host,則邏輯為真。 decnet host host 如果 DECNET 的源地址或目的地址是 host,則邏輯為真。 ip, arp, rarp, decnet是 ether proto p 的簡寫形式,其中 p 為上述協議的一種。 tcp, udp, icmp是 ip proto p 的簡寫形式,其中 p 為上述協議的一種。 expr relop expr 如果這個關系成立,則邏輯為真,其中 relop 是 >, <, >=, <=, =, != 之一, expr 是數學表達式,由常整數(標准 C 語法形式),普通的二進制數運算符[+, -, *, /, &, |],一個長度運算符,和指定的報文數據訪問算符組成。要訪問報文內的數據,使用下面的語法: proto [ expr : size ] proto 是 ether, fddi, ip, arp, rarp, tcp, udp, or icmp 之一,同時也指出了下標操作的協議層。 expr 給出字節單位的偏移量,該偏移量相對於指定的協議層。Size 是可選項,指出感興趣的字節數;它可以是 1, 2, 4, 默認為 1 字節。由關鍵字 len 給出的長度運算符指明報文的長度。 字節數;它可以是 1, 2, 4, 默認為 1 字節。由關鍵字 len 給出的長度運算符指明報文的長度。 例如,’ether[0] & 1 != 0’ 捕捉所有的多目傳送報文。表達式’ip[0] & 0xf != 5’ 捕捉所有帶可選域的 IP 報文。表達式 ’ip[6:2] & 0x1fff = 0’ 只捕捉未分片和片偏移為 0 的數據報。這種檢查隱含在 tcp 和 udp 下標操作中。例如,tcp[0] 一定是 TCP 報頭的第一個字節,而不是其中某個 IP 片的第一個字節。 原語可以用下述方法結合使用: 圓括弧括起來的原語和操作符。取反操作 (’!’ or ’not’),聯結操作 (’&&’ or ’and’) 或操作(’||’ or ’or’)。取反操作有最高優先級。或操作和聯結操作有相同的優先級,運算時從左到右結合。注意聯結操作需要顯式的 and 算符,而不是並列放置。 如果給出標識符,但沒給關鍵字,那么暗指最近使用的關鍵字。例如,not host vs and ace 作為 not host vs and host ace 的簡寫形式,不應該和 not ( host vs or ace )混淆。表達式參數可以作為單個參數傳給捕獲程序,也可以作為復合參數,后者更方便一些。
a
