メイン   モジュール   デー タ構造   ファイルリスト   データフィールド   グローバル   関連ページ   注意事項   English

フィルタリングの条件式構文(シンタックス)
[WinPcap ユーザーズマニュアル]


注意: 本ドキュメントはtcpdumpのメインページから書かれています。オリジナルのバージョンは www.tcpdump.org のサイト内にあります。

wpcap のフィルタは、宣言型の叙述式に基づいています。フィルタは、フィルタリングの式を含んだASCII文字列です。pcap_compile() が式を取り込んでそれをカーネルレベルのパケットフィルタに翻訳(コンパイル)します。

条件式はどのパケットがダンプされるかを選択します。expressionが与えられない場合、カーネルレベルのフィルタリングエンジンによって ネットワーク上の全てのパケッ トが受け入れられます。それ以外は、式が'true'のパケットだけが受け入れられます。

式は、一つかそれ以上の要素(プリミティブ)で構成されます。要素は通常は、一つかそれ以上の修飾子によって選考されたid (名前か数値)で構成されています。三つの異なる限定詞があります:

type
id名や数値がどんなものを参照しているかを宣言する 修飾子です。可能な型はhost netportです。例えば、 `host foo'、 `net 128.3'、 `port 20'などです。type修飾子がない場合は、host だと判断されます。
dir
idに向けて、および/またはidから、を特定 する修飾子です。可能な転送先は src, dst, src or dst, src adn dst です。 例えば、`src foo'、 `dst net 128.3'、 `src or dst port ftp-data'等になります。dir修飾子がない場合は、src または dst だと判断されます。null リンクレイヤ(すなわち、SLIPのようなPPPプロトコル)には、inboundoutbound 修飾子が要求された転送先を特定するのに使用されます。
proto
一致する特定のプロトコルに制限する修飾子です。可能なproto はether fddi tr ip ip6 arp rarp decnet tcp、 udp です。例えば、`ether src foo'、 `arp net 128.3'、 `tcp port 21'等になります。proto修飾子がない場合は、typeと一致した全てのプロトコルだと判断されます。例えば、`src foo' は`(ip or arp or rarp) src foo' (このような書き方は文法誤りだが)を意味し、`net bar' は `(ip or arp or rarp) net bar'を意味し、`port 53' は `(tcp or udp)の port 53'を意味します。

