限定詞可大致分類成通訊協定 (proto)、傳送方向 (dir)、類型 (type) 三種:
- type:說明 id 是指什麼,未指明預設是 host。
- host host:位址或主機名稱,如果沒指明 proto 是指 IPv4 或 IPv6 的位址或主機名稱。
- net net [mask netmask] 或 net net/len:IPv4 或 IPv6 位址、subnet,可指明 netmask。
- port port:TCP 或 UDP 的通訊埠。
- portrange port1-port2:TCP 或 UDP 通訊埠的範圍。
- dir:限定方向
- 有 src、dst、src or dst (預設)、和 src and dst。
- proto wlan 限定:ra、ta、addr1、addr2、addr3、addr4、dir
- proto:限定協定,有 ether、ip、ip6、arp、rarp、tcp、udp 等,未指明則預設所有跟 type 能一致的協定。
範例
Ethernet 信頭- ether dst|src|host ehost:Ethernet 目的或來源位址是 ehost,ehost 可以是來自 /etc/ethers 的名稱或十六進位數字表示的 MAC 位址 (會忽略中間參雜的「:」、「.」、和「-」)。
- ether ehost:錯誤。
- [ether] broadcast:Ethernet 廣播封包。ether 可省略。
- [ether] multicast:Ethernet 群播封包。ether 可省略。相當於 ether[0] & 1 != 0。
- [ether proto] protocol:Ethernet 的 Ether Type 是 protocol,protocol 可以是數字或名稱 ip、ip6、arp、rarp、atalk、aarp、decnet、sca、lat、mopdl、moprc、iso、stp、ipx、或 netbeui。註:由於這些名稱也是保留字,所以需要 backslash (\) 跳脫。
- vlan [vlan_id]:
- pppoed:
- pppoes [session_id]:
- wlan ra|ta|addr1|addr2|addr3|addr4 ehost:
- [type wlan_type] [subtyp wlan_subtype]:
- dir dir:
- [ip|arp|rarp|ipv6] [dst|src] host host:host 是 IPv4/IPv6 位址或主機名稱。前面可加協定限制、方向限制。ip host host 相當於 ether proto \ip and host host。
- gateway host:使用 host 作為 gateway 的封包,也就是使用 host 的 Ethernet 位址,但不是 host 的 IP 位址。host 的 IP 位址和 MAC 位址需要查得到。相當於 ether host ehost and not host host。
- [dst|src] net net [mask netmask]:
- [dst|src] net net[/len]:
- ip broadcast:
- [ip|ip6] multicast:
- [[ip|ip6] proto] tcp|udp|icmp:協定是 tcp、ucp、或 icmp 封包。註:tcp, udp, and icmp 也是 keyword,所以需要 backslash (\) 跳脫。註:不能 chase the protocol header chain。
- [ip|ip6] proto protocol:IPv4 或 IPv6 protocol type 是 protocol。protocol 可以是數字或名稱 icmp6, igmp, igrp, pim, ah, esp, or vrrp。註:不能 chase the protocol header chain.
- [ip|ip6] protochain protocol:IPv4 或 IPv6 protocol chain 中含有 protocol。產生的 BPF 程式碼較複雜,且 kernel 不支援。
- [tcp|udp] [dst|src] port port:
- [tcp|udp] [dst|src] portrange port1-port2:
- expr relop expr:relop 是比大小 >、<、>=、<=、=、!= 之一。expr 可能是某個值、封包長度 len、或封包資料和正整數的 +、-、*、/、&、|、<<、>>、%、^ 運算。(註:Linux 3.7 以後在 kernel 才能算 % 和 ^。) 封包資料用 proto[expr[:size]] 表示,指特定 proto 協定的 expr byte offset 的 size byte。size 可以是 1、2、4,預設是 1。特定 offset 或欄位可以用名稱表示,例如 tcp[tcpflags]。特定值可以用名稱表示,例如 tcp-syn、tcp-fin 等。
- less|greater length:封包長度。相當於 len <= length 和 len >= length。
這些過濾描述會先編譯成 BPF 虛擬機器的指令碼,才給 BPF 執行。
參考來源
延伸閱讀- 顯示過濾式
沒有留言:
張貼留言