Category Archives: Firewalling/Security

Shorewall, Ipsets, Fail2Ban and Recidive Jail v.2

This is my second post on the above subject.  I have now started using ipsets to handle blocking of ip addresses at my firewalls.  For the purposes of this post, the ipsets will be call F2BLIST for ipv4 and F2BLIST6 for ipv6 address.  In the shorewall init file, place the following code:

ipset create F2BLIST hash:ip timeout 300 -exist

This creates an ipset with a default timeout of 300 seconds, and won’t throw an error if it already exists (if you happen to restart shorewall).

Next add a rule to the shorewall rules file like:


DROP:info net:+F2BLIST all

Next, create a new action file under /etc/fail2ban/action.d/ called shorewall-ipset.conf

actionstart =
actionstop =
actioncheck =
actionban = ipset add F2BLIST <ip> timeout <bantime> -exist
actionunban =
blocktype = logdrop
bantime = 600

The last line sets the default ban time to 600 seconds.  Next, create a jail in /etc/fail2ban/jail.local like the following:


enabled = true
filter = sshd
action = shorewall-ipset[bantime=3600]
sendmail-geoip-lines[name=SSH, dest=youremail, sender=anotheremail, logpath=/var/log/messages]
logpath = /var/log/messages
maxretry = 3

This jail sets the ban time to 3600 seconds, and uses the default findtime.  A recidive jail could look like the following:


enabled = true
filter = recidive
logpath = /var/log/fail2ban.log
action = shorewall-ipset[bantime=172800]
sendmail-geoip-lines[name=recidive, logpath=/var/log/fail2ban.log]
findtime = 172800 ; 2 day
maxretry = 2

The beauty of the ipsets is that the kernel handles expiring the entry, so you don’t have to worry about fail2ban expirying an ip that is still supposed to be blocked in the recidive jail.  If you issue the following command:

ipset list

it will show the ipset and all the entries in it with the corresponding seconds left for each ip to expire.

Shorewall limit your kids

A quick little note about turning off the internet at a certain time.  If you can assign all your kids devices IP addresses in a certain range, then you can easily cut them off the network at a given time with an addition to the shorewall rules file

DROP dmz: net – – – – – – – – timestart=22:00&timestop=23:59&weekdays=Sun,Mon,Tue,Wed,Thu&localtz
DROP dmz: net – – – – – – – – timestart=00:30&timestop=02:00&weekdays=Fri,Sat&localtz

As you can see, a certain address range on my dmz gets dropped at 10pm on school nights and 1230am on weekends.  Hope someone finds this usefull

Fail2Ban and Squirrelmail

With the help of squirrel logger I now have Fail2Ban banning IPs from attempted logins of my webmail interface.  Configuring squirrel logger was a breeze.  I simple send it to syslog, where it is picked up by my log.  I created my own squirrelmail.conf for fail2ban which is below.

# Fail2Ban configuration file

# Option: failregex
failregex =  0: Failed webmail login: by.*\(.*\) at <HOST> on.*$

ignoreregex =

Fail2Ban and WordPress

I noticed some unusual activity on my webserver recently, and tracked it down to brute force attempts on wordpress installs.  I did a little searching and found wp-fail2ban.  Without too much tweaking of rsyslog, I got the auth messages to my firewall, where I set about getting fail2ban to monitor for login attempts.  I was using the supplied wordpress.conf file that came with the plugin, but it was failing to match the regex due to the 32 character limitation of the syslog tag.  Essentially a tag that should be of the form


would sometimes be truncated to


This would cause a failure of the regex.  So if you have long domain names, you may need to modify the wordpress.conf.  In my case, I just removed


from the beginning of the regex

Fail2Ban, Shorewall and Recidive Jail

I have been using Fail2Ban with Shorewall to block brute force attempts against open ports.  I noticed that during a recent attack, the attackers were being repeatedly banned, so I decided to turn on the Recidive Jail.  Unfortunately, it doesn’t work with the shorewall action – in a nut shell, the short term jail that finally triggers the recidive jail releases the IP even though the recidive jail believes it is still banned.  I got around the problem by adding a new action ‘shorewall-recid’ and creating a few short scripts.  Essentially, if the recidive jail is triggered, the scripts make sure the ip is unbanned from all other jails before it is banned with the recidive one.  If you are interested in the scripts, just let me know.