121 lines
5.4 KiB
ReStructuredText
121 lines
5.4 KiB
ReStructuredText
|
Using vpptrace.sh for VPP Packet Tracing
|
|||
|
========================================
|
|||
|
|
|||
|
VPP allows tracing of incoming packets using CLI commands ``trace add``
|
|||
|
and ``show trace`` as explained [here](VPP_PACKET_TRACING_K8S.html), but
|
|||
|
it is a rather cumbersome process.
|
|||
|
|
|||
|
The buffer for captured packets is limited in size, and once it gets
|
|||
|
full the tracing stops. The user has to manually clear the buffer
|
|||
|
content, and then repeat the trace command to resume the packet capture,
|
|||
|
losing information about all packets received in the meantime.
|
|||
|
|
|||
|
Packet filtering exposed via the CLI command ``trace filter`` is also
|
|||
|
quite limited in what it can do. Currently there is just one available
|
|||
|
filter, which allows you to keep only packets that include a certain
|
|||
|
node in the trace or exclude a certain node in the trace. It is not
|
|||
|
possible to filter the traffic by its content (e.g., by the
|
|||
|
source/destination IP address, protocol, etc.).
|
|||
|
|
|||
|
Last but not least, it is not possible to trace packets on a selected
|
|||
|
interface like ``tcpdump``, which allows tracing via the option ``-i``.
|
|||
|
VPP is only able to capture packets on the *RX side* of selected
|
|||
|
*devices* (e.g., dpdk, virtio, af-packet). This means that interfaces
|
|||
|
based on the same device cannot be traced for incoming packets
|
|||
|
individually, but only all at the same time. In Contiv/VPP all pods are
|
|||
|
connected with VPP via the same kind of the TAP interface, meaning that
|
|||
|
it is not possible to capture packets incoming only from one selected
|
|||
|
pod.
|
|||
|
|
|||
|
Contiv/VPP ships with a simple bash script
|
|||
|
`vpptrace.sh <https://github.com/contiv/vpp/blob/master/scripts/vpptrace.sh>`__,
|
|||
|
which helps alleviate the aforementioned VPP limitations. The script
|
|||
|
automatically re-initializes buffers and traces whenever it is close to
|
|||
|
getting full, in order to avoid packet loss as much as possible. Next it
|
|||
|
allows you to filter packets by the content of the trace. There are two
|
|||
|
modes of filtering: - *substring mode* (default): packet trace must
|
|||
|
contain a given sub-string in order to be included in the output -
|
|||
|
*regex mode*: packet trace must match a given regex in order to be
|
|||
|
printed
|
|||
|
|
|||
|
The script is still limited, in that capture runs only on the RX side of
|
|||
|
all interfaces that are built on top of selected devices. Using
|
|||
|
filtering, however, it is possible to limit *traffic by interface*
|
|||
|
simply by using the interface name as a substring to match against.
|
|||
|
|
|||
|
Usage
|
|||
|
-----
|
|||
|
|
|||
|
Run the script with option ``-h`` to get the usage printed:
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
Usage: ./vpptrace.sh [-i <VPP-IF-TYPE>]... [-a <VPP-ADDRESS>] [-r] [-f <REGEXP> / <SUBSTRING>]
|
|||
|
-i <VPP-IF-TYPE> : VPP interface *type* to run the packet capture on (e.g., dpdk-input, virtio-input, etc.)
|
|||
|
- available aliases:
|
|||
|
- af-packet-input: afpacket, af-packet, veth
|
|||
|
- virtio-input: tap (version determined from the VPP runtime config), tap2, tapv2
|
|||
|
- tapcli-rx: tap (version determined from the VPP config), tap1, tapv1
|
|||
|
- dpdk-input: dpdk, gbe, phys*
|
|||
|
- multiple interfaces can be watched at the same time - the option can be repeated with
|
|||
|
different values
|
|||
|
- default = dpdk + tap
|
|||
|
-a <VPP-ADDRESS> : IP address or hostname of the VPP to capture packets from
|
|||
|
- not supported if VPP listens on a UNIX domain socket
|
|||
|
- default = 127.0.0.1
|
|||
|
-r : apply filter string (passed with -f) as a regexp expression
|
|||
|
- by default the filter is NOT treated as regexp
|
|||
|
-f : filter string that packet must contain (without -r) or match as regexp (with -r) to be printed
|
|||
|
- default is no filtering
|
|||
|
|
|||
|
``VPP-IF-TYPE`` is a repeated option used to select the set of devices
|
|||
|
(e.g., virtio, dpdk, etc.) to capture the incoming traffic. Script
|
|||
|
provides multiple aliases, which are much easier to remember than the
|
|||
|
device names. For ``dpdk-input`` one can enter just ``dpdk``, or
|
|||
|
anything starting with ``phys``, etc. For TAPs, the script is even smart
|
|||
|
enough to find out the TAP version used, which allows to enter just
|
|||
|
``tap`` as the device name.
|
|||
|
|
|||
|
If ``VPP-IF-TYPE`` is not specified, then the default behaviour is to
|
|||
|
capture from both ``dpdk`` (traffic entering the node from outside) and
|
|||
|
``tap`` (preferred interface type for pod-VPP and host-VPP
|
|||
|
interconnection, receiving node-initiated traffic).
|
|||
|
|
|||
|
vpptrace.sh can capture packets even from a VPP on a different host,
|
|||
|
provided that VPP-CLI listens on a port, and not on a UNIX domain socket
|
|||
|
(for security reasons IPC is the default communication link, see
|
|||
|
``/etc/vpp/contiv-vswitch.conf``). Enter the destination node IP address
|
|||
|
via the option ``-a``\ (localhost is the default).
|
|||
|
|
|||
|
The capture can be filtered via the ``-f`` option. The output will
|
|||
|
include only packets whose trace matches contain the given
|
|||
|
expression/sub-string.
|
|||
|
|
|||
|
Option ``-r`` enables the regex mode for filtering.
|
|||
|
|
|||
|
Examples
|
|||
|
--------
|
|||
|
|
|||
|
- Capture all packets entering VPP via ``tapcli-1`` interface **AND**
|
|||
|
all packets leaving VPP via ``tapcli-1`` that were sent from a pod,
|
|||
|
or the host on the *same node* (sent from tap, not Gbe):
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
$ vpptrace.sh -i tap -f "tapcli-1"
|
|||
|
|
|||
|
- Capture all packets with source or destination IP address 10.1.1.3:
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
$ vpptrace.sh -i tap -i dpdk -f "10.1.1.3"
|
|||
|
|
|||
|
Or just:
|
|||
|
$ vpptrace.sh "10.1.1.3"
|
|||
|
|
|||
|
- Capture all SYN-ACKs received from outside:
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
$ vpptrace.sh -i dpdk -f "SYN-ACK"
|