[`fddi' は実際には`ether'のエイリアスです。パーサー(構文解析ツール)は、"特定のネットワークインターフェイス上で使用され るデータリンク層"と解釈してそれらを扱います。FDDIヘッダはイーサネットのようなソースと宛先アドレス、そしてしばしば イーサネットのようなパケットtypeを包含するのに、これらのFDDIフィールドをイーサネットフィールドに類似しているものと同様にフィルタ出 来ます。FDDIヘッダは他のフィールドも包含しますが、それらをフィルタの条件式中で明示的に名づけることは出来ません。

同様に、`tr' は`ether'のエイリアスです。先ほどのFDDIに関する文章はToken Ringヘッダにも当てはめられます。]

上記に加えて、これらのパターンに当てはまらない特別な要素を示すキーワードがあります。gatewaybroadcast less greater と、数値による条件式です。これらについては、後述します。

andorまたは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' と完全に同じです。

許容される要素の組み合わせは以下のとおりになります:

dst host host
パケットのIPv4/v6デスティネーションフィールドがhostであれば真。アドレスでも名前でもどちらでも良い。
src host host
パケットのIPv4-v6のソースフィールドがhostであれば真。
host host
IPv4/v6のソースかパケットのデスティネーションがhostであれば真。上記のhost式のいずれかは、次に見られる様にip arp rarpip6でプリペンドされます:
ip host host
次と同等です:
ether proto \ip and host host
 host が複合IPアドレスによる名前であれば、それぞれのアドレスが適合のためにチェックされます。
ether dst ehost
イーサネットデスティネーションアドレスがehostであれば真。Ehostはetc/etherからの名前か数値からのいずれかになります (数 値フォーマットに関しては、ethers(3N)を参照のこと)。
ether src ehost
イーサネットソースアドレスがehostであれば真。
ether host ehost
イーサネットソースかデスティネーションアドレスのいずれかがehostであれば真。
gateway host
パケットがhostをゲートウェイとして使用していれば真。すわなち、イーサネットソースかデスティネーションアドレスがhostで、しか し、 IPソースもIPデスティネーションのどちらもhostでない場合。Hostは名前でなければならず、また、/etc/hostsと /etc/ethersの両方に記載されていなければなりません。(この条件式はhost/ehostそれぞれを名前か番号で記述する
ether host ehost and not host host
と同等) この式は、現時点ではIPv6を有効にした設定上では動作しません。
dst net net
パケットのIPv4/v6宛先アドレスがnetのネットワークを保持していれば真。Net は etc/networksからの名前かネットワークナンバーのいずれかになります(詳細はnetworks(4)を参照のこと)。
src net net
パケットのIPv4/v6ソースアドレスがnetのネットワークを保持していれば真。
net net
パケットのIPv4/v6ソースアドレスと宛先アドレスのいずれかがnetネッ トワークを保持していれば真。
net net mask netmask
IPアドレスとnetが特定のnetmaskで一致すれば真。srcdstで修飾される。この構文は IPv6のnetでは無効である事に注意。
net net/len
IPv4/v6アドレスとnetがlenビット幅のネットマスクで一致すれば真。srcdstで修飾さ れる。
dst port port
パケットがip/tcp, ip/udp, ip6/tcp, ip6/udpの場合で、宛先ポートがportであれば真。port はetc/servicesにて使用される数値となる(tcp(4P) と udp(4P)を参照)。名前が使用されてい れば、ポート番号とプロトコルがチェックされる。数値かあいまいな名前が使用されている場合、ポート番号だけがチェックされる(例えば dst port 513 はtcp/login トラフィックと udp/who トラフィックの両方で出力する。 port domain はtcp/domain と udp/domain トラフィックで出力する)。
src port port
パケットがport のソースポートの値を保持していれば真。
port port
パケットの宛先ポートかソースポートのいずれかがportであれば真。前述のポート式のいずれも、キーワードtcpudpで プリペンドされます。 下記のように:
tcp src port port
この場合はソースポートが portであるtcpパケットだけと一致する。
less length
パケットの長さが lengthと同等かそれ以下の時に真。これは下記と同等です:
len <= length.
greater length
パケットの長さが lengthと同等かそれ以上の時に真。これは下記と同等です:
len >= length.
ip proto protocol
パケットがプロトコルタイプprotocolを持つIPパケットの時に真(ip(4P)参照)。Protocol は数値か次のうちの名前の一つになりえる。 icmp, icmp6, igmp, igrp, pim, ah, esp, vrrp, udp, tcp。 識別子であるtcp, udp, icmp もキーワードであり、なおかつそれらはバックスラッシュ(\)、C-shellでは\\によって拡張されなければならないことに注意してください。この要 素はプロトコルヘッダチェインを追跡しません。
ip6 proto protocol
パケットが protocol型のプロトコルを持つIPv6パケットの時に真。この要素はプロトコルヘッダ チェインを追跡しません。
ip6 protochain protocol
パケットがIPv6で、そのプロトコルチェインの中にprotocol 型のプロトコルヘッダを持つパケットであれば真。例として
ip6 protochain 6
は、プロトコルヘッダチェインの中にTCPプロトコルヘッダを持つIPv6パケットと一致する。パケットには、例えば認証ヘッダ、ルーティングヘッダや hop-by-hopオプションヘッダがIPv6ヘッダとTCPヘッダの間に含まれるかもしれません。この要素が作り出すBPFコードは複雑でtcpdumpの BPF最適化コードを最適化できないので、もしかしたら少し遅いかもしれません。
ip protochain protocol
ip6 protochain protocolと同じものだが、IPv4のためのもの。
ether broadcast
パケットがイーサネットのブロードキャストであれば真。キーワード ether はオプションなのでなくてもよい。
ip broadcast
パケットがIPブロードキャストパケットであれば真。これは全て0と全て1のブロードキャスト形式に対応し、サブネットマスクにも対応してい る。
ether multicast
パケットがイーサネットマルチキャストであれば真。キーワードether はオプションなのでなくてもよい。これは`ether[0] & 1 != 0'の省略法。
ip multicast
パケットがIPマルチキャストであれば真。
ip6 multicast
パケットがIPv6マルチキャストパケットであれば真。
ether proto protocol
パケットが ether の protocol型であれば真。Protocol には数値か次の名前が利用可能。ip, ip6, arp, rarp, atalk, aarp, decnet, sca, lat, mopdl, moprc, iso, stp, ipx, netbeui。 これらの識別子はキーワードでもあるので、バックスラッシュ(¥)で回避されなければならないことに注意。

[FDDI (例えば`fddi protocol arp') と Token Ring (例えば `tr protocol arp')の場合、プロトコルの識別方法は、802.2 Logical Link Control (LLC) ヘッダによる。通常はFDDI または Token Ring ヘッダの先頭に置かれています。

tcpdump はプロトコル識別子でフィルタする場合に、全てのFDDIパケットはLLCヘッダを持っていて、そのLLCヘッダはSNAPという形式になっているとみな します。

例外として、 iso はLLCヘッダのDSAP (Destination Service Access Point) と SSAP (Source Service Access Point) フィールドをチェックします。 stpnetbeui はLLCヘッダのDSAP をチェックします。 atalk はOUIとAppletalk etypeでSNAP形式のパケットをチェックします。

