Categorygithub.com/controlplaneio/netassertv2-packet-sniffer

# README

Netassertv2-Packet-Sniffer

Testing Workflow Release Workflow

The Netassertv2-Packet-Sniffer is a Go program designed to sniff layer 4 (TCP or UDP) traffic and identify specific strings within it. It accepts the following environment variables:

Environment VariableGo TypeDefault ValuePurpose
IFACEstringeth0The network interface to listen on
SNAPLENint1024The packet snap length
PROMISCboolfalseShould the network interface be set to Promiscuous mode
SEARCH_STRINGstringcontrol-plane.ioThe string to search in the TCP/UDP packet
PROTOCOLstringtcpThe protocol we are interested in, can be tcp or udp
MATCHESint3The number of matches after which the program will exit with a status code of 0
TIMEOUT_SECONDSint60The total duration during which we will capture the traffic. If we do not get enough matches (defined by $MATCHES) during this time, we exit with a status code of 1

If the specified number of matches are found within the defined timeout period, the program will exit with a status code of 0. If the required matches are not found within the given time, the program will exit with a status code of 1. The program does not need to run with root privileges(uid:gid 0:0) but it requires the CAP_NET_RAW capability. It is allowed by default by many container runtimes so no action should be needed, otherwise it can be explicitly set using --cap-add NET_RAW (Docker example). The Sniffer binary has already associated the aforementioned capability in the Docker image

setcap cap_net_raw+ep /usr/bin/packet-capture

You can pull the latest Docker image from docker.io/controlplane/netassertv2-packet-sniffer:latest

Libpcap Prerequisite

  • This program uses the Go Packet library for packet processing and uses C Bindings for libpcap. Therefore, you need to install libpacp dependencies for your OS to compile the program.
For Fedora/RHEL/CentOS
$ sudo dnf install libpcap-devel
For Debian/Ubuntu
$ sudo apt update && sudo apt install libpcap-dev -y

Local testing

You can build and test the binary with the help of netcat server. To test the TCP protocol, run the following commands on different terminals:

In the first terminal run the packet sniffer, you will need to enter sudo password:

❯ make run-tcp
sudo bin/packet-capture -protocol=tcp -interface=lo -matches 3
2023-03-06T17:01:35.198Z	info	netassertv2-packet-sniffer/main.go:70	Working with following configuration:
{NetworkInterface:lo SnapLen:1024 Promisc:false SearchString:control-plane.io Protocol:tcp Environment:production NumberOfMatches:3 TimeoutSeconds:60}
	{"service": "packet-capture", "version": "development"}
2023-03-06T17:01:35.236Z	info	netassertv2-packet-sniffer/main.go:98	capturing "tcp" traffic on "lo" interface	{"service": "packet-capture", "version": "development"}
2023-03-06T17:01:35.236Z	info	netassertv2-packet-sniffer/main.go:101	starting to process packets	{"service": "packet-capture", "version": "development"}
...
....

This will launch the packet sniffer which will capture TCP traffic on local loopback adapater and search for string control-plane.io in the captured TCP packets.

In the second terminal run a netcat server the listens on port 12345:


❯ make run-netcat-tcp-server
while true; do nc -vl localhost 12345; done
Listening on view-localhost 12345

In the third terminal run a netcat client that will connect to the server on localhost:12345 and send packet with payload control-plane.io


❯ make run-netcat-tcp-client
for i in `seq 1 4`; do echo 'control-plane.io' | nc -q 1 -v localhost 12345; done
Connection to localhost (127.0.0.1) 12345 port [tcp/*] succeeded!
Connection to localhost (127.0.0.1) 12345 port [tcp/*] succeeded!
Connection to localhost (127.0.0.1) 12345 port [tcp/*] succeeded!
Connection to localhost (127.0.0.1) 12345 port [tcp/*] succeeded!

The sniffer on the first terminal should exit with the following message:

2023-03-06T17:04:18.654Z	info	netassertv2-packet-sniffer/main.go:140	number of matches reached{"service": "packet-capture", "version": "development"}

# Packages

No description provided by the author