Wireshark Tricks

Stephen Brennan • 12 April 2017

This is mostly for my own reference, but maybe others will find it interesting as well.

Remote Monitoring

You can use tcpdump or tshark within a ssh session, but the Wireshark GUI is much more powerful than either of those tools. Here is a useful command that will let you pipe traffic back to your computer for Wireshark monitoring.

ssh HOST tcpdump -U -s0 -n -w - -i INTERFACE "FILTER" | wireshark -k -i -

tcpdump options:

wireshark options:

Of course, you’ll want to make sure that your filter excludes your own SSH connection!

Monitor Within a Network Namespace

I’ve been using mininet to create entire networks consisting of hosts, routers, switches, etc. All of this is on one Linux computer, simply using the power of the “network namespace”. In particular, each host is a network namespace, with its own set of virtual NICs and associated addresses. The Linux kernel networking stack handles all of the protocols as if it were putting the traffic onto the wire, but instead it simply passes it through the virtual interfaces and into the next host or switch. In this way, very large networks can be created, and real programs can be run on these hosts.

Unfortunately, the complexity of network namespaces can make it difficult to monitor such networks. Depending on the network topology you create, there may not be any Mininet NICs visible from your default network namespace. In version 2.23 of util-linux, the nsenter command was created, allowing you to execute a command within any other process’s namespace. So, you could invoke tcpdump like this:

nsenter -t PID --net tcpdump [ARGS...]

All you need to do is specify the PID of the process whose namespace you want to use (you get this in Mininet using the dump command). The --net option tells nsenter that you want to use that process’s network namespace.

This is great, if your distribution has util-linux version 2.23. However, despite this version being released in April 2013, and Ubuntu 14.04 being initially released in April 2014, the trusty util-linux package is still on version 2.20. Classic Ubuntu! So, if you use the current (2017) Mininet VM, you’ll find yourself without this tool. Thankfully, it’s actually quite simple to create your own minimal version of it in just a few lines of C. So simple, in fact, that it is included in the manual page for the setns system call! Here is my own version of this program:

/**
 * nsdo: run a command within a namespace
 */
#define _GNU_SOURCE

#include <sys/stat.h>
#include <fcntl.h>
#include <sched.h>
#include <stdlib.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
        if (argc < 3) {
                fprintf(stderr, "usage: %s NSFILE cmd [args...]", argv[0]);
                return EXIT_FAILURE;
        }

        int fd = open(argv[1], O_RDONLY);
        if (fd < 0) {
                perror("open");
                return EXIT_FAILURE;
        }

        if (setns(fd, 0) == -1) {
                perror("setns");
                return EXIT_FAILURE;
        }

        execvp(argv[2], &argv[2]);
        // If exec*() returns, it's an error
        perror("execvp");
        return EXIT_FAILURE;
}

I name this program nsdo. With it, you can do nearly the same thing you could do with nsenter.

sudo ./nsdo /proc/PID/ns/net tcpdump [ARGS...]
# if this is all local, you can skip the tcpdump shenanigans:
sudo ./nsdo /proc/PID/ns/net wireshark &

This looks a bit different than the nsenter program because the underlying setns system call actually takes a file descriptor pointing to a file in the /proc/ filesystem. Each process has a directory in /proc, and its ns directory contains special files (actually, symlinks that seem broken but aren’t) that correspond to namespaces.

Incidentally, these namespaces underly containerization tools like Docker, so this little tool could likely even be useful for peering into the upside-down that is a Docker container.


LegalRSS

Creative Commons License

Stephen Brennan's Blog is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License