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:

?SECTION ALL

DROP:info net:+F2BLIST all

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

[Definition]
actionstart =
actionstop =
actioncheck =
actionban = ipset add F2BLIST <ip> timeout <bantime> -exist
actionunban =
[Init]
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:

[ssh-shorewall]

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:

[recidive]

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.

Hurricane Electric IPv6 Tunnel, Netflix & Unbound

I had been happily using HE’s tunnel broker to gain access to the IPv6 internet for some time.  A side effect of this was that I would quite often get the US version of the Netflix catalogue.  Back in June of 2016, Netflix started actively blocking HE’s subnets because of people using them explicitly to avoid their geo blocking.  Consequently, I would get an error when trying to watch Netflix. The solution I had been using was to reject all IPv6 traffic at the firewall for any device that I used to access Netflix.  It bothered me to essentially turn off IPv6 for those devices, and I recently found a better solution.  I use unbound as my recursive dns resolver, and I found by adding the following code to its configuration file, Netflix has been working without rejecting the IPv6 traffic.

local-zone: “netflix.com” typetransparent
local-data: “netflix.com AAAA ::1”
local-data: “dockhand.netflix.com AAAA ::1”
local-data: “www.netflix.com AAAA ::1”
local-data: “www.us-west-2.prodaa.netflix.com AAAA ::1”
local-data: “www.us-east-1.prodaa.netflix.com AAAA ::1”
local-data: “secure.netflix.com AAAA ::1”
local-data: “customerevents.netflix.com AAAA ::1”
local-data: “api-global.netflix.com AAAA ::1”
local-data: “api-global.us-west-2.prodaa.netflix.com AAAA ::1”
local-data: “api-global.us-east-1.prodaa.netflix.com AAAA ::1”
local-data: “api-global.latency.prodaa.netflix.com AAAA ::1”
local-data: “api.netflix.com AAAA ::1”
local-data: “uiboot.netflix.com AAAA ::1”
local-data: “presentationtracking.netflix.com AAAA ::1”
local-data: “android.nccp.netflix.com AAAA ::1”
local-data: “ios.nccp.netflix.com AAAA ::1”
local-data: “nintendo.nccp.netflix.com AAAA ::1”
local-data: “ichnaea.netflix.com AAAA ::1”
local-data: “ichnaea.geo.netflix.com AAAA ::1”
local-data: “ichnaea.latency.prodaa.netflix.com AAAA ::1”
local-data: “ichnaea.us-west-2.prodaa.netflix.com AAAA ::1”
local-data: “ichnaea.us-east-1.prodaa.netflix.com AAAA ::1”
local-data: “appboot.netflix.com AAAA ::1”
local-data: “appboot.us-west-2.prodaa.netflix.com AAAA ::1”
local-data: “appboot.us-east-1.prodaa.netflix.com AAAA ::1”

Essentially, any request for AAAA records returns localhost, but all other records are resolved normally.  I created the list by checking the unbound log file while devices were trying to access Netflix.  If I find any more hostnames to redirect, I will add them to the list.