Ethereal-users: Re: [Ethereal-users] filter question
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Guy Harris <guy@xxxxxxxxxx>
Date: Fri, 13 Dec 2002 12:04:47 -0800
On Fri, Dec 13, 2002 at 01:11:08PM -0500, sspencer@xxxxxxxxxx wrote: > How do I build a filter with the following criteria. > > Filter a capture on a specified port , but only if there is a reset. I.e., you want to see all RST packets sent to or from a particular TCP port? If you're talking about a display filter, let's check out the "Filter Expression" dialog box, as popped up by the "Add Expression..." button in the "Display Filter" dialog box popped up by the "Filter:" button on the bottom of the display. If we open up "TCP" in the "Field name" part of the "Filter Expression" dialog box, it has a "Source or Destination Port" item; if we select that, choose "==" as the operator, and supply 666 as the port number, the expression is tcp.port == 666 It also has a "Reset" item; if we select that, and choose the "==" operator, and select "Set" in the "Value" setion, we get tcp.flags.reset == 1 If we want to test for both, we'd do tcp.port == 666 && tcp.flags.reset == 1 However, if you're talking about a capture filter (i.e., capture only RSTs to or from that port), it's different. That is a bit of a pain with older versions of libpcap; the port part is easy - "tcp port 666" - but the RST part has to be done by hand, using the expr relop expr True if the relation holds, where relop is one of >, <, >=, <=, =, !=, and expr is an arithmetic expression composed of integer constants (expressed in standard C syntax), the normal binary operators [+, -, *, /, &, |], a length operator, and special packet data accessors. To access data inside the packet, use the following syntax: proto [ expr : size ] Proto is one of ether, fddi, ip, arp, rarp, tcp, udp, or icmp, and indicates the protocol layer for the index operation. The byte offset, relative to the indicated protocol layer, is given by expr. Size is optional and indicates the number of bytes in the field of interest; it can be either one, two, or four, and defaults to one. The length operator, indicated by the keyword len, gives the length of the packet. For example, `ether[0] & 1 != 0' catches all mul- ticast traffic. The expression `ip[0] & 0xf != 5' catches all IP packets with options. The expres- sion `ip[6:2] & 0x1fff = 0' catches only unfrag- mented datagrams and frag zero of fragmented datagrams. This check is implicitly applied to the tcp and udp index operations. For instance, tcp[0] always means the first byte of the TCP header, and never means the first byte of an intervening fragment. feature. The control bits are in the 13th byte of the TCP header, and the RST bit is 0x04 in that byte; from RFC 793: 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Source Port | Destination Port | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Sequence Number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Acknowledgment Number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Data | |U|A|P|R|S|F| | | Offset| Reserved |R|C|S|S|Y|I| Window | | | |G|K|H|T|N|N| | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Checksum | Urgent Pointer | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Options | Padding | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | data | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ TCP Header Format Note that one tick mark represents one bit position. so that'd be tcp[13] & 0x04 != 0 and the combination expression would be tcp port 666 and (tcp[13] & 0x04 != 0) Newer versions of libpcap let you do that a bit more nicely: Some offsets and field values may be expressed as names rather than as numeric values. The follow- ing protocol header field offsets are available: icmptype (ICMP type field), icmpcode (ICMP code field), and tcpflags (TCP flags field). The following ICMP type field values are avail- able: 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. The following TCP flags field values are avail- able: tcp-fin, tcp-syn, tcp-rst, tcp-push, tcp- push, tcp-ack, tcp-urg. so if you have a newer version, it'd be tcp port 666 and tcp-rst On UNIX, you'd have to do "man tcpdump" to see whether it documents "tcp-rst". On Windows, I think only the 3.0 alpha version of WinPcap supports "tcp-rst", as I think 2.3 is based on an older version - the WinDump man page at http://windump.polito.it/docs/manual.htm doesn't mention tcp-rst.
- References:
- [Ethereal-users] filter question
- From: sspencer
- [Ethereal-users] filter question
- Prev by Date: [Ethereal-users] filter question
- Next by Date: [Ethereal-users] Silly Searching Question
- Previous by thread: [Ethereal-users] filter question
- Next by thread: [Ethereal-users] Silly Searching Question
- Index(es):