イーサネットの場合、tcpdump は ほぼ全てのプロトコルのEthernet 型フィールドをチェックします。例外として、iso, sap, netbeui は802.3フレームをチェックしてからFDDIやToken Ringに対してするようにLLCヘッダをチェックします。 atalk イーサネットフレーム内のAppletalk etypeとFDDIとToeken Ringに対してするようにSNAP形式パケットの両方をチェックします。 aarp はイーサネットフレームか802.2SNAPフレームいずれかのAppletalk ARP etypeをチェックします。ipx はイーサネットフレーム内のIPX etype、LLCヘッダ内のIPX DSAP、IPXカプセル化LLCヘッダなしの802.3、SNAPフレーム内のIPX etypeをチェックします。]
decnet src host
DECNET ソースアドレスが、``10.123''のような形式ないしはDECNET ホストネームと一致するようなhost であれば真。[DECNET のホストネーム形式は、DECNETに接続されたUltrixシステム上でだけ利用可能。]
decnet dst host
DECNET 宛先アドレスがhostであれば真。
decnet host host
DECNET ソースか宛先アドレスが hostであれば真。
ip, ip6, arp, rarp, atalk, aarp, decnet, iso, stp, ipx, netbeui
下記において:
ether proto p
p を上記のいずれかのプロトコルにするのと同等。
lat, moprc, mopdl
下記において:
ether proto p
p を上記のいずれかのプロトコルにするのと同等。tcpdump はこれらのプロトコルの解析方法は知らないことに注意。
vlan [vlan_id]
パケットがIEEE 802.1Q VLAN パケットであれば真。[vlan_id] が指定された場合、パケットが指定されたvlan_id の時だけ 真。expression中にキーワードvlanが最初に出てきたら、そのパケットはVLANパケットなので、残りの部 分またはexpressionについてデコーディングオフセットが 変更にあることに注意してください。
tcp, udp, icmp
下記において:
ip proto p or ip6 proto p
p を上記のいずれかのプロトコルにするのと同等です。
iso proto protocol
パケットが protocol 型のOSIパケットであれば真。Protocol は数値でも次のうちの名前でも良い:clnp, esis, isis
clnp, esis, isis
下記において:
iso proto p
where p を上記のいずれかのプロトコルにするのと同等です。tcpdump はこれらのプロトコルに対しての正確な解析方法は知らないことに注意して下さい。
expr relop expr
関係式が成り立てば真。relop(演算子)は>, <, >=, <=, =, !=, のいずれか一つであり、expr(表現)は製定数による数値表現(表現方法は標準 的なCの文法に従う)、標準的な二項演算子[+, -, *, /, &, |]、長さ演算子、パケットデータアクセス演算子のいずれかです。パケット内のデータに対して適用するにはこのように記述します:
proto [ expr : size ]
Protoether, fddi, tr, ip, arp, rarp, tcp, udp, icmp, ip6, のいずれかで操作対象のプロトコル層を指示します。tcp, udp とその他の上位プロトコル層はIPv4 でのみ利用できて、IPv6 では利用できないことに注意(将来修正される可能性あり)して下さい。指示されたプロトコル層についてのバイトオフセットはexpr で指定します。Size を支持する場合は注目するフィールドでのバイト数で指示しますが、それはone, two, または four のいずれかを用います。指示のない場合は one であるとみなします。長さ演算子はキーワード len で示され、パケットの長さを与えます。

例えば、`ether[0] & 1 != 0' という条件式は全てのマルチキャストによる通信をとらえます。`ip[0] & 0xf != 5' という条件式は全てのオプションつきのIPパケットをとらえます。`ip[6:2] & 0x1fff = 0' という条件式はフラグメントかされていないデータグラムか0番の(最初の)フラグメントだけを表示します。なおこの条件は、tcpudp への適用を示しています。例えば、tcp[0] はTCPheader の最初のバイトを意味していますが、フラグメントの最初のバイトではありません。

幾つかのオフセットやフィールド値は名前よりむしろ数値で表されるかもしれません。次のプロトコルヘッダフィールドオフセットが利用可能で す: icmptype (ICMP type field), icmpcode (ICMP code field),  tcpflags (TCP flags field).

次のICMP型のフィールド値が利用可能です: icmp-echoreply, icmp-unreach, icmp-sourcequench, icmp-redirect, icmp-echo, icmp-routeradvert, icmp-routersolicit, icmp-timxceed, icmp-paramprob, icmp-tstamp, icmp-tstampreply, icmp-ireq, icmp-ireqreply, icmp-maskreq, icmp-maskreply.

次のTCPフラグフィールド値が利用可能です: tcp-fin, tcp-syn, tcp-rst, tcp-push, tcp-push, tcp-ack, tcp-urg.

要素を複合させて用いる場合:


カッコでグループ分けする要素と演算子(カッコはシェルにとっても特別な意味を持つので、エスケープしなければならない)。

否定 (`!' or `not').

結合 (`&&' or `and').

択一 (`||' or `or').

否定は最も高い優先度を持っています。結合と択一は同じで優先度で、左から右へと評価されます。結合は並列するだけでなく、明示的な and トークンが必要となります。

識別子がキーワードなしで現れた場合は、直前に現れたキーワードとみなされます。例えば、

not host vs and ace

not host vs and host ace
の省略であり、これは
not ( host vs or ace )

とは違う。

tcpdump に渡す条件式は都合の良いように、単一としても複数としてもかまいません。一般的に、シェルのメタキャラクタを含むような条件式の場合は単一のクオートし た引数として渡すのがいいかもしれません。複数の引数は評価の直前にスペースで結合されます。


documentation. Copyright (c) 2002-2003 Politecnico di Torino.
2005 translated by Telebusiness,Inc.
 All rights reserved.