| PF_RING support of snort DAQ for snort 2.9 (and later) |
| ------------------------------------------------------ |
| |
| |
| Prerequisites |
| ------------- |
| Make sure you have installed: |
| - snort with DAQ include files/libraries (0.6.2, 1.1.1, and 2.0). You can |
| do that downloading snort and DAQ from http://www.snort.org/snort-downloads? |
| - cd ~/PF_RING/kernel |
| sudo make install |
| - For best performance please use PF_RING DNA that supports both IPS and IDS mode |
| - make sure you have installed |
| - autoconf |
| - automake |
| - libtool |
| - all gcc toolchain |
| |
| Compilation |
| ----------- |
| # autoreconf -ivf |
| # ./configure |
| # make |
| |
| Configure Options |
| ----------------- |
| If you do not have PF_RING installed, nor in the "$HOME/PF_RING" path, |
| a few configure options are available: |
| |
| --with-libpfring-includes=<libpfring include directory> |
| --with-pfring-kernel-includes=<pfring kernel include directory> |
| --with-libpfring-libraries=<libpfring library directory> |
| |
| Installation |
| ------------ |
| You can do: |
| # sudo cp .libs/daq_pfring.so /usr/local/lib/daq/ |
| or |
| # sudo make install |
| |
| if you want to run snort without installing it use "--daq-dir=./.libs" |
| |
| |
| Running snort in IDS mode |
| ------------------------- |
| # snort --daq-dir=/usr/local/lib/daq --daq pfring --daq-mode passive -i ethX -v -e |
| |
| It is possible to specify multiple interfaces by using a comma-separated list. |
| |
| Running snort in IPS mode |
| ------------------------- |
| # snort --daq-dir=/usr/local/lib/daq --daq pfring -i ethX:ethY -e -Q |
| |
| It is possible to specify multiple interface pairs by using a comma-separated list. |
| |
| PF_RING DAQ Specific Options |
| ---------------------------- |
| 1. Kernel Filters |
| By default, PF_RING kernel filtering rules are added whenever snort's verdict |
| requests to drop specific flows. If you want instead snort (and not PF_RING) |
| drop packets (i.e. don't add automatically PF_RING kernel filtering rules) |
| add: |
| |
| --daq-var no-kernel-filters |
| |
| Kernel filtering rules idle for more than 5 minutes are automatically removed. |
| In order to change the default timeout for idle rules do: |
| |
| --daq-var kernel-filters-idle-timeout=<seconds> |
| |
| 2. Socket clustering |
| PF_RING allows you to distribute packets across multiple processes by using |
| socket clusters. For instance two snort instances bound to the same clusterId |
| receive each a subset of packets so that both can cooperatively share the load. |
| In order to enable this feature do: |
| |
| --daq-var clusterid=<comma separated id list> |
| |
| where an id is a number (i.e. the clusterId), one for each interface. |
| It is also possible to specify the cluster mode, with: |
| |
| --daq-var clustermode=<mode> |
| |
| where valid mode values are: |
| - 2 for 2-tuple flow |
| - 4 for 4-tuple flow |
| - 5 for 5-tuple flow |
| - 6 for 6-tuple flow |
| |
| 3. Bind an instance to a core |
| Proper core insulation, grants snort instances not to step on each other's feet. |
| In order to bind an instance to a specific core do: |
| |
| --daq-var bindcpu=<core id> |
| |
| 4. Kernel-level forwarding in IDS mode |
| If you want to forward incoming packets at kernel level while snort is running in |
| IDS mode, you can specify a destination interface for each ingress interface with: |
| |
| --daq-var lowlevelbridge=<comma-separated interface list> |
| |
| 5. Fast TX in IPS mode |
| Since forwarding packets from userspace requires additional copies (thus affecting |
| performances), it is possible to forward at kernel level the packets for which snort |
| gives a positive verdict: |
| |
| --daq-var fast-tx |
| |
| 6. Packet capture tuning |
| It is possible to tune the packet capture activity specifying the poll() timeout: |
| |
| --daq-var timeout=<milliseconds> |
| |
| and the watermark (min number of incoming packets for the poll() to return): |
| |
| --daq-var watermark=<packets> |
| |
| |
| Example of Clustering + Core Binding |
| ------------------------------------ |
| |
| IDS |
| ---- |
| snort -q --pid-path /var/run --create-pidfile -D -c /etc/snort/snort.conf -l /var/log/snort/bpbr0/instance-1 --daq-dir=/usr/local/lib/daq --daq pfring --daq-mode passive -i eth2,eth3 --daq-var lowlevelbridge=eth3,eth2 --daq-var clusterid=10,11 --daq-var bindcpu=1 |
| snort -q --pid-path /var/run --create-pidfile -D -c /etc/snort/snort.conf -l /var/log/snort/bpbr0/instance-2 --daq-dir=/usr/local/lib/daq --daq pfring --daq-mode passive -i eth2,eth3 --daq-var lowlevelbridge=eth3,eth2 --daq-var clusterid=10,11 --daq-var bindcpu=2 |
| snort -q --pid-path /var/run --create-pidfile -D -c /etc/snort/snort.conf -l /var/log/snort/bpbr0/instance-3 --daq-dir=/usr/local/lib/daq --daq pfring --daq-mode passive -i eth2,eth3 --daq-var lowlevelbridge=eth3,eth2 --daq-var clusterid=10,11 --daq-var bindcpu=3 |
| snort -q --pid-path /var/run --create-pidfile -D -c /etc/snort/snort.conf -l /var/log/snort/bpbr0/instance-4 --daq-dir=/usr/local/lib/daq --daq pfring --daq-mode passive -i eth2,eth3 --daq-var lowlevelbridge=eth3,eth2 --daq-var clusterid=10,11 --daq-var bindcpu=4 |
| |
| IPS |
| ---- |
| snort -q --pid-path /var/run --create-pidfile -D -c /etc/snort/snort.conf -l /var/log/snort/bpbr0/instance-1 --daq-dir=/usr/local/lib/daq --daq pfring --daq-mode inline -i eth2:eth3 --daq-var fast-tx=1 --daq-var clusterid=10,11 --daq-var bindcpu=1 |
| snort -q --pid-path /var/run --create-pidfile -D -c /etc/snort/snort.conf -l /var/log/snort/bpbr0/instance-2 --daq-dir=/usr/local/lib/daq --daq pfring --daq-mode inline -i eth2:eth3 --daq-var fast-tx=1 --daq-var clusterid=10,11 --daq-var bindcpu=2 |
| snort -q --pid-path /var/run --create-pidfile -D -c /etc/snort/snort.conf -l /var/log/snort/bpbr0/instance-3 --daq-dir=/usr/local/lib/daq --daq pfring --daq-mode inline -i eth2:eth3 --daq-var fast-tx=1 --daq-var clusterid=10,11 --daq-var bindcpu=3 |
| snort -q --pid-path /var/run --create-pidfile -D -c /etc/snort/snort.conf -l /var/log/snort/bpbr0/instance-4 --daq-dir=/usr/local/lib/daq --daq pfring --daq-mode inline -i eth2:eth3 --daq-var fast-tx=1 --daq-var clusterid=10,11 --daq-var bindcpu=4 |
| |
| ---- |
| Luca Deri <deri@ntop.org> |
| Alfredo Cardigliano <cardigliano@ntop.org> |
| July 2012 |
| |