Skip to content
🔥 A high-performant UDP-based load generator, written in Rust
Branch: master
Clone or download

README.md

anevicon


An open-source, high-performant traffic generator, designed to be as convenient and reliable as it is possible. It generates numerous UDP packets which lets you test your server against the abnormaly high activity.

Pulse · Stargazers · Releases · Contributing


Table of contents


Advantages

  • Linux-accelerated. Anevicon communicates with a Linux kernel by a few specific system calls to reduce the CPU load significantly. However, it makes the program platform-dependent.

  • Functional. I've tried to implement as many things to make a multi-functional tool and stay simple at the same time. Such features as multiple tests, verbosity levels, and even IP spoofing are supported.

  • Written in Rust. How you can see, all the logic is written completely in Rust, which means that it leverages bare-metal performance and high-level safety (no SIGSEGV, SIGILL, and other "funny" stuff).


Disadvantages

  • Platform-dependend. Like most of pentesting utilities, this project is developed for only Linux-based systems. If you are a Windows user, you probably need a virtual machine or another computer with Linux.

Installation

Building from crates.io

$ cargo install anevicon

Building from sources

$ git clone https://github.com/Gymmasssorla/anevicon.git
$ cd anevicon
$ cargo build --release

Pre-compiled binaries

$ wget https://github.com/Gymmasssorla/anevicon/releases/download/vX.X.X/anevicon-x86_64-linux
$ chmod a+x anevicon-x86_64-linux

Usage

Flags

Name Explanation
-b, --allow-broadcast Allow sockets to send packets to a broadcast address specified using the --receiver option
-h, --help Prints help information
--select-if Displays an interactive menu of network interfaces to use. If unset, a default one will be used
-V, --version Prints version information

Options

Name Value Default Explanation
--date-time-format String %X A format for displaying local date and time in log messages. Type man strftime to see the format specification
--ip-ttl Unsigned integer None Specifies the IP_TTL value for all future sockets. Usually this value equals a number of routers that a packet can go through
--random-packet Positive integer 32768 Repeatedly send a random-generated packet with a specified bytes length
-p, --packets-count Positive integer 18 '446 '744 '073 '709 '551 '615 A count of packets for sending. When this limit is reached, then the program will exit
--packets-per-syscall Positive integer 600 A count of packets which the program will send using only one system call. After the operation completed, a test summary will have been printed
-r, --receiver Socket address None A receiver of generated traffic, specified as an IP-address and a port number, separated by a colon.

This option can be specified several times to identically test multiple receivers in parallel mode.
-f, --send-file Filename None Interpret the specified file content as a single packet and repeatedly send it to each receiver
-m, --send-message String None Interpret the specified UTF-8 encoded text message as a single packet and repeatedly send it to each receiver
--send-periodicity Time span 0secs A time interval between sendmmsg system calls. This option can be used to modify test intensity
-t, --send-timeout Time span 10secs A timeout of sending every single packet. If a timeout is reached, then a packet will be sent later
-s, --sender Socket address 0.0.0.0:0 A sender of generated traffic, specified as an IP-address and a port number, separated by a colon.

A sender may not be a local interface's address, it can be absolutely any valid IPv4/IPv6 address. It can be used to send spoofed packets.
-d, --test-duration Time span 64years 64hours 64secs A whole test duration. When this limit is reached, then the program will exit.

Exit might occur a few seconds later because of long sendmmsg system calls. For more precision, decrease the --packets-per-syscall value.
-v, --verbosity From 0 to 5 3 Enable one of the possible verbosity levels. The zero level doesn't print anything, and the last level prints everything.

Note that specifying the 4 and 5 verbosity levels might decrease performance, do it only for debugging.
-w, --wait Time span 5secs A waiting time span before a test execution used to prevent a launch of an erroneous (unwanted) test

Overview

First of all, please remember that Anevicon uses raw sockets that require root permissions, so in order to run Anevicon you must already have them. Just type the commands below before running Anevicon:

$ sudo -s
$ PATH+=":/home/gymmasssorla/.cargo/bin"

Minimal command

All you need is to provide the testing server address, which consists of an IP address and a port number, separated by the colon character. By default, all sending sockets will have your local address:

# Test example.com:80 using your local address
$ anevicon --receiver=93.184.216.34:80

Test intensity

In some situations, you don't need to transmit the maximum possible amount of packets, you might want to decrease the intensity of packets sending. To do so, there is one more straightforward option called --send-periodicity.

# Test example.com:80 waiting for 270 microseconds after each sendmmsg syscall
$ anevicon --receiver=93.184.216.34:80 --send-periodicity=270us

Multiple receivers

Anevicon also has the functionality to test multiple receivers in parallel mode, thereby distributing the load on your processor cores. To do so, just specify the --receiver option several times.

# Test example.com:80 and google.com:13 in parallel
$ anevicon --receiver=93.184.216.34:80 --receiver=216.58.207.78:13

