2217 lines
71 KiB
Groff
2217 lines
71 KiB
Groff
.\" $NetBSD: tcpdump.8,v 1.14 2006/11/25 16:48:31 christos Exp $
|
|
.\" @(#) Header: /tcpdump/master/tcpdump/tcpdump.1,v 1.148.2.6 2004/03/28 21:25:03 fenner Exp (LBL)
|
|
.\"
|
|
.\"
|
|
.\" Copyright (c) 1987, 1988, 1989, 1990, 1991, 1992, 1994, 1995, 1996, 1997
|
|
.\" The Regents of the University of California. All rights reserved.
|
|
.\" All rights reserved.
|
|
.\"
|
|
.\" Redistribution and use in source and binary forms, with or without
|
|
.\" modification, are permitted provided that: (1) source code distributions
|
|
.\" retain the above copyright notice and this paragraph in its entirety, (2)
|
|
.\" distributions including binary code include the above copyright notice and
|
|
.\" this paragraph in its entirety in the documentation or other materials
|
|
.\" provided with the distribution, and (3) all advertising materials mentioning
|
|
.\" features or use of this software display the following acknowledgement:
|
|
.\" ``This product includes software developed by the University of California,
|
|
.\" Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
|
|
.\" the University nor the names of its contributors may be used to endorse
|
|
.\" or promote products derived from this software without specific prior
|
|
.\" written permission.
|
|
.\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
|
|
.\" WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
|
|
.\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
|
.\"
|
|
.TH TCPDUMP 8 "7 January 2004"
|
|
.SH NAME
|
|
tcpdump \- dump traffic on a network
|
|
.SH SYNOPSIS
|
|
.na
|
|
.B tcpdump
|
|
[
|
|
.B \-AdDeflLnNOpqRStuUvxX
|
|
] [
|
|
.B \-c
|
|
.I count
|
|
]
|
|
.br
|
|
.ti +8
|
|
[
|
|
.B \-C
|
|
.I file_size
|
|
] [
|
|
.B \-F
|
|
.I file
|
|
]
|
|
.br
|
|
.ti +8
|
|
[
|
|
.B \-i
|
|
.I interface
|
|
]
|
|
[
|
|
.B \-m
|
|
.I module
|
|
]
|
|
[
|
|
.B \-r
|
|
.I file
|
|
]
|
|
.br
|
|
.ti +8
|
|
[
|
|
.B \-s
|
|
.I snaplen
|
|
]
|
|
[
|
|
.B \-T
|
|
.I type
|
|
]
|
|
[
|
|
.B \-w
|
|
.I file
|
|
]
|
|
.br
|
|
.ti +8
|
|
[
|
|
.B \-E
|
|
.I spi@ipaddr algo:secret,...
|
|
]
|
|
.br
|
|
.ti +8
|
|
[
|
|
.B \-y
|
|
.I datalinktype
|
|
]
|
|
.ti +8
|
|
[
|
|
.I expression
|
|
]
|
|
.br
|
|
.ad
|
|
.SH DESCRIPTION
|
|
.LP
|
|
\fITcpdump\fP prints out the headers of packets on a network interface
|
|
that match the boolean \fIexpression\fP. It can also be run with the
|
|
.B \-w
|
|
flag, which causes it to save the packet data to a file for later
|
|
analysis, and/or with the
|
|
.B \-r
|
|
flag, which causes it to read from a saved packet file rather than to
|
|
read packets from a network interface. In all cases, only packets that
|
|
match
|
|
.I expression
|
|
will be processed by
|
|
.IR tcpdump .
|
|
.LP
|
|
.I Tcpdump
|
|
will, if not run with the
|
|
.B \-c
|
|
flag, continue capturing packets until it is interrupted by a SIGINT
|
|
signal (generated, for example, by typing your interrupt character,
|
|
typically control-C) or a SIGTERM signal (typically generated with the
|
|
.BR kill (1)
|
|
command); if run with the
|
|
.B \-c
|
|
flag, it will capture packets until it is interrupted by a SIGINT or
|
|
SIGTERM signal or the specified number of packets have been processed.
|
|
.LP
|
|
When
|
|
.I tcpdump
|
|
finishes capturing packets, it will report counts of:
|
|
.IP
|
|
packets ``captured'' (this is the number of packets that
|
|
.I tcpdump
|
|
has received and processed);
|
|
.IP
|
|
packets ``received by filter'' (the meaning of this depends on the OS on
|
|
which you're running
|
|
.IR tcpdump ,
|
|
and possibly on the way the OS was configured - if a filter was
|
|
specified on the command line, on some OSes it counts packets regardless
|
|
of whether they were matched by the filter expression and, even if they
|
|
were matched by the filter expression, regardless of whether
|
|
.I tcpdump
|
|
has read and processed them yet, on other OSes it counts only packets that were
|
|
matched by the filter expression regardless of whether
|
|
.I tcpdump
|
|
has read and processed them yet, and on other OSes it counts only
|
|
packets that were matched by the filter expression and were processed by
|
|
.IR tcpdump );
|
|
.IP
|
|
packets ``dropped by kernel'' (this is the number of packets that were
|
|
dropped, due to a lack of buffer space, by the packet capture mechanism
|
|
in the OS on which
|
|
.I tcpdump
|
|
is running, if the OS reports that information to applications; if not,
|
|
it will be reported as 0).
|
|
.LP
|
|
On platforms that support the SIGINFO signal, such as most BSDs
|
|
(including Mac OS X) and Digital/Tru64 UNIX, it will report those counts
|
|
when it receives a SIGINFO signal (generated, for example, by typing
|
|
your ``status'' character, typically control-T) and will continue
|
|
capturing packets.
|
|
.\" , although on some
|
|
.\" platforms, such as Mac OS X, the ``status'' character is not set by
|
|
.\" default, so you must set it with
|
|
.\" .BR stty (1)
|
|
.\" in order to use it
|
|
.LP
|
|
Reading packets from a network interface may require that you have
|
|
special privileges:
|
|
.\" .TP
|
|
.\" .B Under SunOS 3.x or 4.x with NIT or BPF:
|
|
.\" You must have read access to
|
|
.\" .I /dev/nit
|
|
.\" or
|
|
.\" .IR /dev/bpf* .
|
|
.\" .TP
|
|
.\" .B Under Solaris with DLPI:
|
|
.\" You must have read/write access to the network pseudo device, e.g.
|
|
.\" .IR /dev/le .
|
|
.\" On at least some versions of Solaris, however, this is not sufficient to
|
|
.\" allow
|
|
.\" .I tcpdump
|
|
.\" to capture in promiscuous mode; on those versions of Solaris, you must
|
|
.\" be root, or
|
|
.\" .I tcpdump
|
|
.\" must be installed setuid to root, in order to capture in promiscuous
|
|
.\" mode. Note that, on many (perhaps all) interfaces, if you don't capture
|
|
.\" in promiscuous mode, you will not see any outgoing packets, so a capture
|
|
.\" not done in promiscuous mode may not be very useful.
|
|
.\" .TP
|
|
.\" .B Under HP-UX with DLPI:
|
|
.\" You must be root or
|
|
.\" .I tcpdump
|
|
.\" must be installed setuid to root.
|
|
.\" .TP
|
|
.\" .B Under IRIX with snoop:
|
|
.\" You must be root or
|
|
.\" .I tcpdump
|
|
.\" must be installed setuid to root.
|
|
.\" .TP
|
|
.\" .B Under Linux:
|
|
.\" You must be root or
|
|
.\" .I tcpdump
|
|
.\" must be installed setuid to root (unless your distribution has a kernel
|
|
.\" that supports capability bits such as CAP_NET_RAW and code to allow
|
|
.\" those capability bits to be given to particular accounts and to cause
|
|
.\" those bits to be set on a user's initial processes when they log in, in
|
|
.\" which case you must have CAP_NET_RAW in order to capture and
|
|
.\" CAP_NET_ADMIN to enumerate network devices with, for example, the
|
|
.\" .B \-D
|
|
.\" flag).
|
|
.\" .TP
|
|
.\" .B Under ULTRIX and Digital UNIX/Tru64 UNIX:
|
|
.\" Any user may capture network traffic with
|
|
.\" .IR tcpdump .
|
|
.\" However, no user (not even the super-user) can capture in promiscuous
|
|
.\" mode on an interface unless the super-user has enabled promiscuous-mode
|
|
.\" operation on that interface using
|
|
.\" .IR pfconfig (8),
|
|
.\" and no user (not even the super-user) can capture unicast traffic
|
|
.\" received by or sent by the machine on an interface unless the super-user
|
|
.\" has enabled copy-all-mode operation on that interface using
|
|
.\" .IR pfconfig ,
|
|
.\" so
|
|
.\" .I useful
|
|
.\" packet capture on an interface probably requires that either
|
|
.\" promiscuous-mode or copy-all-mode operation, or both modes of
|
|
.\" operation, be enabled on that interface.
|
|
.\" .TP
|
|
.\" .B Under BSD (this includes Mac OS X):
|
|
You must have read access to
|
|
.IR /dev/bpf .
|
|
On BSDs with a devfs (this includes Mac OS X), this might involve more
|
|
than just having somebody with super-user access setting the ownership
|
|
or permissions on the BPF devices - it might involve configuring devfs
|
|
to set the ownership or permissions every time the system is booted,
|
|
if the system even supports that; if it doesn't support that, you might
|
|
have to find some other way to make that happen at boot time.
|
|
.LP
|
|
Reading a saved packet file doesn't require special privileges.
|
|
.SH OPTIONS
|
|
.TP
|
|
.B \-A
|
|
Print each packet (minus its link level header) in ASCII. Handy for
|
|
capturing web pages.
|
|
.TP
|
|
.B \-a
|
|
Attempt to convert network and broadcast addresses to names.
|
|
.TP
|
|
.B \-c
|
|
Exit after receiving \fIcount\fP packets.
|
|
.TP
|
|
.B \-C
|
|
Before writing a raw packet to a savefile, check whether the file is
|
|
currently larger than \fIfile_size\fP and, if so, close the current
|
|
savefile and open a new one. Savefiles after the first savefile will
|
|
have the name specified with the
|
|
.B \-w
|
|
flag, with a number after it, starting at 2 and continuing upward.
|
|
The units of \fIfile_size\fP are millions of bytes (1,000,000 bytes,
|
|
not 1,048,576 bytes).
|
|
.TP
|
|
.B \-d
|
|
Dump the compiled packet-matching code in a human readable form to
|
|
standard output and stop.
|
|
.TP
|
|
.B \-dd
|
|
Dump packet-matching code as a
|
|
.B C
|
|
program fragment.
|
|
.TP
|
|
.B \-ddd
|
|
Dump packet-matching code as decimal numbers (preceded with a count).
|
|
.TP
|
|
.B \-D
|
|
Print the list of the network interfaces available on the system and on
|
|
which
|
|
.I tcpdump
|
|
can capture packets. For each network interface, a number and an
|
|
interface name, possibly followed by a text description of the
|
|
interface, is printed. The interface name or the number can be supplied
|
|
to the
|
|
.B \-i
|
|
flag to specify an interface on which to capture.
|
|
.IP
|
|
This can be useful on systems that don't have a command to list them
|
|
(e.g., Windows systems, or UNIX systems lacking
|
|
.BR "ifconfig \-a" );
|
|
the number can be useful on Windows 2000 and later systems, where the
|
|
interface name is a somewhat complex string.
|
|
.IP
|
|
The
|
|
.B \-D
|
|
flag will not be supported if
|
|
.I tcpdump
|
|
was built with an older version of
|
|
.I libpcap
|
|
that lacks the
|
|
.B pcap_findalldevs()
|
|
function.
|
|
.TP
|
|
.B \-e
|
|
Print the link-level header on each dump line.
|
|
.TP
|
|
.B \-E
|
|
Use \fIspi@ipaddr algo:secret\fP for decrypting IPsec ESP packets that
|
|
are addressed to \fIaddr\fP and contain Security Parameter Index value
|
|
\fIspi\fP. This combination may be repeated with comma or newline seperation.
|
|
.IP
|
|
Note that setting the secret for IPv4 ESP packets is supported at this time.
|
|
.IP
|
|
Algorithms may be
|
|
\fBdes-cbc\fP,
|
|
\fB3des-cbc\fP,
|
|
\fBblowfish-cbc\fP,
|
|
\fBrc3-cbc\fP,
|
|
\fBcast128-cbc\fP, or
|
|
\fBnone\fP.
|
|
The default is \fBdes-cbc\fP.
|
|
The ability to decrypt packets is only present if \fItcpdump\fP was compiled
|
|
with cryptography enabled.
|
|
.IP
|
|
\fIsecret\fP is the ASCII text for ESP secret key.
|
|
If preceded by 0x, then a hex value will be read.
|
|
.IP
|
|
The option assumes RFC2406 ESP, not RFC1827 ESP.
|
|
The option is only for debugging purposes, and
|
|
the use of this option with a true `secret' key is discouraged.
|
|
By presenting IPsec secret key onto command line
|
|
you make it visible to others, via
|
|
.IR ps (1)
|
|
and other occasions.
|
|
.IP
|
|
In addition to the above syntax, the syntax \fIfile name\fP may be used
|
|
to have tcpdump read the provided file in. The file is opened upon
|
|
receiving the first ESP packet, so any special permissions that tcpdump
|
|
may have been given should already have been given up.
|
|
.TP
|
|
.B \-f
|
|
Print `foreign' IPv4 addresses numerically rather than symbolically
|
|
(this option is intended to get around serious brain damage in
|
|
Sun's NIS server \(em usually it hangs forever translating non-local
|
|
internet numbers).
|
|
.IP
|
|
The test for `foreign' IPv4 addresses is done using the IPv4 address and
|
|
netmask of the interface on which capture is being done. If that
|
|
address or netmask are not available, available, either because the
|
|
interface on which capture is being done has no address or netmask or
|
|
because the capture is being done on the Linux "any" interface, which
|
|
can capture on more than one interface, this option will not work
|
|
correctly.
|
|
.TP
|
|
.B \-F
|
|
Use \fIfile\fP as input for the filter expression.
|
|
An additional expression given on the command line is ignored.
|
|
.TP
|
|
.B \-i
|
|
Listen on \fIinterface\fP.
|
|
If unspecified, \fItcpdump\fP searches the system interface list for the
|
|
lowest numbered, configured up interface (excluding loopback).
|
|
Ties are broken by choosing the earliest match.
|
|
.\" .IP
|
|
.\" On Linux systems with 2.2 or later kernels, an
|
|
.\" .I interface
|
|
.\" argument of ``any'' can be used to capture packets from all interfaces.
|
|
.\" Note that captures on the ``any'' device will not be done in promiscuous
|
|
.\" mode.
|
|
.IP
|
|
If the
|
|
.B \-D
|
|
flag is supported, an interface number as printed by that flag can be
|
|
used as the
|
|
.I interface
|
|
argument.
|
|
.TP
|
|
.B \-l
|
|
Make stdout line buffered.
|
|
Useful if you want to see the data
|
|
while capturing it.
|
|
E.g.,
|
|
.br
|
|
``tcpdump\ \ \-l\ \ |\ \ tee dat'' or
|
|
``tcpdump\ \ \-l \ \ > dat\ \ &\ \ tail\ \ \-f\ \ dat''.
|
|
.TP
|
|
.B \-L
|
|
List the known data link types for the interface and exit.
|
|
.TP
|
|
.B \-m
|
|
Load SMI MIB module definitions from file \fImodule\fR.
|
|
This option
|
|
can be used several times to load several MIB modules into \fItcpdump\fP.
|
|
.TP
|
|
.B \-n
|
|
Don't convert addresses (i.e., host addresses, port numbers, etc.) to names.
|
|
.TP
|
|
.B \-N
|
|
Don't print domain name qualification of host names.
|
|
E.g.,
|
|
if you give this flag then \fItcpdump\fP will print ``nic''
|
|
instead of ``nic.ddn.mil''.
|
|
.TP
|
|
.B \-O
|
|
Do not run the packet-matching code optimizer.
|
|
This is useful only
|
|
if you suspect a bug in the optimizer.
|
|
.TP
|
|
.B \-p
|
|
\fIDon't\fP put the interface
|
|
into promiscuous mode.
|
|
Note that the interface might be in promiscuous
|
|
mode for some other reason; hence, `-p' cannot be used as an abbreviation for
|
|
`ether host {local-hw-addr} or ether broadcast'.
|
|
.TP
|
|
.B \-q
|
|
Quick (quiet?) output.
|
|
Print less protocol information so output
|
|
lines are shorter.
|
|
.TP
|
|
.B \-R
|
|
Assume ESP/AH packets to be based on old specification (RFC1825 to RFC1829).
|
|
If specified, \fItcpdump\fP will not print replay prevention field.
|
|
Since there is no protocol version field in ESP/AH specification,
|
|
\fItcpdump\fP cannot deduce the version of ESP/AH protocol.
|
|
.TP
|
|
.B \-r
|
|
Read packets from \fIfile\fR (which was created with the
|
|
.B \-w
|
|
option).
|
|
Standard input is used if \fIfile\fR is ``-''.
|
|
.TP
|
|
.B \-S
|
|
Print absolute, rather than relative, TCP sequence numbers.
|
|
.TP
|
|
.B \-s
|
|
Snarf \fIsnaplen\fP bytes of data from each packet rather than the
|
|
default of 68 (with SunOS's NIT, the minimum is actually 96).
|
|
68 bytes is adequate for IP, ICMP, TCP
|
|
and UDP but may truncate protocol information from name server and NFS
|
|
packets (see below).
|
|
Packets truncated because of a limited snapshot
|
|
are indicated in the output with ``[|\fIproto\fP]'', where \fIproto\fP
|
|
is the name of the protocol level at which the truncation has occurred.
|
|
Note that taking larger snapshots both increases
|
|
the amount of time it takes to process packets and, effectively,
|
|
decreases the amount of packet buffering.
|
|
This may cause packets to be
|
|
lost.
|
|
You should limit \fIsnaplen\fP to the smallest number that will
|
|
capture the protocol information you're interested in.
|
|
Setting
|
|
\fIsnaplen\fP to 0 means use the required length to catch whole packets.
|
|
.TP
|
|
.B \-T
|
|
Force packets selected by "\fIexpression\fP" to be interpreted the
|
|
specified \fItype\fR.
|
|
Currently known types are
|
|
\fBaodv\fR (Ad-hoc On-demand Distance Vector protocol),
|
|
\fBcnfp\fR (Cisco NetFlow protocol),
|
|
\fBrpc\fR (Remote Procedure Call),
|
|
\fBrtp\fR (Real-Time Applications protocol),
|
|
\fBrtcp\fR (Real-Time Applications control protocol),
|
|
\fBsnmp\fR (Simple Network Management Protocol),
|
|
\fBtftp\fR (Trivial File Transfer Protocol),
|
|
\fBvat\fR (Visual Audio Tool),
|
|
and
|
|
\fBwb\fR (distributed White Board).
|
|
.TP
|
|
.B \-t
|
|
\fIDon't\fP print a timestamp on each dump line.
|
|
.TP
|
|
.B \-tt
|
|
Print an unformatted timestamp on each dump line.
|
|
.TP
|
|
.B \-ttt
|
|
Print a delta (in micro-seconds) between current and previous line
|
|
on each dump line.
|
|
.TP
|
|
.B \-tttt
|
|
Print a timestamp in default format proceeded by date on each dump line.
|
|
.TP
|
|
.B \-u
|
|
Print undecoded NFS handles.
|
|
.TP
|
|
.B \-U
|
|
Make output saved via the
|
|
.B \-w
|
|
option ``packet-buffered''; i.e., as each packet is saved, it will be
|
|
written to the output file, rather than being written only when the
|
|
output buffer fills.
|
|
.IP
|
|
The
|
|
.B \-U
|
|
flag will not be supported if
|
|
.I tcpdump
|
|
was built with an older version of
|
|
.I libpcap
|
|
that lacks the
|
|
.B pcap_dump_flush()
|
|
function.
|
|
.TP
|
|
.B \-v
|
|
(Slightly more) verbose output.
|
|
For example, the time to live,
|
|
identification, total length and options in an IP packet are printed.
|
|
Also enables additional packet integrity checks such as verifying the
|
|
IP and ICMP header checksum.
|
|
.TP
|
|
.B \-vv
|
|
Even more verbose output.
|
|
For example, additional fields are
|
|
printed from NFS reply packets, and SMB packets are fully decoded.
|
|
.TP
|
|
.B \-vvv
|
|
Even more verbose output.
|
|
For example,
|
|
telnet \fBSB\fP ... \fBSE\fP options
|
|
are printed in full.
|
|
With
|
|
.B \-X
|
|
Telnet options are printed in hex as well.
|
|
.TP
|
|
.B \-w
|
|
Write the raw packets to \fIfile\fR rather than parsing and printing
|
|
them out.
|
|
They can later be printed with the \-r option.
|
|
Standard output is used if \fIfile\fR is ``-''.
|
|
.TP
|
|
.B \-x
|
|
Print each packet (minus its link level header) in hex.
|
|
The smaller of the entire packet or
|
|
.I snaplen
|
|
bytes will be printed. Note that this is the entire link-layer
|
|
packet, so for link layers that pad (e.g. Ethernet), the padding bytes
|
|
will also be printed when the higher layer packet is shorter than the
|
|
required padding.
|
|
.TP
|
|
.B \-xx
|
|
Print each packet,
|
|
.I including
|
|
its link level header, in hex.
|
|
.TP
|
|
.B \-X
|
|
Print each packet (minus its link level header) in hex and ASCII.
|
|
This is very handy for analysing new protocols.
|
|
.TP
|
|
.B \-XX
|
|
Print each packet,
|
|
.I including
|
|
its link level header, in hex and ASCII.
|
|
.TP
|
|
.B \-y
|
|
Set the data link type to use while capturing packets to \fIdatalinktype\fP.
|
|
The available data link types may be found using the \-L option.
|
|
.IP "\fI expression\fP"
|
|
.RS
|
|
selects which packets will be dumped.
|
|
If no \fIexpression\fP
|
|
is given, all packets on the net will be dumped.
|
|
Otherwise,
|
|
only packets for which \fIexpression\fP is `true' will be dumped.
|
|
.LP
|
|
The \fIexpression\fP consists of one or more
|
|
.I primitives.
|
|
Primitives usually consist of an
|
|
.I id
|
|
(name or number) preceded by one or more qualifiers.
|
|
There are three
|
|
different kinds of qualifier:
|
|
.IP \fItype\fP
|
|
qualifiers say what kind of thing the id name or number refers to.
|
|
Possible types are
|
|
.BR host ,
|
|
.B net
|
|
and
|
|
.BR port .
|
|
E.g., `host foo', `net 128.3', `port 20'.
|
|
If there is no type
|
|
qualifier,
|
|
.B host
|
|
is assumed.
|
|
.IP \fIdir\fP
|
|
qualifiers specify a particular transfer direction to and/or from
|
|
.IR id .
|
|
Possible directions are
|
|
.BR src ,
|
|
.BR dst ,
|
|
.B "src or dst"
|
|
and
|
|
.B "src and"
|
|
.BR dst .
|
|
E.g., `src foo', `dst net 128.3', `src or dst port ftp-data'.
|
|
If
|
|
there is no dir qualifier,
|
|
.B "src or dst"
|
|
is assumed.
|
|
For some link layers, such as SLIP and the ``cooked'' Linux capture mode
|
|
used for the ``any'' device and for some other device types, the
|
|
.B inbound
|
|
and
|
|
.B outbound
|
|
qualifiers can be used to specify a desired direction.
|
|
.IP \fIproto\fP
|
|
qualifiers restrict the match to a particular protocol.
|
|
Possible
|
|
protos are:
|
|
.BR ether ,
|
|
.BR fddi ,
|
|
.BR tr ,
|
|
.BR wlan ,
|
|
.BR ip ,
|
|
.BR ip6 ,
|
|
.BR arp ,
|
|
.BR rarp ,
|
|
.BR decnet ,
|
|
.B tcp
|
|
and
|
|
.BR udp .
|
|
E.g., `ether src foo', `arp net 128.3', `tcp port 21'.
|
|
If there is
|
|
no proto qualifier, all protocols consistent with the type are
|
|
assumed.
|
|
E.g., `src foo' means `(ip or arp or rarp) src foo'
|
|
(except the latter is not legal syntax), `net bar' means `(ip or
|
|
arp or rarp) net bar' and `port 53' means `(tcp or udp) port 53'.
|
|
.LP
|
|
[`fddi' is actually an alias for `ether'; the parser treats them
|
|
identically as meaning ``the data link level used on the specified
|
|
network interface.'' FDDI headers contain Ethernet-like source
|
|
and destination addresses, and often contain Ethernet-like packet
|
|
types, so you can filter on these FDDI fields just as with the
|
|
analogous Ethernet fields.
|
|
FDDI headers also contain other fields,
|
|
but you cannot name them explicitly in a filter expression.
|
|
.LP
|
|
Similarly, `tr' and `wlan' are aliases for `ether'; the previous
|
|
paragraph's statements about FDDI headers also apply to Token Ring
|
|
and 802.11 wireless LAN headers. For 802.11 headers, the destination
|
|
address is the DA field and the source address is the SA field; the
|
|
BSSID, RA, and TA fields aren't tested.]
|
|
.LP
|
|
In addition to the above, there are some special `primitive' keywords
|
|
that don't follow the pattern:
|
|
.BR gateway ,
|
|
.BR broadcast ,
|
|
.BR less ,
|
|
.B greater
|
|
and arithmetic expressions.
|
|
All of these are described below.
|
|
.LP
|
|
More complex filter expressions are built up by using the words
|
|
.BR and ,
|
|
.B or
|
|
and
|
|
.B not
|
|
to combine primitives.
|
|
E.g., `host foo and not port ftp and not port ftp-data'.
|
|
To save typing, identical qualifier lists can be omitted.
|
|
E.g.,
|
|
`tcp dst port ftp or ftp-data or domain' is exactly the same as
|
|
`tcp dst port ftp or tcp dst port ftp-data or tcp dst port domain'.
|
|
.LP
|
|
Allowable primitives are:
|
|
.IP "\fBdst host \fIhost\fR"
|
|
True if the IPv4/v6 destination field of the packet is \fIhost\fP,
|
|
which may be either an address or a name.
|
|
.IP "\fBsrc host \fIhost\fR"
|
|
True if the IPv4/v6 source field of the packet is \fIhost\fP.
|
|
.IP "\fBhost \fIhost\fP
|
|
True if either the IPv4/v6 source or destination of the packet is \fIhost\fP.
|
|
Any of the above host expressions can be prepended with the keywords,
|
|
\fBip\fP, \fBarp\fP, \fBrarp\fP, or \fBip6\fP as in:
|
|
.in +.5i
|
|
.nf
|
|
\fBip host \fIhost\fR
|
|
.fi
|
|
.in -.5i
|
|
which is equivalent to:
|
|
.in +.5i
|
|
.nf
|
|
\fBether proto \fI\\ip\fB and host \fIhost\fR
|
|
.fi
|
|
.in -.5i
|
|
If \fIhost\fR is a name with multiple IP addresses, each address will
|
|
be checked for a match.
|
|
.IP "\fBether dst \fIehost\fP
|
|
True if the ethernet destination address is \fIehost\fP.
|
|
\fIEhost\fP
|
|
may be either a name from /etc/ethers or a number (see
|
|
.IR ethers (3N)
|
|
for numeric format).
|
|
.IP "\fBether src \fIehost\fP
|
|
True if the ethernet source address is \fIehost\fP.
|
|
.IP "\fBether host \fIehost\fP
|
|
True if either the ethernet source or destination address is \fIehost\fP.
|
|
.IP "\fBgateway\fP \fIhost\fP
|
|
True if the packet used \fIhost\fP as a gateway.
|
|
I.e., the ethernet
|
|
source or destination address was \fIhost\fP but neither the IP source
|
|
nor the IP destination was \fIhost\fP.
|
|
\fIHost\fP must be a name and
|
|
must be found both by the machine's host-name-to-IP-address resolution
|
|
mechanisms (host name file, DNS, NIS, etc.) and by the machine's
|
|
host-name-to-Ethernet-address resolution mechanism (/etc/ethers, etc.).
|
|
(An equivalent expression is
|
|
.in +.5i
|
|
.nf
|
|
\fBether host \fIehost \fBand not host \fIhost\fR
|
|
.fi
|
|
.in -.5i
|
|
which can be used with either names or numbers for \fIhost / ehost\fP.)
|
|
This syntax does not work in IPv6-enabled configuration at this moment.
|
|
.IP "\fBdst net \fInet\fR"
|
|
True if the IPv4/v6 destination address of the packet has a network
|
|
number of \fInet\fP.
|
|
\fINet\fP may be either a name from /etc/networks
|
|
or a network number (see \fInetworks(4)\fP for details).
|
|
.IP "\fBsrc net \fInet\fR"
|
|
True if the IPv4/v6 source address of the packet has a network
|
|
number of \fInet\fP.
|
|
.IP "\fBnet \fInet\fR"
|
|
True if either the IPv4/v6 source or destination address of the packet has a network
|
|
number of \fInet\fP.
|
|
.IP "\fBnet \fInet\fR \fBmask \fInetmask\fR"
|
|
True if the IP address matches \fInet\fR with the specific \fInetmask\fR.
|
|
May be qualified with \fBsrc\fR or \fBdst\fR.
|
|
Note that this syntax is not valid for IPv6 \fInet\fR.
|
|
.IP "\fBnet \fInet\fR/\fIlen\fR"
|
|
True if the IPv4/v6 address matches \fInet\fR with a netmask \fIlen\fR
|
|
bits wide.
|
|
May be qualified with \fBsrc\fR or \fBdst\fR.
|
|
.IP "\fBdst port \fIport\fR"
|
|
True if the packet is ip/tcp, ip/udp, ip6/tcp or ip6/udp and has a
|
|
destination port value of \fIport\fP.
|
|
The \fIport\fP can be a number or a name used in /etc/services (see
|
|
.IR tcp (4P)
|
|
and
|
|
.IR udp (4P)).
|
|
If a name is used, both the port
|
|
number and protocol are checked.
|
|
If a number or ambiguous name is used,
|
|
only the port number is checked (e.g., \fBdst port 513\fR will print both
|
|
tcp/login traffic and udp/who traffic, and \fBport domain\fR will print
|
|
both tcp/domain and udp/domain traffic).
|
|
.IP "\fBsrc port \fIport\fR"
|
|
True if the packet has a source port value of \fIport\fP.
|
|
.IP "\fBport \fIport\fR"
|
|
True if either the source or destination port of the packet is \fIport\fP.
|
|
Any of the above port expressions can be prepended with the keywords,
|
|
\fBtcp\fP or \fBudp\fP, as in:
|
|
.in +.5i
|
|
.nf
|
|
\fBtcp src port \fIport\fR
|
|
.fi
|
|
.in -.5i
|
|
which matches only tcp packets whose source port is \fIport\fP.
|
|
.IP "\fBless \fIlength\fR"
|
|
True if the packet has a length less than or equal to \fIlength\fP.
|
|
This is equivalent to:
|
|
.in +.5i
|
|
.nf
|
|
\fBlen <= \fIlength\fP.
|
|
.fi
|
|
.in -.5i
|
|
.IP "\fBgreater \fIlength\fR"
|
|
True if the packet has a length greater than or equal to \fIlength\fP.
|
|
This is equivalent to:
|
|
.in +.5i
|
|
.nf
|
|
\fBlen >= \fIlength\fP.
|
|
.fi
|
|
.in -.5i
|
|
.IP "\fBip proto \fIprotocol\fR"
|
|
True if the packet is an IP packet (see
|
|
.IR ip (4P))
|
|
of protocol type \fIprotocol\fP.
|
|
\fIProtocol\fP can be a number or one of the names
|
|
\fIicmp\fP, \fIicmp6\fP, \fIigmp\fP, \fIigrp\fP, \fIpim\fP, \fIah\fP,
|
|
\fIesp\fP, \fIvrrp\fP, \fIudp\fP, or \fItcp\fP.
|
|
Note that the identifiers \fItcp\fP, \fIudp\fP, and \fIicmp\fP are also
|
|
keywords and must be escaped via backslash (\\), which is \\\\ in the C-shell.
|
|
Note that this primitive does not chase the protocol header chain.
|
|
.IP "\fBip6 proto \fIprotocol\fR"
|
|
True if the packet is an IPv6 packet of protocol type \fIprotocol\fP.
|
|
Note that this primitive does not chase the protocol header chain.
|
|
.IP "\fBip6 protochain \fIprotocol\fR"
|
|
True if the packet is IPv6 packet,
|
|
and contains protocol header with type \fIprotocol\fR
|
|
in its protocol header chain.
|
|
For example,
|
|
.in +.5i
|
|
.nf
|
|
\fBip6 protochain 6\fR
|
|
.fi
|
|
.in -.5i
|
|
matches any IPv6 packet with TCP protocol header in the protocol header chain.
|
|
The packet may contain, for example,
|
|
authentication header, routing header, or hop-by-hop option header,
|
|
between IPv6 header and TCP header.
|
|
The BPF code emitted by this primitive is complex and
|
|
cannot be optimized by BPF optimizer code in \fItcpdump\fP,
|
|
so this can be somewhat slow.
|
|
.IP "\fBip protochain \fIprotocol\fR"
|
|
Equivalent to \fBip6 protochain \fIprotocol\fR, but this is for IPv4.
|
|
.IP "\fBether broadcast\fR"
|
|
True if the packet is an ethernet broadcast packet.
|
|
The \fIether\fP
|
|
keyword is optional.
|
|
.IP "\fBip broadcast\fR"
|
|
True if the packet is an IPv4 broadcast packet.
|
|
It checks for both the all-zeroes and all-ones broadcast conventions,
|
|
and looks up the subnet mask on the interface on which the capture is
|
|
being done.
|
|
.IP
|
|
If the subnet mask of the interface on which the capture is being done
|
|
is not available, either because the interface on which capture is being
|
|
done has no netmask or because the capture is being done on the Linux
|
|
"any" interface, which can capture on more than one interface, this
|
|
check will not work correctly.
|
|
.IP "\fBether multicast\fR"
|
|
True if the packet is an ethernet multicast packet.
|
|
The \fIether\fP
|
|
keyword is optional.
|
|
This is shorthand for `\fBether[0] & 1 != 0\fP'.
|
|
.IP "\fBip multicast\fR"
|
|
True if the packet is an IP multicast packet.
|
|
.IP "\fBip6 multicast\fR"
|
|
True if the packet is an IPv6 multicast packet.
|
|
.IP "\fBether proto \fIprotocol\fR"
|
|
True if the packet is of ether type \fIprotocol\fR.
|
|
\fIProtocol\fP can be a number or one of the names
|
|
\fIip\fP, \fIip6\fP, \fIarp\fP, \fIrarp\fP, \fIatalk\fP, \fIaarp\fP,
|
|
\fIdecnet\fP, \fIsca\fP, \fIlat\fP, \fImopdl\fP, \fImoprc\fP,
|
|
\fIiso\fP, \fIstp\fP, \fIipx\fP, or \fInetbeui\fP.
|
|
Note these identifiers are also keywords
|
|
and must be escaped via backslash (\\).
|
|
.IP
|
|
[In the case of FDDI (e.g., `\fBfddi protocol arp\fR'), Token Ring
|
|
(e.g., `\fBtr protocol arp\fR'), and IEEE 802.11 wireless LANS (e.g.,
|
|
`\fBwlan protocol arp\fR'), for most of those protocols, the
|
|
protocol identification comes from the 802.2 Logical Link Control (LLC)
|
|
header, which is usually layered on top of the FDDI, Token Ring, or
|
|
802.11 header.
|
|
.IP
|
|
When filtering for most protocol identifiers on FDDI, Token Ring, or
|
|
802.11, \fItcpdump\fR checks only the protocol ID field of an LLC header
|
|
in so-called SNAP format with an Organizational Unit Identifier (OUI) of
|
|
0x000000, for encapsulated Ethernet; it doesn't check whether the packet
|
|
is in SNAP format with an OUI of 0x000000.
|
|
The exceptions are:
|
|
.RS
|
|
.TP
|
|
\fBiso\fP
|
|
\fItcpdump\fR checks the DSAP (Destination Service Access Point) and
|
|
SSAP (Source Service Access Point) fields of the LLC header;
|
|
.TP
|
|
\fBstp\fP and \fInetbeui\fP
|
|
\fItcpdump\fR checks the DSAP of the LLC header;
|
|
.TP
|
|
\fIatalk\fP
|
|
\fItcpdump\fR checks for a SNAP-format packet with an OUI of 0x080007
|
|
and the AppleTalk etype.
|
|
.RE
|
|
.IP
|
|
In the case of Ethernet, \fItcpdump\fR checks the Ethernet type field
|
|
for most of those protocols. The exceptions are:
|
|
.RS
|
|
.TP
|
|
\fBiso\fP, \fBsap\fP, and \fBnetbeui\fP
|
|
\fItcpdump\fR checks for an 802.3 frame and then checks the LLC header as
|
|
it does for FDDI, Token Ring, and 802.11;
|
|
.TP
|
|
\fBatalk\fP
|
|
\fItcpdump\fR checks both for the AppleTalk etype in an Ethernet frame and
|
|
for a SNAP-format packet as it does for FDDI, Token Ring, and 802.11;
|
|
.TP
|
|
\fBaarp\fP
|
|
\fItcpdump\fR checks for the AppleTalk ARP etype in either an Ethernet
|
|
frame or an 802.2 SNAP frame with an OUI of 0x000000;
|
|
.TP
|
|
\fBipx\fP
|
|
\fItcpdump\fR checks for the IPX etype in an Ethernet frame, the IPX
|
|
DSAP in the LLC header, the 802.3-with-no-LLC-header encapsulation of
|
|
IPX, and the IPX etype in a SNAP frame.
|
|
.RE
|
|
.IP "\fBdecnet src \fIhost\fR"
|
|
True if the DECNET source address is
|
|
.IR host ,
|
|
which may be an address of the form ``10.123'', or a DECNET host
|
|
name.
|
|
[DECNET host name support is only available on ULTRIX systems
|
|
that are configured to run DECNET.]
|
|
.IP "\fBdecnet dst \fIhost\fR"
|
|
True if the DECNET destination address is
|
|
.IR host .
|
|
.IP "\fBdecnet host \fIhost\fR"
|
|
True if either the DECNET source or destination address is
|
|
.IR host .
|
|
.IP "\fBifname \fIinterface\fR"
|
|
True if the packet was logged as coming from the specified interface (applies
|
|
only to packets logged by OpenBSD's
|
|
.BR pf (4)).
|
|
.IP "\fBon \fIinterface\fR"
|
|
Synonymous with the
|
|
.B ifname
|
|
modifier.
|
|
.IP "\fBrnr \fInum\fR"
|
|
True if the packet was logged as matching the specified PF rule number
|
|
(applies only to packets logged by OpenBSD's
|
|
.BR pf (4)).
|
|
.IP "\fBrulenum \fInum\fR"
|
|
Synonomous with the
|
|
.B rnr
|
|
modifier.
|
|
.IP "\fBreason \fIcode\fR"
|
|
True if the packet was logged with the specified PF reason code. The known
|
|
codes are:
|
|
.BR match ,
|
|
.BR bad-offset ,
|
|
.BR fragment ,
|
|
.BR short ,
|
|
.BR normalize ,
|
|
and
|
|
.B memory
|
|
(applies only to packets logged by OpenBSD's
|
|
.BR pf (4)).
|
|
.IP "\fBrset \fIname\fR"
|
|
True if the packet was logged as matching the specified PF ruleset
|
|
name of an anchored ruleset (applies only to packets logged by
|
|
.BR pf (4)).
|
|
.IP "\fBruleset \fIname\fR"
|
|
Synonomous with the
|
|
.B rset
|
|
modifier.
|
|
.IP "\fBsrnr \fInum\fR"
|
|
True if the packet was logged as matching the specified PF rule number
|
|
of an anchored ruleset (applies only to packets logged by
|
|
.BR pf (4)).
|
|
.IP "\fBsubrulenum \fInum\fR"
|
|
Synonomous with the
|
|
.B srnr
|
|
modifier.
|
|
.IP "\fBaction \fIact\fR"
|
|
True if PF took the specified action when the packet was logged. Known actions
|
|
are:
|
|
.B pass
|
|
and
|
|
.B block
|
|
(applies only to packets logged by OpenBSD's
|
|
.BR pf (4)).
|
|
.IP "\fBip\fR, \fBip6\fR, \fBarp\fR, \fBrarp\fR, \fBatalk\fR, \fBaarp\fR, \fBdecnet\fR, \fBiso\fR, \fBstp\fR, \fBipx\fR, \fInetbeui\fP"
|
|
Abbreviations for:
|
|
.in +.5i
|
|
.nf
|
|
\fBether proto \fIp\fR
|
|
.fi
|
|
.in -.5i
|
|
where \fIp\fR is one of the above protocols.
|
|
.IP "\fBlat\fR, \fBmoprc\fR, \fBmopdl\fR"
|
|
Abbreviations for:
|
|
.in +.5i
|
|
.nf
|
|
\fBether proto \fIp\fR
|
|
.fi
|
|
.in -.5i
|
|
where \fIp\fR is one of the above protocols.
|
|
Note that
|
|
\fItcpdump\fP does not currently know how to parse these protocols.
|
|
.IP "\fBvlan \fI[vlan_id]\fR"
|
|
True if the packet is an IEEE 802.1Q VLAN packet.
|
|
If \fI[vlan_id]\fR is specified, only true is the packet has the specified
|
|
\fIvlan_id\fR.
|
|
Note that the first \fBvlan\fR keyword encountered in \fIexpression\fR
|
|
changes the decoding offsets for the remainder of \fIexpression\fR
|
|
on the assumption that the packet is a VLAN packet.
|
|
.IP "\fBtcp\fR, \fBudp\fR, \fBicmp\fR"
|
|
Abbreviations for:
|
|
.in +.5i
|
|
.nf
|
|
\fBip proto \fIp\fR\fB or ip6 proto \fIp\fR
|
|
.fi
|
|
.in -.5i
|
|
where \fIp\fR is one of the above protocols.
|
|
.IP "\fBiso proto \fIprotocol\fR"
|
|
True if the packet is an OSI packet of protocol type \fIprotocol\fP.
|
|
\fIProtocol\fP can be a number or one of the names
|
|
\fIclnp\fP, \fIesis\fP, or \fIisis\fP.
|
|
.IP "\fBclnp\fR, \fBesis\fR, \fBisis\fR"
|
|
Abbreviations for:
|
|
.in +.5i
|
|
.nf
|
|
\fBiso proto \fIp\fR
|
|
.fi
|
|
.in -.5i
|
|
where \fIp\fR is one of the above protocols.
|
|
.IP "\fBl1\fR, \fBl2\fR, \fBiih\fR, \fBlsp\fR, \fBsnp\fR, \fBcsnp\fR, \fBpsnp\fR"
|
|
Abbreviations for IS-IS PDU types.
|
|
.IP "\fBvpi\fP \fIn\fR
|
|
True if the packet is an ATM packet, for SunATM on Solaris, with a
|
|
virtual path identifier of
|
|
.IR n .
|
|
.IP "\fBvci\fP \fIn\fR
|
|
True if the packet is an ATM packet, for SunATM on Solaris, with a
|
|
virtual channel identifier of
|
|
.IR n .
|
|
.IP \fBlane\fP
|
|
True if the packet is an ATM packet, for SunATM on Solaris, and is
|
|
an ATM LANE packet.
|
|
Note that the first \fBlane\fR keyword encountered in \fIexpression\fR
|
|
changes the tests done in the remainder of \fIexpression\fR
|
|
on the assumption that the packet is either a LANE emulated Ethernet
|
|
packet or a LANE LE Control packet. If \fBlane\fR isn't specified, the
|
|
tests are done under the assumption that the packet is an
|
|
LLC-encapsulated packet.
|
|
.IP \fBllc\fP
|
|
True if the packet is an ATM packet, for SunATM on Solaris, and is
|
|
an LLC-encapsulated packet.
|
|
.IP \fBoamf4s\fP
|
|
True if the packet is an ATM packet, for SunATM on Solaris, and is
|
|
a segment OAM F4 flow cell (VPI=0 & VCI=3).
|
|
.IP \fBoamf4e\fP
|
|
True if the packet is an ATM packet, for SunATM on Solaris, and is
|
|
an end-to-end OAM F4 flow cell (VPI=0 & VCI=4).
|
|
.IP \fBoamf4\fP
|
|
True if the packet is an ATM packet, for SunATM on Solaris, and is
|
|
a segment or end-to-end OAM F4 flow cell (VPI=0 & (VCI=3 | VCI=4)).
|
|
.IP \fBoam\fP
|
|
True if the packet is an ATM packet, for SunATM on Solaris, and is
|
|
a segment or end-to-end OAM F4 flow cell (VPI=0 & (VCI=3 | VCI=4)).
|
|
.IP \fBmetac\fP
|
|
True if the packet is an ATM packet, for SunATM on Solaris, and is
|
|
on a meta signaling circuit (VPI=0 & VCI=1).
|
|
.IP \fBbcc\fP
|
|
True if the packet is an ATM packet, for SunATM on Solaris, and is
|
|
on a broadcast signaling circuit (VPI=0 & VCI=2).
|
|
.IP \fBsc\fP
|
|
True if the packet is an ATM packet, for SunATM on Solaris, and is
|
|
on a signaling circuit (VPI=0 & VCI=5).
|
|
.IP \fBilmic\fP
|
|
True if the packet is an ATM packet, for SunATM on Solaris, and is
|
|
on an ILMI circuit (VPI=0 & VCI=16).
|
|
.IP \fBconnectmsg\fP
|
|
True if the packet is an ATM packet, for SunATM on Solaris, and is
|
|
on a signaling circuit and is a Q.2931 Setup, Call Proceeding, Connect,
|
|
Connect Ack, Release, or Release Done message.
|
|
.IP \fBmetaconnect\fP
|
|
True if the packet is an ATM packet, for SunATM on Solaris, and is
|
|
on a meta signaling circuit and is a Q.2931 Setup, Call Proceeding, Connect,
|
|
Release, or Release Done message.
|
|
.IP "\fIexpr relop expr\fR"
|
|
True if the relation holds, where \fIrelop\fR is one of >, <, >=, <=, =,
|
|
!=, and \fIexpr\fR 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:
|
|
.in +.5i
|
|
.nf
|
|
\fIproto\fB [ \fIexpr\fB : \fIsize\fB ]\fR
|
|
.fi
|
|
.in -.5i
|
|
\fIProto\fR is one of \fBether, fddi, tr, wlan, ppp, slip, link,
|
|
ip, arp, rarp, tcp, udp, icmp\fR or \fBip6\fR, and
|
|
indicates the protocol layer for the index operation.
|
|
(\fBether, fddi, wlan, tr, ppp, slip\fR and \fBlink\fR all refer to the
|
|
link layer.)
|
|
Note that \fItcp, udp\fR and other upper-layer protocol types only
|
|
apply to IPv4, not IPv6 (this will be fixed in the future).
|
|
The byte offset, relative to the indicated protocol layer, is
|
|
given by \fIexpr\fR.
|
|
\fISize\fR 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 \fBlen\fP, gives the
|
|
length of the packet.
|
|
|
|
For example, `\fBether[0] & 1 != 0\fP' catches all multicast traffic.
|
|
The expression `\fBip[0] & 0xf != 5\fP'
|
|
catches all IP packets with options.
|
|
The expression
|
|
`\fBip[6:2] & 0x1fff = 0\fP'
|
|
catches only unfragmented datagrams and frag zero of fragmented datagrams.
|
|
This check is implicitly applied to the \fBtcp\fP and \fBudp\fP
|
|
index operations.
|
|
For instance, \fBtcp[0]\fP always means the first
|
|
byte of the TCP \fIheader\fP, and never means the first byte of an
|
|
intervening fragment.
|
|
|
|
Some offsets and field values may be expressed as names rather than
|
|
as numeric values.
|
|
The following protocol header field offsets are
|
|
available: \fBicmptype\fP (ICMP type field), \fBicmpcode\fP (ICMP
|
|
code field), and \fBtcpflags\fP (TCP flags field).
|
|
|
|
The following ICMP type field values are available: \fBicmp-echoreply\fP,
|
|
\fBicmp-unreach\fP, \fBicmp-sourcequench\fP, \fBicmp-redirect\fP,
|
|
\fBicmp-echo\fP, \fBicmp-routeradvert\fP, \fBicmp-routersolicit\fP,
|
|
\fBicmp-timxceed\fP, \fBicmp-paramprob\fP, \fBicmp-tstamp\fP,
|
|
\fBicmp-tstampreply\fP, \fBicmp-ireq\fP, \fBicmp-ireqreply\fP,
|
|
\fBicmp-maskreq\fP, \fBicmp-maskreply\fP.
|
|
|
|
The following TCP flags field values are available: \fBtcp-fin\fP,
|
|
\fBtcp-syn\fP, \fBtcp-rst\fP, \fBtcp-push\fP,
|
|
\fBtcp-ack\fP, \fBtcp-urg\fP.
|
|
.LP
|
|
Primitives may be combined using:
|
|
.IP
|
|
A parenthesized group of primitives and operators
|
|
(parentheses are special to the Shell and must be escaped).
|
|
.IP
|
|
Negation (`\fB!\fP' or `\fBnot\fP').
|
|
.IP
|
|
Concatenation (`\fB&&\fP' or `\fBand\fP').
|
|
.IP
|
|
Alternation (`\fB||\fP' or `\fBor\fP').
|
|
.LP
|
|
Negation has highest precedence.
|
|
Alternation and concatenation have equal precedence and associate
|
|
left to right.
|
|
Note that explicit \fBand\fR tokens, not juxtaposition,
|
|
are now required for concatenation.
|
|
.LP
|
|
If an identifier is given without a keyword, the most recent keyword
|
|
is assumed.
|
|
For example,
|
|
.in +.5i
|
|
.nf
|
|
\fBnot host vs and ace\fR
|
|
.fi
|
|
.in -.5i
|
|
is short for
|
|
.in +.5i
|
|
.nf
|
|
\fBnot host vs and host ace\fR
|
|
.fi
|
|
.in -.5i
|
|
which should not be confused with
|
|
.in +.5i
|
|
.nf
|
|
\fBnot ( host vs or ace )\fR
|
|
.fi
|
|
.in -.5i
|
|
.LP
|
|
Expression arguments can be passed to \fItcpdump\fP as either a single
|
|
argument or as multiple arguments, whichever is more convenient.
|
|
Generally, if the expression contains Shell metacharacters, it is
|
|
easier to pass it as a single, quoted argument.
|
|
Multiple arguments are concatenated with spaces before being parsed.
|
|
.SH EXAMPLES
|
|
.LP
|
|
To print all packets arriving at or departing from \fIsundown\fP:
|
|
.RS
|
|
.nf
|
|
\fBtcpdump host sundown\fP
|
|
.fi
|
|
.RE
|
|
.LP
|
|
To print traffic between \fIhelios\fR and either \fIhot\fR or \fIace\fR:
|
|
.RS
|
|
.nf
|
|
\fBtcpdump host helios and \\( hot or ace \\)\fP
|
|
.fi
|
|
.RE
|
|
.LP
|
|
To print all IP packets between \fIace\fR and any host except \fIhelios\fR:
|
|
.RS
|
|
.nf
|
|
\fBtcpdump ip host ace and not helios\fP
|
|
.fi
|
|
.RE
|
|
.LP
|
|
To print all traffic between local hosts and hosts at Berkeley:
|
|
.RS
|
|
.nf
|
|
.B
|
|
tcpdump net ucb-ether
|
|
.fi
|
|
.RE
|
|
.LP
|
|
To print all ftp traffic through internet gateway \fIsnup\fP:
|
|
(note that the expression is quoted to prevent the shell from
|
|
(mis-)interpreting the parentheses):
|
|
.RS
|
|
.nf
|
|
.B
|
|
tcpdump 'gateway snup and (port ftp or ftp-data)'
|
|
.fi
|
|
.RE
|
|
.LP
|
|
To print traffic neither sourced from nor destined for local hosts
|
|
(if you gateway to one other net, this stuff should never make it
|
|
onto your local net).
|
|
.RS
|
|
.nf
|
|
.B
|
|
tcpdump ip and not net \fIlocalnet\fP
|
|
.fi
|
|
.RE
|
|
.LP
|
|
To print the start and end packets (the SYN and FIN packets) of each
|
|
TCP conversation that involves a non-local host.
|
|
.RS
|
|
.nf
|
|
.B
|
|
tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 and not src and dst net \fIlocalnet\fP'
|
|
.fi
|
|
.RE
|
|
.LP
|
|
To print IP packets longer than 576 bytes sent through gateway \fIsnup\fP:
|
|
.RS
|
|
.nf
|
|
.B
|
|
tcpdump 'gateway snup and ip[2:2] > 576'
|
|
.fi
|
|
.RE
|
|
.LP
|
|
To print IP broadcast or multicast packets that were
|
|
.I not
|
|
sent via ethernet broadcast or multicast:
|
|
.RS
|
|
.nf
|
|
.B
|
|
tcpdump 'ether[0] & 1 = 0 and ip[16] >= 224'
|
|
.fi
|
|
.RE
|
|
.LP
|
|
To print all ICMP packets that are not echo requests/replies (i.e., not
|
|
ping packets):
|
|
.RS
|
|
.nf
|
|
.B
|
|
tcpdump 'icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply'
|
|
.fi
|
|
.RE
|
|
.SH OUTPUT FORMAT
|
|
.LP
|
|
The output of \fItcpdump\fP is protocol dependent.
|
|
The following
|
|
gives a brief description and examples of most of the formats.
|
|
.de HD
|
|
.sp 1.5
|
|
.B
|
|
..
|
|
.HD
|
|
Link Level Headers
|
|
.LP
|
|
If the '-e' option is given, the link level header is printed out.
|
|
On ethernets, the source and destination addresses, protocol,
|
|
and packet length are printed.
|
|
.LP
|
|
On FDDI networks, the '-e' option causes \fItcpdump\fP to print
|
|
the `frame control' field, the source and destination addresses,
|
|
and the packet length.
|
|
(The `frame control' field governs the
|
|
interpretation of the rest of the packet.
|
|
Normal packets (such
|
|
as those containing IP datagrams) are `async' packets, with a priority
|
|
value between 0 and 7; for example, `\fBasync4\fR'.
|
|
Such packets
|
|
are assumed to contain an 802.2 Logical Link Control (LLC) packet;
|
|
the LLC header is printed if it is \fInot\fR an ISO datagram or a
|
|
so-called SNAP packet.
|
|
.LP
|
|
On Token Ring networks, the '-e' option causes \fItcpdump\fP to print
|
|
the `access control' and `frame control' fields, the source and
|
|
destination addresses, and the packet length.
|
|
As on FDDI networks,
|
|
packets are assumed to contain an LLC packet.
|
|
Regardless of whether
|
|
the '-e' option is specified or not, the source routing information is
|
|
printed for source-routed packets.
|
|
.LP
|
|
On 802.11 networks, the '-e' option causes \fItcpdump\fP to print
|
|
the `frame control' fields, all of the addresses in the 802.11 header,
|
|
and the packet length.
|
|
As on FDDI networks,
|
|
packets are assumed to contain an LLC packet.
|
|
.LP
|
|
\fI(N.B.: The following description assumes familiarity with
|
|
the SLIP compression algorithm described in RFC-1144.)\fP
|
|
.LP
|
|
On SLIP links, a direction indicator (``I'' for inbound, ``O'' for outbound),
|
|
packet type, and compression information are printed out.
|
|
The packet type is printed first.
|
|
The three types are \fIip\fP, \fIutcp\fP, and \fIctcp\fP.
|
|
No further link information is printed for \fIip\fR packets.
|
|
For TCP packets, the connection identifier is printed following the type.
|
|
If the packet is compressed, its encoded header is printed out.
|
|
The special cases are printed out as
|
|
\fB*S+\fIn\fR and \fB*SA+\fIn\fR, where \fIn\fR is the amount by which
|
|
the sequence number (or sequence number and ack) has changed.
|
|
If it is not a special case,
|
|
zero or more changes are printed.
|
|
A change is indicated by U (urgent pointer), W (window), A (ack),
|
|
S (sequence number), and I (packet ID), followed by a delta (+n or -n),
|
|
or a new value (=n).
|
|
Finally, the amount of data in the packet and compressed header length
|
|
are printed.
|
|
.LP
|
|
For example, the following line shows an outbound compressed TCP packet,
|
|
with an implicit connection identifier; the ack has changed by 6,
|
|
the sequence number by 49, and the packet ID by 6; there are 3 bytes of
|
|
data and 6 bytes of compressed header:
|
|
.RS
|
|
.nf
|
|
\fBO ctcp * A+6 S+49 I+6 3 (6)\fP
|
|
.fi
|
|
.RE
|
|
.HD
|
|
ARP/RARP Packets
|
|
.LP
|
|
Arp/rarp output shows the type of request and its arguments.
|
|
The
|
|
format is intended to be self explanatory.
|
|
Here is a short sample taken from the start of an `rlogin' from
|
|
host \fIrtsg\fP to host \fIcsam\fP:
|
|
.RS
|
|
.nf
|
|
.sp .5
|
|
\f(CWarp who-has csam tell rtsg
|
|
arp reply csam is-at CSAM\fR
|
|
.sp .5
|
|
.fi
|
|
.RE
|
|
The first line says that rtsg sent an arp packet asking
|
|
for the ethernet address of internet host csam.
|
|
Csam
|
|
replies with its ethernet address (in this example, ethernet addresses
|
|
are in caps and internet addresses in lower case).
|
|
.LP
|
|
This would look less redundant if we had done \fItcpdump \-n\fP:
|
|
.RS
|
|
.nf
|
|
.sp .5
|
|
\f(CWarp who-has 128.3.254.6 tell 128.3.254.68
|
|
arp reply 128.3.254.6 is-at 02:07:01:00:01:c4\fP
|
|
.fi
|
|
.RE
|
|
.LP
|
|
If we had done \fItcpdump \-e\fP, the fact that the first packet is
|
|
broadcast and the second is point-to-point would be visible:
|
|
.RS
|
|
.nf
|
|
.sp .5
|
|
\f(CWRTSG Broadcast 0806 64: arp who-has csam tell rtsg
|
|
CSAM RTSG 0806 64: arp reply csam is-at CSAM\fR
|
|
.sp .5
|
|
.fi
|
|
.RE
|
|
For the first packet this says the ethernet source address is RTSG, the
|
|
destination is the ethernet broadcast address, the type field
|
|
contained hex 0806 (type ETHER_ARP) and the total length was 64 bytes.
|
|
.HD
|
|
TCP Packets
|
|
.LP
|
|
\fI(N.B.:The following description assumes familiarity with
|
|
the TCP protocol described in RFC-793.
|
|
If you are not familiar
|
|
with the protocol, neither this description nor \fItcpdump\fP will
|
|
be of much use to you.)\fP
|
|
.LP
|
|
The general format of a tcp protocol line is:
|
|
.RS
|
|
.nf
|
|
.sp .5
|
|
\fIsrc > dst: flags data-seqno ack window urgent options\fP
|
|
.sp .5
|
|
.fi
|
|
.RE
|
|
\fISrc\fP and \fIdst\fP are the source and destination IP
|
|
addresses and ports.
|
|
\fIFlags\fP are some combination of S (SYN),
|
|
F (FIN), P (PUSH), R (RST), W (ECN CWR) or E (ECN-Echo), or a single
|
|
`.' (no flags).
|
|
\fIData-seqno\fP describes the portion of sequence space covered
|
|
by the data in this packet (see example below).
|
|
\fIAck\fP is sequence number of the next data expected the other
|
|
direction on this connection.
|
|
\fIWindow\fP is the number of bytes of receive buffer space available
|
|
the other direction on this connection.
|
|
\fIUrg\fP indicates there is `urgent' data in the packet.
|
|
\fIOptions\fP are tcp options enclosed in angle brackets (e.g., <mss 1024>).
|
|
.LP
|
|
\fISrc, dst\fP and \fIflags\fP are always present.
|
|
The other fields
|
|
depend on the contents of the packet's tcp protocol header and
|
|
are output only if appropriate.
|
|
.LP
|
|
Here is the opening portion of an rlogin from host \fIrtsg\fP to
|
|
host \fIcsam\fP.
|
|
.RS
|
|
.nf
|
|
.sp .5
|
|
\s-2\f(CWrtsg.1023 > csam.login: S 768512:768512(0) win 4096 <mss 1024>
|
|
csam.login > rtsg.1023: S 947648:947648(0) ack 768513 win 4096 <mss 1024>
|
|
rtsg.1023 > csam.login: . ack 1 win 4096
|
|
rtsg.1023 > csam.login: P 1:2(1) ack 1 win 4096
|
|
csam.login > rtsg.1023: . ack 2 win 4096
|
|
rtsg.1023 > csam.login: P 2:21(19) ack 1 win 4096
|
|
csam.login > rtsg.1023: P 1:2(1) ack 21 win 4077
|
|
csam.login > rtsg.1023: P 2:3(1) ack 21 win 4077 urg 1
|
|
csam.login > rtsg.1023: P 3:4(1) ack 21 win 4077 urg 1\fR\s+2
|
|
.sp .5
|
|
.fi
|
|
.RE
|
|
The first line says that tcp port 1023 on rtsg sent a packet
|
|
to port \fIlogin\fP
|
|
on csam.
|
|
The \fBS\fP indicates that the \fISYN\fP flag was set.
|
|
The packet sequence number was 768512 and it contained no data.
|
|
(The notation is `first:last(nbytes)' which means `sequence
|
|
numbers \fIfirst\fP
|
|
up to but not including \fIlast\fP which is \fInbytes\fP bytes of user data'.)
|
|
There was no piggy-backed ack, the available receive window was 4096
|
|
bytes and there was a max-segment-size option requesting an mss of
|
|
1024 bytes.
|
|
.LP
|
|
Csam replies with a similar packet except it includes a piggy-backed
|
|
ack for rtsg's SYN.
|
|
Rtsg then acks csam's SYN.
|
|
The `.' means no
|
|
flags were set.
|
|
The packet contained no data so there is no data sequence number.
|
|
Note that the ack sequence
|
|
number is a small integer (1).
|
|
The first time \fItcpdump\fP sees a
|
|
tcp `conversation', it prints the sequence number from the packet.
|
|
On subsequent packets of the conversation, the difference between
|
|
the current packet's sequence number and this initial sequence number
|
|
is printed.
|
|
This means that sequence numbers after the
|
|
first can be interpreted
|
|
as relative byte positions in the conversation's data stream (with the
|
|
first data byte each direction being `1').
|
|
`-S' will override this
|
|
feature, causing the original sequence numbers to be output.
|
|
.LP
|
|
On the 6th line, rtsg sends csam 19 bytes of data (bytes 2 through 20
|
|
in the rtsg \(-> csam side of the conversation).
|
|
The PUSH flag is set in the packet.
|
|
On the 7th line, csam says it's received data sent by rtsg up to
|
|
but not including byte 21.
|
|
Most of this data is apparently sitting in the
|
|
socket buffer since csam's receive window has gotten 19 bytes smaller.
|
|
Csam also sends one byte of data to rtsg in this packet.
|
|
On the 8th and 9th lines,
|
|
csam sends two bytes of urgent, pushed data to rtsg.
|
|
.LP
|
|
If the snapshot was small enough that \fItcpdump\fP didn't capture
|
|
the full TCP header, it interprets as much of the header as it can
|
|
and then reports ``[|\fItcp\fP]'' to indicate the remainder could not
|
|
be interpreted.
|
|
If the header contains a bogus option (one with a length
|
|
that's either too small or beyond the end of the header), \fItcpdump\fP
|
|
reports it as ``[\fIbad opt\fP]'' and does not interpret any further
|
|
options (since it's impossible to tell where they start).
|
|
If the header
|
|
length indicates options are present but the IP datagram length is not
|
|
long enough for the options to actually be there, \fItcpdump\fP reports
|
|
it as ``[\fIbad hdr length\fP]''.
|
|
.HD
|
|
.B Capturing TCP packets with particular flag combinations (SYN-ACK, URG-ACK, etc.)
|
|
.PP
|
|
There are 8 bits in the control bits section of the TCP header:
|
|
.IP
|
|
.I CWR | ECE | URG | ACK | PSH | RST | SYN | FIN
|
|
.PP
|
|
Let's assume that we want to watch packets used in establishing
|
|
a TCP connection.
|
|
Recall that TCP uses a 3-way handshake protocol
|
|
when it initializes a new connection; the connection sequence with
|
|
regard to the TCP control bits is
|
|
.PP
|
|
.RS
|
|
1) Caller sends SYN
|
|
.RE
|
|
.RS
|
|
2) Recipient responds with SYN, ACK
|
|
.RE
|
|
.RS
|
|
3) Caller sends ACK
|
|
.RE
|
|
.PP
|
|
Now we're interested in capturing packets that have only the
|
|
SYN bit set (Step 1).
|
|
Note that we don't want packets from step 2
|
|
(SYN-ACK), just a plain initial SYN.
|
|
What we need is a correct filter
|
|
expression for \fItcpdump\fP.
|
|
.PP
|
|
Recall the structure of a TCP header without options:
|
|
.PP
|
|
.nf
|
|
0 15 31
|
|
-----------------------------------------------------------------
|
|
| source port | destination port |
|
|
-----------------------------------------------------------------
|
|
| sequence number |
|
|
-----------------------------------------------------------------
|
|
| acknowledgment number |
|
|
-----------------------------------------------------------------
|
|
| HL | rsvd |C|E|U|A|P|R|S|F| window size |
|
|
-----------------------------------------------------------------
|
|
| TCP checksum | urgent pointer |
|
|
-----------------------------------------------------------------
|
|
.fi
|
|
.PP
|
|
A TCP header usually holds 20 octets of data, unless options are
|
|
present.
|
|
The first line of the graph contains octets 0 - 3, the
|
|
second line shows octets 4 - 7 etc.
|
|
.PP
|
|
Starting to count with 0, the relevant TCP control bits are contained
|
|
in octet 13:
|
|
.PP
|
|
.nf
|
|
0 7| 15| 23| 31
|
|
----------------|---------------|---------------|----------------
|
|
| HL | rsvd |C|E|U|A|P|R|S|F| window size |
|
|
----------------|---------------|---------------|----------------
|
|
| | 13th octet | | |
|
|
.fi
|
|
.PP
|
|
Let's have a closer look at octet no. 13:
|
|
.PP
|
|
.nf
|
|
| |
|
|
|---------------|
|
|
|C|E|U|A|P|R|S|F|
|
|
|---------------|
|
|
|7 5 3 0|
|
|
.fi
|
|
.PP
|
|
These are the TCP control bits we are interested
|
|
in.
|
|
We have numbered the bits in this octet from 0 to 7, right to
|
|
left, so the PSH bit is bit number 3, while the URG bit is number 5.
|
|
.PP
|
|
Recall that we want to capture packets with only SYN set.
|
|
Let's see what happens to octet 13 if a TCP datagram arrives
|
|
with the SYN bit set in its header:
|
|
.PP
|
|
.nf
|
|
|C|E|U|A|P|R|S|F|
|
|
|---------------|
|
|
|0 0 0 0 0 0 1 0|
|
|
|---------------|
|
|
|7 6 5 4 3 2 1 0|
|
|
.fi
|
|
.PP
|
|
Looking at the
|
|
control bits section we see that only bit number 1 (SYN) is set.
|
|
.PP
|
|
Assuming that octet number 13 is an 8-bit unsigned integer in
|
|
network byte order, the binary value of this octet is
|
|
.IP
|
|
00000010
|
|
.PP
|
|
and its decimal representation is
|
|
.PP
|
|
.nf
|
|
7 6 5 4 3 2 1 0
|
|
0*2 + 0*2 + 0*2 + 0*2 + 0*2 + 0*2 + 1*2 + 0*2 = 2
|
|
.fi
|
|
.PP
|
|
We're almost done, because now we know that if only SYN is set,
|
|
the value of the 13th octet in the TCP header, when interpreted
|
|
as a 8-bit unsigned integer in network byte order, must be exactly 2.
|
|
.PP
|
|
This relationship can be expressed as
|
|
.RS
|
|
.B
|
|
tcp[13] == 2
|
|
.RE
|
|
.PP
|
|
We can use this expression as the filter for \fItcpdump\fP in order
|
|
to watch packets which have only SYN set:
|
|
.RS
|
|
.B
|
|
tcpdump -i xl0 tcp[13] == 2
|
|
.RE
|
|
.PP
|
|
The expression says "let the 13th octet of a TCP datagram have
|
|
the decimal value 2", which is exactly what we want.
|
|
.PP
|
|
Now, let's assume that we need to capture SYN packets, but we
|
|
don't care if ACK or any other TCP control bit is set at the
|
|
same time.
|
|
Let's see what happens to octet 13 when a TCP datagram
|
|
with SYN-ACK set arrives:
|
|
.PP
|
|
.nf
|
|
|C|E|U|A|P|R|S|F|
|
|
|---------------|
|
|
|0 0 0 1 0 0 1 0|
|
|
|---------------|
|
|
|7 6 5 4 3 2 1 0|
|
|
.fi
|
|
.PP
|
|
Now bits 1 and 4 are set in the 13th octet.
|
|
The binary value of
|
|
octet 13 is
|
|
.IP
|
|
00010010
|
|
.PP
|
|
which translates to decimal
|
|
.PP
|
|
.nf
|
|
7 6 5 4 3 2 1 0
|
|
0*2 + 0*2 + 0*2 + 1*2 + 0*2 + 0*2 + 1*2 + 0*2 = 18
|
|
.fi
|
|
.PP
|
|
Now we can't just use 'tcp[13] == 18' in the \fItcpdump\fP filter
|
|
expression, because that would select only those packets that have
|
|
SYN-ACK set, but not those with only SYN set.
|
|
Remember that we don't care
|
|
if ACK or any other control bit is set as long as SYN is set.
|
|
.PP
|
|
In order to achieve our goal, we need to logically AND the
|
|
binary value of octet 13 with some other value to preserve
|
|
the SYN bit.
|
|
We know that we want SYN to be set in any case,
|
|
so we'll logically AND the value in the 13th octet with
|
|
the binary value of a SYN:
|
|
.PP
|
|
.nf
|
|
|
|
00010010 SYN-ACK 00000010 SYN
|
|
AND 00000010 (we want SYN) AND 00000010 (we want SYN)
|
|
-------- --------
|
|
= 00000010 = 00000010
|
|
.fi
|
|
.PP
|
|
We see that this AND operation delivers the same result
|
|
regardless whether ACK or another TCP control bit is set.
|
|
The decimal representation of the AND value as well as
|
|
the result of this operation is 2 (binary 00000010),
|
|
so we know that for packets with SYN set the following
|
|
relation must hold true:
|
|
.IP
|
|
( ( value of octet 13 ) AND ( 2 ) ) == ( 2 )
|
|
.PP
|
|
This points us to the \fItcpdump\fP filter expression
|
|
.RS
|
|
.B
|
|
tcpdump -i xl0 'tcp[13] & 2 == 2'
|
|
.RE
|
|
.PP
|
|
Note that you should use single quotes or a backslash
|
|
in the expression to hide the AND ('&') special character
|
|
from the shell.
|
|
.HD
|
|
.B
|
|
UDP Packets
|
|
.LP
|
|
UDP format is illustrated by this rwho packet:
|
|
.RS
|
|
.nf
|
|
.sp .5
|
|
\f(CWactinide.who > broadcast.who: udp 84\fP
|
|
.sp .5
|
|
.fi
|
|
.RE
|
|
This says that port \fIwho\fP on host \fIactinide\fP sent a udp
|
|
datagram to port \fIwho\fP on host \fIbroadcast\fP, the Internet
|
|
broadcast address.
|
|
The packet contained 84 bytes of user data.
|
|
.LP
|
|
Some UDP services are recognized (from the source or destination
|
|
port number) and the higher level protocol information printed.
|
|
In particular, Domain Name service requests (RFC-1034/1035) and Sun
|
|
RPC calls (RFC-1050) to NFS.
|
|
.HD
|
|
UDP Name Server Requests
|
|
.LP
|
|
\fI(N.B.:The following description assumes familiarity with
|
|
the Domain Service protocol described in RFC-1035.
|
|
If you are not familiar
|
|
with the protocol, the following description will appear to be written
|
|
in greek.)\fP
|
|
.LP
|
|
Name server requests are formatted as
|
|
.RS
|
|
.nf
|
|
.sp .5
|
|
\fIsrc > dst: id op? flags qtype qclass name (len)\fP
|
|
.sp .5
|
|
\f(CWh2opolo.1538 > helios.domain: 3+ A? ucbvax.berkeley.edu. (37)\fR
|
|
.sp .5
|
|
.fi
|
|
.RE
|
|
Host \fIh2opolo\fP asked the domain server on \fIhelios\fP for an
|
|
address record (qtype=A) associated with the name \fIucbvax.berkeley.edu.\fP
|
|
The query id was `3'.
|
|
The `+' indicates the \fIrecursion desired\fP flag
|
|
was set.
|
|
The query length was 37 bytes, not including the UDP and
|
|
IP protocol headers.
|
|
The query operation was the normal one, \fIQuery\fP,
|
|
so the op field was omitted.
|
|
If the op had been anything else, it would
|
|
have been printed between the `3' and the `+'.
|
|
Similarly, the qclass was the normal one,
|
|
\fIC_IN\fP, and omitted.
|
|
Any other qclass would have been printed
|
|
immediately after the `A'.
|
|
.LP
|
|
A few anomalies are checked and may result in extra fields enclosed in
|
|
square brackets: If a query contains an answer, authority records or
|
|
additional records section,
|
|
.IR ancount ,
|
|
.IR nscount ,
|
|
or
|
|
.I arcount
|
|
are printed as `[\fIn\fPa]', `[\fIn\fPn]' or `[\fIn\fPau]' where \fIn\fP
|
|
is the appropriate count.
|
|
If any of the response bits are set (AA, RA or rcode) or any of the
|
|
`must be zero' bits are set in bytes two and three, `[b2&3=\fIx\fP]'
|
|
is printed, where \fIx\fP is the hex value of header bytes two and three.
|
|
.HD
|
|
UDP Name Server Responses
|
|
.LP
|
|
Name server responses are formatted as
|
|
.RS
|
|
.nf
|
|
.sp .5
|
|
\fIsrc > dst: id op rcode flags a/n/au type class data (len)\fP
|
|
.sp .5
|
|
\f(CWhelios.domain > h2opolo.1538: 3 3/3/7 A 128.32.137.3 (273)
|
|
helios.domain > h2opolo.1537: 2 NXDomain* 0/1/0 (97)\fR
|
|
.sp .5
|
|
.fi
|
|
.RE
|
|
In the first example, \fIhelios\fP responds to query id 3 from \fIh2opolo\fP
|
|
with 3 answer records, 3 name server records and 7 additional records.
|
|
The first answer record is type A (address) and its data is internet
|
|
address 128.32.137.3.
|
|
The total size of the response was 273 bytes,
|
|
excluding UDP and IP headers.
|
|
The op (Query) and response code
|
|
(NoError) were omitted, as was the class (C_IN) of the A record.
|
|
.LP
|
|
In the second example, \fIhelios\fP responds to query 2 with a
|
|
response code of non-existent domain (NXDomain) with no answers,
|
|
one name server and no authority records.
|
|
The `*' indicates that
|
|
the \fIauthoritative answer\fP bit was set.
|
|
Since there were no
|
|
answers, no type, class or data were printed.
|
|
.LP
|
|
Other flag characters that might appear are `\-' (recursion available,
|
|
RA, \fInot\fP set) and `|' (truncated message, TC, set).
|
|
If the
|
|
`question' section doesn't contain exactly one entry, `[\fIn\fPq]'
|
|
is printed.
|
|
.LP
|
|
Note that name server requests and responses tend to be large and the
|
|
default \fIsnaplen\fP of 68 bytes may not capture enough of the packet
|
|
to print.
|
|
Use the \fB\-s\fP flag to increase the snaplen if you
|
|
need to seriously investigate name server traffic.
|
|
`\fB\-s 128\fP'
|
|
has worked well for me.
|
|
|
|
.HD
|
|
SMB/CIFS decoding
|
|
.LP
|
|
\fItcpdump\fP now includes fairly extensive SMB/CIFS/NBT decoding for data
|
|
on UDP/137, UDP/138 and TCP/139.
|
|
Some primitive decoding of IPX and
|
|
NetBEUI SMB data is also done.
|
|
|
|
By default a fairly minimal decode is done, with a much more detailed
|
|
decode done if -v is used.
|
|
Be warned that with -v a single SMB packet
|
|
may take up a page or more, so only use -v if you really want all the
|
|
gory details.
|
|
|
|
If you are decoding SMB sessions containing unicode strings then you
|
|
may wish to set the environment variable USE_UNICODE to 1.
|
|
A patch to
|
|
auto-detect unicode strings would be welcome.
|
|
|
|
For information on SMB packet formats and what all te fields mean see
|
|
www.cifs.org or the pub/samba/specs/ directory on your favorite
|
|
samba.org mirror site.
|
|
The SMB patches were written by Andrew Tridgell
|
|
(tridge@samba.org).
|
|
|
|
.HD
|
|
NFS Requests and Replies
|
|
.LP
|
|
Sun NFS (Network File System) requests and replies are printed as:
|
|
.RS
|
|
.nf
|
|
.sp .5
|
|
\fIsrc.xid > dst.nfs: len op args\fP
|
|
\fIsrc.nfs > dst.xid: reply stat len op results\fP
|
|
.sp .5
|
|
\f(CW
|
|
sushi.6709 > wrl.nfs: 112 readlink fh 21,24/10.73165
|
|
wrl.nfs > sushi.6709: reply ok 40 readlink "../var"
|
|
sushi.201b > wrl.nfs:
|
|
144 lookup fh 9,74/4096.6878 "xcolors"
|
|
wrl.nfs > sushi.201b:
|
|
reply ok 128 lookup fh 9,74/4134.3150
|
|
\fR
|
|
.sp .5
|
|
.fi
|
|
.RE
|
|
In the first line, host \fIsushi\fP sends a transaction with id \fI6709\fP
|
|
to \fIwrl\fP (note that the number following the src host is a
|
|
transaction id, \fInot\fP the source port).
|
|
The request was 112 bytes,
|
|
excluding the UDP and IP headers.
|
|
The operation was a \fIreadlink\fP
|
|
(read symbolic link) on file handle (\fIfh\fP) 21,24/10.731657119.
|
|
(If one is lucky, as in this case, the file handle can be interpreted
|
|
as a major,minor device number pair, followed by the inode number and
|
|
generation number.)
|
|
\fIWrl\fP replies `ok' with the contents of the link.
|
|
.LP
|
|
In the third line, \fIsushi\fP asks \fIwrl\fP to lookup the name
|
|
`\fIxcolors\fP' in directory file 9,74/4096.6878.
|
|
Note that the data printed
|
|
depends on the operation type.
|
|
The format is intended to be self
|
|
explanatory if read in conjunction with
|
|
an NFS protocol spec.
|
|
.LP
|
|
If the \-v (verbose) flag is given, additional information is printed.
|
|
For example:
|
|
.RS
|
|
.nf
|
|
.sp .5
|
|
\f(CW
|
|
sushi.1372a > wrl.nfs:
|
|
148 read fh 21,11/12.195 8192 bytes @ 24576
|
|
wrl.nfs > sushi.1372a:
|
|
reply ok 1472 read REG 100664 ids 417/0 sz 29388
|
|
\fP
|
|
.sp .5
|
|
.fi
|
|
.RE
|
|
(\-v also prints the IP header TTL, ID, length, and fragmentation fields,
|
|
which have been omitted from this example.) In the first line,
|
|
\fIsushi\fP asks \fIwrl\fP to read 8192 bytes from file 21,11/12.195,
|
|
at byte offset 24576.
|
|
\fIWrl\fP replies `ok'; the packet shown on the
|
|
second line is the first fragment of the reply, and hence is only 1472
|
|
bytes long (the other bytes will follow in subsequent fragments, but
|
|
these fragments do not have NFS or even UDP headers and so might not be
|
|
printed, depending on the filter expression used).
|
|
Because the \-v flag
|
|
is given, some of the file attributes (which are returned in addition
|
|
to the file data) are printed: the file type (``REG'', for regular file),
|
|
the file mode (in octal), the uid and gid, and the file size.
|
|
.LP
|
|
If the \-v flag is given more than once, even more details are printed.
|
|
.LP
|
|
Note that NFS requests are very large and much of the detail won't be printed
|
|
unless \fIsnaplen\fP is increased.
|
|
Try using `\fB\-s 192\fP' to watch
|
|
NFS traffic.
|
|
.LP
|
|
NFS reply packets do not explicitly identify the RPC operation.
|
|
Instead,
|
|
\fItcpdump\fP keeps track of ``recent'' requests, and matches them to the
|
|
replies using the transaction ID.
|
|
If a reply does not closely follow the
|
|
corresponding request, it might not be parsable.
|
|
.HD
|
|
AFS Requests and Replies
|
|
.LP
|
|
Transarc AFS (Andrew File System) requests and replies are printed
|
|
as:
|
|
.HD
|
|
.RS
|
|
.nf
|
|
.sp .5
|
|
\fIsrc.sport > dst.dport: rx packet-type\fP
|
|
\fIsrc.sport > dst.dport: rx packet-type service call call-name args\fP
|
|
\fIsrc.sport > dst.dport: rx packet-type service reply call-name args\fP
|
|
.sp .5
|
|
\f(CW
|
|
elvis.7001 > pike.afsfs:
|
|
rx data fs call rename old fid 536876964/1/1 ".newsrc.new"
|
|
new fid 536876964/1/1 ".newsrc"
|
|
pike.afsfs > elvis.7001: rx data fs reply rename
|
|
\fR
|
|
.sp .5
|
|
.fi
|
|
.RE
|
|
In the first line, host elvis sends a RX packet to pike.
|
|
This was
|
|
a RX data packet to the fs (fileserver) service, and is the start of
|
|
an RPC call.
|
|
The RPC call was a rename, with the old directory file id
|
|
of 536876964/1/1 and an old filename of `.newsrc.new', and a new directory
|
|
file id of 536876964/1/1 and a new filename of `.newsrc'.
|
|
The host pike
|
|
responds with a RPC reply to the rename call (which was successful, because
|
|
it was a data packet and not an abort packet).
|
|
.LP
|
|
In general, all AFS RPCs are decoded at least by RPC call name.
|
|
Most
|
|
AFS RPCs have at least some of the arguments decoded (generally only
|
|
the `interesting' arguments, for some definition of interesting).
|
|
.LP
|
|
The format is intended to be self-describing, but it will probably
|
|
not be useful to people who are not familiar with the workings of
|
|
AFS and RX.
|
|
.LP
|
|
If the -v (verbose) flag is given twice, acknowledgement packets and
|
|
additional header information is printed, such as the the RX call ID,
|
|
call number, sequence number, serial number, and the RX packet flags.
|
|
.LP
|
|
If the -v flag is given twice, additional information is printed,
|
|
such as the the RX call ID, serial number, and the RX packet flags.
|
|
The MTU negotiation information is also printed from RX ack packets.
|
|
.LP
|
|
If the -v flag is given three times, the security index and service id
|
|
are printed.
|
|
.LP
|
|
Error codes are printed for abort packets, with the exception of Ubik
|
|
beacon packets (because abort packets are used to signify a yes vote
|
|
for the Ubik protocol).
|
|
.LP
|
|
Note that AFS requests are very large and many of the arguments won't
|
|
be printed unless \fIsnaplen\fP is increased.
|
|
Try using `\fB-s 256\fP'
|
|
to watch AFS traffic.
|
|
.LP
|
|
AFS reply packets do not explicitly identify the RPC operation.
|
|
Instead,
|
|
\fItcpdump\fP keeps track of ``recent'' requests, and matches them to the
|
|
replies using the call number and service ID.
|
|
If a reply does not closely
|
|
follow the
|
|
corresponding request, it might not be parsable.
|
|
|
|
.HD
|
|
KIP AppleTalk (DDP in UDP)
|
|
.LP
|
|
AppleTalk DDP packets encapsulated in UDP datagrams are de-encapsulated
|
|
and dumped as DDP packets (i.e., all the UDP header information is
|
|
discarded).
|
|
The file
|
|
.I /etc/atalk.names
|
|
is used to translate AppleTalk net and node numbers to names.
|
|
Lines in this file have the form
|
|
.RS
|
|
.nf
|
|
.sp .5
|
|
\fInumber name\fP
|
|
|
|
\f(CW1.254 ether
|
|
16.1 icsd-net
|
|
1.254.110 ace\fR
|
|
.sp .5
|
|
.fi
|
|
.RE
|
|
The first two lines give the names of AppleTalk networks.
|
|
The third
|
|
line gives the name of a particular host (a host is distinguished
|
|
from a net by the 3rd octet in the number \-
|
|
a net number \fImust\fP have two octets and a host number \fImust\fP
|
|
have three octets.) The number and name should be separated by
|
|
whitespace (blanks or tabs).
|
|
The
|
|
.I /etc/atalk.names
|
|
file may contain blank lines or comment lines (lines starting with
|
|
a `#').
|
|
.LP
|
|
AppleTalk addresses are printed in the form
|
|
.RS
|
|
.nf
|
|
.sp .5
|
|
\fInet.host.port\fP
|
|
|
|
\f(CW144.1.209.2 > icsd-net.112.220
|
|
office.2 > icsd-net.112.220
|
|
jssmag.149.235 > icsd-net.2\fR
|
|
.sp .5
|
|
.fi
|
|
.RE
|
|
(If the
|
|
.I /etc/atalk.names
|
|
doesn't exist or doesn't contain an entry for some AppleTalk
|
|
host/net number, addresses are printed in numeric form.)
|
|
In the first example, NBP (DDP port 2) on net 144.1 node 209
|
|
is sending to whatever is listening on port 220 of net icsd node 112.
|
|
The second line is the same except the full name of the source node
|
|
is known (`office').
|
|
The third line is a send from port 235 on
|
|
net jssmag node 149 to broadcast on the icsd-net NBP port (note that
|
|
the broadcast address (255) is indicated by a net name with no host
|
|
number \- for this reason it's a good idea to keep node names and
|
|
net names distinct in /etc/atalk.names).
|
|
.LP
|
|
NBP (name binding protocol) and ATP (AppleTalk transaction protocol)
|
|
packets have their contents interpreted.
|
|
Other protocols just dump
|
|
the protocol name (or number if no name is registered for the
|
|
protocol) and packet size.
|
|
|
|
\fBNBP packets\fP are formatted like the following examples:
|
|
.RS
|
|
.nf
|
|
.sp .5
|
|
\s-2\f(CWicsd-net.112.220 > jssmag.2: nbp-lkup 190: "=:LaserWriter@*"
|
|
jssmag.209.2 > icsd-net.112.220: nbp-reply 190: "RM1140:LaserWriter@*" 250
|
|
techpit.2 > icsd-net.112.220: nbp-reply 190: "techpit:LaserWriter@*" 186\fR\s+2
|
|
.sp .5
|
|
.fi
|
|
.RE
|
|
The first line is a name lookup request for laserwriters sent by net icsd host
|
|
112 and broadcast on net jssmag.
|
|
The nbp id for the lookup is 190.
|
|
The second line shows a reply for this request (note that it has the
|
|
same id) from host jssmag.209 saying that it has a laserwriter
|
|
resource named "RM1140" registered on port 250.
|
|
The third line is
|
|
another reply to the same request saying host techpit has laserwriter
|
|
"techpit" registered on port 186.
|
|
|
|
\fBATP packet\fP formatting is demonstrated by the following example:
|
|
.RS
|
|
.nf
|
|
.sp .5
|
|
\s-2\f(CWjssmag.209.165 > helios.132: atp-req 12266<0-7> 0xae030001
|
|
helios.132 > jssmag.209.165: atp-resp 12266:0 (512) 0xae040000
|
|
helios.132 > jssmag.209.165: atp-resp 12266:1 (512) 0xae040000
|
|
helios.132 > jssmag.209.165: atp-resp 12266:2 (512) 0xae040000
|
|
helios.132 > jssmag.209.165: atp-resp 12266:3 (512) 0xae040000
|
|
helios.132 > jssmag.209.165: atp-resp 12266:4 (512) 0xae040000
|
|
helios.132 > jssmag.209.165: atp-resp 12266:5 (512) 0xae040000
|
|
helios.132 > jssmag.209.165: atp-resp 12266:6 (512) 0xae040000
|
|
helios.132 > jssmag.209.165: atp-resp*12266:7 (512) 0xae040000
|
|
jssmag.209.165 > helios.132: atp-req 12266<3,5> 0xae030001
|
|
helios.132 > jssmag.209.165: atp-resp 12266:3 (512) 0xae040000
|
|
helios.132 > jssmag.209.165: atp-resp 12266:5 (512) 0xae040000
|
|
jssmag.209.165 > helios.132: atp-rel 12266<0-7> 0xae030001
|
|
jssmag.209.133 > helios.132: atp-req* 12267<0-7> 0xae030002\fR\s+2
|
|
.sp .5
|
|
.fi
|
|
.RE
|
|
Jssmag.209 initiates transaction id 12266 with host helios by requesting
|
|
up to 8 packets (the `<0-7>').
|
|
The hex number at the end of the line
|
|
is the value of the `userdata' field in the request.
|
|
.LP
|
|
Helios responds with 8 512-byte packets.
|
|
The `:digit' following the
|
|
transaction id gives the packet sequence number in the transaction
|
|
and the number in parens is the amount of data in the packet,
|
|
excluding the atp header.
|
|
The `*' on packet 7 indicates that the
|
|
EOM bit was set.
|
|
.LP
|
|
Jssmag.209 then requests that packets 3 & 5 be retransmitted.
|
|
Helios
|
|
resends them then jssmag.209 releases the transaction.
|
|
Finally,
|
|
jssmag.209 initiates the next request.
|
|
The `*' on the request
|
|
indicates that XO (`exactly once') was \fInot\fP set.
|
|
|
|
.HD
|
|
IP Fragmentation
|
|
.LP
|
|
Fragmented Internet datagrams are printed as
|
|
.RS
|
|
.nf
|
|
.sp .5
|
|
\fB(frag \fIid\fB:\fIsize\fB@\fIoffset\fB+)\fR
|
|
\fB(frag \fIid\fB:\fIsize\fB@\fIoffset\fB)\fR
|
|
.sp .5
|
|
.fi
|
|
.RE
|
|
(The first form indicates there are more fragments.
|
|
The second
|
|
indicates this is the last fragment.)
|
|
.LP
|
|
\fIId\fP is the fragment id.
|
|
\fISize\fP is the fragment
|
|
size (in bytes) excluding the IP header.
|
|
\fIOffset\fP is this
|
|
fragment's offset (in bytes) in the original datagram.
|
|
.LP
|
|
The fragment information is output for each fragment.
|
|
The first
|
|
fragment contains the higher level protocol header and the frag
|
|
info is printed after the protocol info.
|
|
Fragments
|
|
after the first contain no higher level protocol header and the
|
|
frag info is printed after the source and destination addresses.
|
|
For example, here is part of an ftp from arizona.edu to lbl-rtsg.arpa
|
|
over a CSNET connection that doesn't appear to handle 576 byte datagrams:
|
|
.RS
|
|
.nf
|
|
.sp .5
|
|
\s-2\f(CWarizona.ftp-data > rtsg.1170: . 1024:1332(308) ack 1 win 4096 (frag 595a:328@0+)
|
|
arizona > rtsg: (frag 595a:204@328)
|
|
rtsg.1170 > arizona.ftp-data: . ack 1536 win 2560\fP\s+2
|
|
.sp .5
|
|
.fi
|
|
.RE
|
|
There are a couple of things to note here: First, addresses in the
|
|
2nd line don't include port numbers.
|
|
This is because the TCP
|
|
protocol information is all in the first fragment and we have no idea
|
|
what the port or sequence numbers are when we print the later fragments.
|
|
Second, the tcp sequence information in the first line is printed as if there
|
|
were 308 bytes of user data when, in fact, there are 512 bytes (308 in
|
|
the first frag and 204 in the second).
|
|
If you are looking for holes
|
|
in the sequence space or trying to match up acks
|
|
with packets, this can fool you.
|
|
.LP
|
|
A packet with the IP \fIdon't fragment\fP flag is marked with a
|
|
trailing \fB(DF)\fP.
|
|
.HD
|
|
Timestamps
|
|
.LP
|
|
By default, all output lines are preceded by a timestamp.
|
|
The timestamp
|
|
is the current clock time in the form
|
|
.RS
|
|
.nf
|
|
\fIhh:mm:ss.frac\fP
|
|
.fi
|
|
.RE
|
|
and is as accurate as the kernel's clock.
|
|
The timestamp reflects the time the kernel first saw the packet.
|
|
No attempt
|
|
is made to account for the time lag between when the
|
|
ethernet interface removed the packet from the wire and when the kernel
|
|
serviced the `new packet' interrupt.
|
|
.SH "SEE ALSO"
|
|
bpf(4), pcap(3)
|
|
.SH AUTHORS
|
|
The original authors are:
|
|
.LP
|
|
Van Jacobson,
|
|
Craig Leres and
|
|
Steven McCanne, all of the
|
|
Lawrence Berkeley National Laboratory, University of California, Berkeley, CA.
|
|
.LP
|
|
It is currently being maintained by tcpdump.org.
|
|
.LP
|
|
The current version is available via http:
|
|
.LP
|
|
.RS
|
|
.I http://www.tcpdump.org/
|
|
.RE
|
|
.LP
|
|
The original distribution is available via anonymous ftp:
|
|
.LP
|
|
.RS
|
|
.I ftp://ftp.ee.lbl.gov/tcpdump.tar.Z
|
|
.RE
|
|
.LP
|
|
IPv6/IPsec support is added by WIDE/KAME project.
|
|
This program uses Eric Young's SSLeay library, under specific configuration.
|
|
.SH BUGS
|
|
Please send problems, bugs, questions, desirable enhancements, etc. to:
|
|
.LP
|
|
.RS
|
|
tcpdump-workers@tcpdump.org
|
|
.RE
|
|
.LP
|
|
Please send source code contributions, etc. to:
|
|
.LP
|
|
.RS
|
|
patches@tcpdump.org
|
|
.RE
|
|
.\" .LP
|
|
.\" NIT doesn't let you watch your own outbound traffic, BPF will.
|
|
.\" We recommend that you use the latter.
|
|
.\" .LP
|
|
.\" On Linux systems with 2.0[.x] kernels:
|
|
.\" .IP
|
|
.\" packets on the loopback device will be seen twice;
|
|
.\" .IP
|
|
.\" packet filtering cannot be done in the kernel, so that all packets must
|
|
.\" be copied from the kernel in order to be filtered in user mode;
|
|
.\" .IP
|
|
.\" all of a packet, not just the part that's within the snapshot length,
|
|
.\" will be copied from the kernel (the 2.0[.x] packet capture mechanism, if
|
|
.\" asked to copy only part of a packet to userland, will not report the
|
|
.\" true length of the packet; this would cause most IP packets to get an
|
|
.\" error from
|
|
.\" .BR tcpdump );
|
|
.\" .IP
|
|
.\" capturing on some PPP devices won't work correctly.
|
|
.\" .LP
|
|
.\" We recommend that you upgrade to a 2.2 or later kernel.
|
|
.LP
|
|
Some attempt should be made to reassemble IP fragments or, at least
|
|
to compute the right length for the higher level protocol.
|
|
.LP
|
|
Name server inverse queries are not dumped correctly: the (empty)
|
|
question section is printed rather than real query in the answer
|
|
section.
|
|
Some believe that inverse queries are themselves a bug and
|
|
prefer to fix the program generating them rather than \fItcpdump\fP.
|
|
.LP
|
|
A packet trace that crosses a daylight savings time change will give
|
|
skewed time stamps (the time change is ignored).
|
|
.LP
|
|
Filter expressions on fields other than those in Token Ring headers will
|
|
not correctly handle source-routed Token Ring packets.
|
|
.LP
|
|
Filter expressions on fields other than those in 802.11 headers will not
|
|
correctly handle 802.11 data packets with both To DS and From DS set.
|
|
.LP
|
|
.BR "ip6 proto"
|
|
should chase header chain, but at this moment it does not.
|
|
.BR "ip6 protochain"
|
|
is supplied for this behavior.
|
|
.LP
|
|
Arithmetic expression against transport layer headers, like \fBtcp[0]\fP,
|
|
does not work against IPv6 packets.
|
|
It only looks at IPv4 packets.
|