How To Configure Snort On Debian

Updated on November 21, 2023
How To Configure Snort On Debian header image

Snort is a free network intrusion detection system (IDS). In less official terms, it lets you to monitor your network for suspicious activity in real time. Currently, Snort has packages for Fedora, CentOS, FreeBSD, and Windows-based systems. Exact installation method varies between OSes. In this tutorial, we will be installing directly from the source files for Snort. This guide was written for Debian.

Update, Upgrade, and Reboot

Before we actually get our hands on the Snort sources, we need to make sure that our system is up to date. We can do this by issuing the commands below.

sudo apt-get update
sudo apt-get upgrade -y
sudo reboot

Pre-install configuration

Once your system has rebooted, we need to install a number of packages to make sure that we can install SBPP. I was able to figure out that a number of the packages that were needed, so the base command is below.

sudo apt-get install flex bison build-essential checkinstall libpcap-dev libnet1-dev libpcre3-dev libnetfilter-queue-dev iptables-dev libdumbnet-dev zlib1g-dev -y

Once all of the packages are installed, you will need to create a temporary directory for your source files - they can be anywhere you'd like. I'll be using /usr/src/snort_src. To create this folder, you'll need to be logged in as the root user, or have sudo permissions - root just makes it easier.

sudo mkdir /usr/src/snort_src
cd /usr/src/snort_src

Installing the Data Acquisition Library (DAQ)

Before we can get the source for Snort, we need to install the DAQ. It's fairly simple to install.

wget https://www.snort.org/downloads/snort/daq-2.0.6.tar.gz

Extract the files from the tarball.

tar xvfz daq-2.0.6.tar.gz

Change into the DAQ directory.

cd daq-2.0.6

Configure and install the DAQ.

./configure; make; sudo make install

That last line, will execute ./configure first. Then it will execute make. Lastly, it will execute make install. We use the shorter syntax here just to save a little bit on typing.

Installing Snort

We want to make sure we're in the /usr/src/snort_src directory again, so be sure to change into that directory with:

cd /usr/src/snort_src

Now that we are in the directory for the sources, we will download the tar.gz file for the source. At the time of this writing, the most recent version of Snort is 2.9.8.0.

wget https://www.snort.org/downloads/snort/snort-2.9.8.0.tar.gz

The commands to actually install snort are very similar to the ones used for the DAQ, but they have different options.

Extract the Snort source files.

tar xvfz snort-2.9.8.0.tar.gz

Change into the source directory.

cd snort-2.9.8.0

Configure and install the sources.

 ./configure --enable-sourcefire; make; sudo make install

Post-install of Snort

Once we have Snort installed, we need to make sure that our shared libraries are up to date. We can do this using the command:

sudo ldconfig

After we do that, test your Snort installation:

snort --version

If this command does not work, you will need to create a symlink. You can do this by typing:

sudo ln -s /usr/local/bin/snort /usr/sbin/snort
snort --version

