2014-06-08 20:49:25 +02:00
FastNetMon
2013-11-14 09:23:10 +01:00
===========
2013-10-18 12:09:53 +02:00
2014-06-08 20:42:41 +02:00
FastNetMon - High Performance Network DDoS and Load Analyzer with PCAP/ULOG2/PF_RING support. But I recommends only PF_RING variant because other variants is so slow and use big amount of CPU and expected big packetloss.
2013-10-18 12:21:41 +02:00
2014-06-08 12:06:27 +02:00
What we do? We can detect hosts in OUR network with big amount of packets per second (30 000 pps in standard configuration) incoming or outgoing from certain host. And we can call external bash script which can send notify, switch off server or blackhole this client.
2013-10-22 01:29:00 +02:00
2014-06-08 20:42:41 +02:00
Why you write it? Because we can't find any software for solving this problem not in proprietary world not in open sourcу . NetFlow based solutions is so slow and can't react on atatck with acceptable speed.
2013-10-22 01:29:00 +02:00
2014-06-08 21:34:40 +02:00
At now we start usage of C++11 and you can build this programm only on Debian 7 Wheezy, CentOS 6 has so old g++ compiler and can't compile it (but with CentOS 7 everything will be fine but it's not released yet). But you can use precompiled version on Debian 6, 7 and CentOS 6 without any problems.
2014-06-08 12:06:27 +02:00
2014-06-08 12:29:37 +02:00
Main programm screen image:
2014-06-08 12:30:03 +02:00
2014-06-08 12:29:37 +02:00
![Main screen image ](fastnetmon_screen.png )
2014-06-08 20:42:41 +02:00
Example for cpu load for Intel i7 2600 with Intel X540 NIC on 250 kpps load:
![Cpu consumption ](fastnetmon_stats.png )
2014-06-08 12:29:37 +02:00
2014-06-09 12:03:34 +02:00
At first you should install PF_RING (you can install any latest version):
2014-03-12 09:49:45 +01:00
```bash
cd /usr/src
2014-06-09 12:03:34 +02:00
wget 'http://downloads.sourceforge.net/project/ntop/PF_RING/PF_RING-6.0.1.tar.gz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fntop%2Ffiles%2FPF_RING%2F& ts=1402307916& use_mirror=cznic' -OPF_RING-6.0.1.tar.gz
tar -xf PF_RING-6.0.1.tar.gz
cd PF_RING-6.0.1
2014-06-08 21:34:40 +02:00
# Debian way
2014-03-12 09:49:45 +01:00
apt-get install build-essential bison flex linux-headers-$(uname -r) libnuma-dev
2014-06-08 21:34:40 +02:00
# CentOS
yum install -y make bison flex kernel-devel
# CentOS openvz case
yum install -y make bison flex vzkernel-devel
2014-03-12 09:49:45 +01:00
```
2014-06-08 12:06:27 +02:00
Build PF_RING kernel module:
2014-03-12 09:49:45 +01:00
```bash
cd kernel
make
make install
modprobe pf_ring
```
2014-06-08 21:30:20 +02:00
You can use precompiled and statically linced version of this tool without any compiling:
```bash
mkdir /root/fastnetmon
cd /root/fastnetmon
wget https://raw.githubusercontent.com/FastVPSEestiOu/fastnetmon/master/fastnetmon
chmod +x fastnetmon
./fastnetmon eth0
```
If you want to use static version you can skip this guide to part about "networks_list".
2014-06-08 12:33:48 +02:00
Build lib (We disabled bpf because it requires linking to PCAP):
2014-03-12 09:49:45 +01:00
```bash
cd /usr/src/PF_RING-5.6.2/userland/lib
./configure --disable-bpf --prefix=/opt/pf_ring
```
2014-06-08 20:42:41 +02:00
Install FastNetMon:
```bash
# Debian 7 Wheezy
apt-get install -y git libpcap-dev g++ gcc libboost-all-dev make
# If you need traffic counting
apt-get install -y libhiredis-dev
# If you need PF_RING abilities
apt-get install -y libnuma-dev
# If you need ASN/geoip stats
apt-get install -y libgeoip-dev
cd /usr/src
git clone https://github.com/FastVPSEestiOu/fastnetmon.git
cd fastnetmon
```
2014-03-12 09:49:45 +01:00
You should start fastnetmon using this options:
```bash
LD_LIBRARY_PATH=/opt/pf_ring/lib/ ./fastnetmon eth3,eth4
```
2014-06-08 12:29:37 +02:00
If you want to avoid LD_LIBRARY_PATH on every call you should add pf_ring path to system:
2014-06-05 13:11:24 +02:00
```bash
2014-03-12 10:15:54 +01:00
echo "/opt/pf_ring/lib" > /etc/ld.so.conf.d/pf_ring.conf
ldconfig -v
2014-06-05 13:11:24 +02:00
```
2014-03-12 10:15:54 +01:00
2014-06-08 20:42:41 +02:00
Select backend, we use PF_RING as default, if you need PCAP/ULOG2 you must change variable ENGINE in Makefile.
2013-10-18 12:44:57 +02:00
2013-10-18 12:21:41 +02:00
Compile it:
2013-10-18 12:24:42 +02:00
```bash
2013-11-14 09:23:10 +01:00
make
2013-10-18 12:24:42 +02:00
```
2013-10-18 12:21:41 +02:00
2013-12-28 20:11:20 +01:00
Download GeoIP database to current folder:
```bash
http://dev.maxmind.com/geoip/legacy/geolite/
http://download.maxmind.com/download/geoip/database/asnum/GeoIPASNum.dat.gz
gunzip GeoIPASNum.dat.gz
```
2014-06-09 11:33:43 +02:00
It's REQUIRED to add all your networks in CIDR form to file /etc/networks_list if form when one subnet on one line. Please aggregate your networks because long networks list will significatly slow down programm. And please change REDIS_SUPPORT = yes to no in Makefile if you do not need traffic counting feature. When you running this software in OpenVZ node you may did not specify networks explicitly, we can read it from file /proc/vz/veip.
2014-06-08 12:33:48 +02:00
2014-06-09 14:47:11 +02:00
You can add whitelist subnets in similar form to /etc/networks_whitelist (CIDR masks too).
2014-06-09 12:15:30 +02:00
Copy standard config file to /etc:
```bash
cp fastnetmon.conf /etc/fastnetmon.conf
```
2013-10-18 12:24:42 +02:00
Start it:
```bash
2014-06-09 12:15:30 +02:00
./fastnetmon eth1,eth2
2013-10-18 12:24:42 +02:00
```
2014-06-08 12:29:37 +02:00
2013-10-18 13:35:50 +02:00
Example program screen:
```bash
2014-06-08 20:42:41 +02:00
FastNetMon v1.0 all IPs ordered by: packets
Incoming Traffic 96667 pps 240 mbps
xx.xx.xx.xx 7950 pps 3 mbps
xx.xx.xx.xx 5863 pps 65 mbps
xx.xx.xx.xx 2306 pps 1 mbps
xx.xx.xx.xx 1535 pps 16 mbps
xx.xx.xx.xx 1312 pps 14 mbps
xx.xx.xx.xx 1153 pps 0 mbps
xx.xx.xx.xx 1145 pps 0 mbps
Outgoing traffic 133265 pps 952 mbps
xx.xx.xx.xx 7414 pps 4 mbps
xx.xx.xx.xx 5047 pps 4 mbps
xx.xx.xx.xx 3458 pps 3 mbps
xx.xx.xx.xx 2959 pps 35 mbps
xx.xx.xx.xx 2612 pps 29 mbps
xx.xx.xx.xx 2334 pps 26 mbps
xx.xx.xx.xx 1906 pps 21 mbps
Internal traffic 0 pps
Other traffic 1815 pps
Packets received: 6516913578
Packets dropped: 0
Packets dropped: 0.0 %
Ban list:
yy.yy.yy.yy/20613 pps incoming
2013-10-18 13:35:50 +02:00
```
2013-10-19 17:24:42 +02:00
2014-06-08 12:29:37 +02:00
Enable programm start on server startup, please add to /etc/rc.local this lines:
```bash
cd /root/fastnetmon & & screen -S fastnetmon -d -m ./fastnetmon eth3,eth4
```
2014-06-09 11:33:43 +02:00
When incoming or outgoing attack arrives programm call bash script (when it exists): /usr/local/bin/notify_about_attack.sh two times. First time when threshold exceed (at this step we know IP, direction and power of attack). Second when we collect 100 packets for detailed audit what did happens.
2014-06-08 20:49:25 +02:00
Example of first notification:
```bash
subject: Myflower Guard: IP xx.xx.xx.xx blocked because incoming attack with power 120613 pps
body: blank
```
Example of second notification:
```bash
subject: Myflower Guard: IP xx.xx.xx.xx blocked because incoming attack with power 120613 pps
body:
xx.xx.xx.xx:80 > xx.xx.xx.xx:46804 protocol: tcp size: 233 bytes
xx.xx.xx.xx:80 > xx.xx.xx.xx:46804 protocol: tcp size: 233 bytes
xx.xx.xx.xx:80 > xx.xx.xx.xx:46804 protocol: tcp size: 233 bytes
xx.xx.xx.xx:46804 > xx.xx.xx.xx:80 protocol: tcp size: 52 bytes
xx.xx.xx.xx:46804 > xx.xx.xx.xx:80 protocol: tcp size: 52 bytes
xx.xx.xx.xx:80 > xx.xx.xx.xx:46804 protocol: tcp size: 233 bytes
xx.xx.xx.xx:80 > xx.xx.xx.xx:46804 protocol: tcp size: 233 bytes
xx.xx.xx.xx:46804 > xx.xx.xx.xx:80 protocol: tcp size: 52 bytes
```
2014-03-12 10:15:54 +01:00
I recommend you to disable CPU freq scaling for gain max performance (max frequency):
2014-06-08 20:42:41 +02:00
```bash
2014-03-12 10:15:54 +01:00
echo performance | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
2014-06-08 20:42:41 +02:00
```
2014-03-12 10:15:54 +01:00
2013-10-22 01:29:00 +02:00
You can use this script for irq balancing on heavy loaded networks:
```bash
#!/bin/bash
# from http://habrahabr.ru/post/108240/
ncpus=`grep -ciw ^processor /proc/cpuinfo`
test "$ncpus" -gt 1 || exit 1
n=0
for irq in `cat /proc/interrupts | grep eth | awk '{print $1}' | sed s/\://g`
do
f="/proc/irq/$irq/smp_affinity"
test -r "$f" || continue
cpu=$[$ncpus - ($n % $ncpus) - 1]
if [ $cpu -ge 0 ]
then
mask=`printf %x $[2 ** $cpu]`
echo "Assign SMP affinity: eth queue $n, irq $irq, cpu $cpu, mask 0x$mask"
echo "$mask" > "$f"
let n+=1
fi
done
```
2014-05-08 16:15:51 +02:00
You can find more info and graphics [here ](http://forum.nag.ru/forum/index.php?showtopic=89703 )
2013-10-19 17:24:42 +02:00
Author: Pavel Odintsov pavel.odintsov at gmail.com
2014-06-08 12:06:27 +02:00
2014-06-08 12:33:48 +02:00
Obsolet documentation.
Install guide in CentOS 6:
2014-06-08 12:06:27 +02:00
```bash
# CentOS 6
yum install -y git libpcap-devel gcc-c++ boost-devel boost make
```
2014-06-08 12:33:48 +02:00
Server configuration for PCAP: no configuration needed
Server configuration for ULOG2:
```bash
iptables -A FORWARD -i br0 -j ULOG --ulog-nlgroup 1 --ulog-cprange 32 --ulog-qthreshold 45
```
If you use PCAP, u can set monitored interface as command line parameter (u can set 'any' as inerface name but it work not so fine):
```bash
./fastnetmon br0
```