Network interfaces

There is also an ability to bind all future sockets to a specific network interface. Consider the --select-if flag, which displays an interactive menu of network interfaces in a command line:

# Test example.com with a custom network interface using --select-if
$ anevicon --receiver=93.184.216.34:80 --select-if

Exit conditions

Note that the command above might not work on your system due to the security reasons. To make your test deterministic, there are two end conditions called --test-duration and --packets-count (a test duration and a packets count, respectively):

# Test example.com:80 with the two limit options
$ anevicon --receiver=93.184.216.34:80 --test-duration=3min --packets-count=7000

Custom messages

By default, Anevicon will generate a random packet with a default size (32768). In some kinds of UDP-based tests, packet content makes sense, and this is how you can specify it using the --send-file or --send-message options:

# Test example.com:80 with the custom file 'message.txt'
$ anevicon --receiver=93.184.216.34:80 --send-file="message.txt"

# Test example.com:80 with the custom text message
$ anevicon --receiver=93.184.216.34:80 --send-message="How do you do?"

Also, you are able to specify one or more random packets with your own lengths using the --random-packet option. This example specifies two random-generated packets with the sizes 1454 and 29400:

# Test example.com:80 with two random packets
$ anevicon --receiver=93.184.216.34:80 --random-packet=1454 --random-packet=29400

Logging options

Consider specifying a custom verbosity level from 0 to 5 (inclusively), which is done by the --verbosity option. There is also the --date-time-format option which tells Anevicon to use your custom date-time format.

# Use a custom date-time format and the last verbosity level
$ anevicon --receiver=64.233.165.113:80 --date-time-format="%F" --verbosity=5

Different verbosity levels print different logging types. As you can see in the table below, the zero verbosity level prints nothing, and the last one prints everything. The levels in the middle print logs selectively:

Errors Warnings Notifications Debugs Traces
Zero (0)
First (1)
Second (2)
Third (3)
Fourth (4)
Fifth (5)

IP address spoofing

One of the most interesting options is --sender. It accepts a source address of all future datagrams and can be an absolutely any valid IPv4/IPv6 address, not only your network interface's. Take a look at this example:

# Test example.com:80 using the 172.217.22.14:173 sender
$ anevicon --receiver=93.184.216.34:80 --sender=172.217.22.14:173

The command above will run a test to http://example.com/, assigning source addresses to 172.217.22.14:173 (A Google's IP), therefore, the destination server will be thinking that all the packets are from Google. This is called IP spoofing.

Multiple messages

v5.2.0 introduced the multiple messages functionality, which means that you can specify several messages to be sent to a tested web server (but order is not guaranteed).

# Test example.com:80 with these messages
#   1) A custom file "file.txt";
#   2) A text message "Hello, Pitty! You're my worst friend.";
#   3) A text message "Hello, Scott! This is just a test.";
#   4) A text message "Goodbye, Albret! You're my best friend.";
#   5) A random packet of 5355 bytes;
#   6) A random packet of 2222 bytes.
$ anevicon --receiver=93.184.216.34:80 \
--send-file="file.txt" \
--send-message="Hello, Pitty! You're my worst friend." \
--send-message="Hello, Scott! This is just a test." \
--send-message="Goodbye, Albert! You're my best friend." \
--random-packet=5355 \
--random-packet=2222

Going deeper

Well, it's time to understand the internals of Anevicon. First, it constructs an iterator of N messages (specified by both --send-message, --send-file, and --random-packet), where N is a number of packets specified by --packets-count. Each of these packets is accepted by an optimized sending buffer.

An optimized sending buffer is a data structure representing a sending buffer which can contain M messages, where M is a number of packets transmitted per a sendmmsg system call. When this buffer is full, it flushes all its messages by (surprise!) sendmmsg, thereby providing much better performance than an ordinary buffer.

That is, Anevicon has been designed to minimize a number of system calls to your Linux kernel. Yes, we can instead use such libraries as netmap/PF_RING/DPDK, but then users might be confused with running Anevicon on their systems. Anyway, I think that sendmmsg provides pretty well performance for all needs.

Here is a visual demonstration of the described process. You enter anevicon --receiver=93.184.216.34:80 --packets-count=7 --send-message="First" --send-message="Second" --send-message="Third" --packets-per-syscall=3 and the program generates an iterator over ten messages that will be processed by an optimized sending buffer with the capacity of three:


Contributing

You are always welcome for any contribution to this project! But before you start, you should read the appropriate document to know about the preferred development process and the basic communication rules.


Legal disclaimer

Anevicon was developed as a means of testing stress resistance of web servers, and not for hacking, that is, the author of the project IS NOT RESPONSIBLE for any damage caused by your use of his program.


Contacts

Temirkhan Myrzamadi <gymmasssorla@gmail.com> (the author)

You can’t perform that action at this time.