The resulting output will resemble the following:

   ,,_     -*> Snort! <*-
  o"  )~   Version 2.9.7.5 GRE (Build 262)
   ''''    By Martin Roesch & The Snort Team: http://www.snort.org/contact#team
           Copyright (C) 2014-2015 Cisco and/or its affiliates. All rights reserved.
           Copyright (C) 1998-2013 Sourcefire, Inc., et al.
           Using libpcap version 1.6.2
           Using PCRE version: 8.35 2014-04-04
           Using ZLIB version: 1.2.8

Un-rooting Snort

Now that we have snort installed, we don't want it running as root, so we need to create a snort user and group. To create a new user and group, we can use these two commands:

sudo groupadd snort
sudo useradd snort -r -s /sbin/nologin -c SNORT_IDS -g snort

Since we have installed the program using the source, we need to create the configuration files and the rules for snort.

sudo mkdir /etc/snort
sudo mkdir /etc/snort/rules
sudo mkdir /etc/snort/preproc_rules
sudo touch /etc/snort/rules/white_list.rules /etc/snort/rules/black_list.rules /etc/snort/rules/local.rules

After we create the directories and the rules, we now need to create the log directory.

sudo mkdir /var/log/snort

And lastly, before we can add any rules, we need a place to store the dynamic rules.

sudo mkdir /usr/local/lib/snort_dynamicrules

Once all of the previous files have been created, set the proper permissions on them.

sudo chmod -R 5775 /etc/snort
sudo chmod -R 5775 /var/log/snort
sudo chmod -R 5775 /usr/local/lib/snort_dynamicrules
sudo chown -R snort:snort /etc/snort
sudo chown -R snort:snort /var/log/snort
sudo chown -R snort:snort /usr/local/lib/snort_dynamicrules

Setting up the config files

To save a bunch of time and to keep from having to copy and paste everything, lets just copy all of the files into the configuration directory.

sudo cp /usr/src/snort_src/snort*/etc/*.conf* /etc/snort
sudo cp /usr/src/snort_src/snort*/etc/*.map /etc/snort

Now that the config files are there, you can do one of two things:

  • You can enable Barnyard2
  • Or you can just leave the config files alone and selectively enable the desired rules.

Either way, you're still going to want to change a few things. Keep reading.

Configuration

In the /etc/snort/snort.conf file, you will need to change the variable HOME_NET. It should be set to your internal network's IP block so it won't log your own network's attempts to log into the server. This may be 10.0.0.0/24 or 192.168.0.0/16. On line 45 of /etc/snort/snort.conf change the variable HOME_NET to that value of your network's IP block.

On my network, it looks like this:

ipvar HOME_NET 192.168.0.0/16

Then, you'll have to set the EXTERNAL_NET variable to:

any

Which just turns EXERNAL_NET into whatever your HOME_NET is not.

Setting the rules

Now that a large majority of the system is set up, we need to configure our rules for this little piggy. Somewhere around line 104 in your /etc/snort/snort.conf file, you should see a "var" declaration and the variables RULE_PATH, SO_RULE_PATH, PREPROC_RULE_PATH, WHITE_LIST_PATH, and BLACK_LIST_PATH. Their values should be set to the paths we used in Un-rooting Snort.

var RULE_PATH /etc/snort/rules
var SO_RULE_PATH /etc/snort/so_rules
var PREPROC_RULE_PATH /etc/snort/preproc_rules
var WHITE_LIST_PATH /etc/snort/rules
var BLACK_LIST_PATH /etc/snort/rules

Once those values are set, delete or comment out the current rules starting on about line 548.

Now, lets check to make sure that your configuration is correct. You can verify it with snort.

 # snort -T -c /etc/snort/snort.conf
 

You will see output similar to the following (truncated for brevity).

 Running in Test mode
 
         --== Initializing Snort ==--
 Initializing Output Plugins!
 Initializing Preprocessors!
 Initializing Plug-ins!
 .....
 Rule application order: activation->dynamic->pass->drop->sdrop->reject->alert->log
 Verifying Preprocessor Configurations!
 
         --== Initialization Complete ==--
 
    ,,_     -*> Snort! <*-
   o"  )~   Version 2.9.8.0 GRE (Build 229) 
    ''''    By Martin Roesch & The Snort Team: http://www.snort.org/contact#team
            Copyright (C) 2014-2015 Cisco and/or its affiliates. All rights reserved.
            Copyright (C) 1998-2013 Sourcefire, Inc., et al.
            Using libpcap version 1.7.4
            Using PCRE version: 8.35 2014-04-04
            Using ZLIB version: 1.2.8
 
            Rules Engine: SF_SNORT_DETECTION_ENGINE  Version 2.4  <Build 1>
            Preprocessor Object: SF_IMAP  Version 1.0  <Build 1>
            Preprocessor Object: SF_FTPTELNET  Version 1.2  <Build 13>
            Preprocessor Object: SF_SIP  Version 1.1  <Build 1>
            Preprocessor Object: SF_REPUTATION  Version 1.1  <Build 1>
            Preprocessor Object: SF_POP  Version 1.0  <Build 1>
            Preprocessor Object: SF_DCERPC2  Version 1.0  <Build 3>
            Preprocessor Object: SF_SDF  Version 1.1  <Build 1>
            Preprocessor Object: SF_GTP  Version 1.1  <Build 1>
            Preprocessor Object: SF_DNS  Version 1.1  <Build 4>
            Preprocessor Object: SF_SSH  Version 1.1  <Build 3>
            Preprocessor Object: SF_DNP3  Version 1.1  <Build 1>
            Preprocessor Object: SF_SSLPP  Version 1.1  <Build 4>
            Preprocessor Object: SF_SMTP  Version 1.1  <Build 9>
            Preprocessor Object: SF_MODBUS  Version 1.1  <Build 1>
 
 Snort successfully validated the configuration!
 Snort exiting

Now that everything is configured without errors, we are ready to start testing Snort.

Testing Snort

The easiest way to test Snort is by enabling the local.rules. This is a file that contains your custom rules.

If you've noticed in the snort.conf file, somewhere around line 546, this line exists:

include $RULE_PATH/local.rules

If you don't have it, please add it around 546. You can then use the local.rules file for testing. As a basic test, I just have Snort keep track of a ping request (ICMP request). You can do that by adding in the following line to your local.rules file.

 alert icmp any any -> $HOME_NET any (msg:"ICMP test"; sid:10000001; rev:001;)
 

Once you have that in your file, save it, and continue reading.

Run the test

The following command will start Snort and print "fast mode" alerts, as the user snort, under the group snort, using the config /etc/snort/snort.conf, and it will listen on the network interface eno1. You will need to change eno1 to whatever network interface your system is listening on.

$ sudo /usr/local/bin/snort -A console -q -u snort -g snort -c /etc/snort/snort.conf -i eno1

Once you have it running, ping that computer. You will start to see output that looks like the following:

01/07−16:03:30.611173 [**] [1:10000001:0] ICMP test [**] [Priority: 0]  192.168.1.105 -> 192.168.1.104
01/07−16:03:31.612174 [**] [1:10000001:0] ICMP test [**] [Priority: 0]  192.168.1.104 -> 192.168.1.105
01/07−16:03:31.612202 [**] [1:10000001:0] ICMP test [**] [Priority: 0]  192.168.1.105 -> 192.168.1.104
^C*** Caught Int−Signal

You can press Ctrl+C to exit the program, and that's it. Snort is all set up. You may now use any rules that you desire.

Lastly, I want to note that there are some public rules made by the community you can download from the official site under the "Community" tab. Look for "Snort", then just under that there is a community link. Download that, extract it, and look for the community.rules file.