Package: wnpp
Severity: wishlist
Owner: Peter Collinson <supp...@nftfw.uk>

* Package name    : nftfw
  Version         : 0.9.0
  Upstream Author : Peter Collinson <supp...@nftfw.uk>
* URL             : https://github.com/pcollinson/nftfw
* License         : MIT/X
  Programming Lang: Python
  Description     : an nftables firewall builder for Debian

Introduction
------------
Here is the current text in the debian/control file:

 The nftfw package builds firewalls for nftables. Configuration is
 based on files stored in directories in /etc/nftfw. For example,
 adding a new IP address to the whitelist is done by creating a file
 named for the IP address in the whitelist.d directory. Adding a new
 rule permitting access to a port just takes the addition of a
 suitably named file in incoming.d. Blacklisting address ranges is
 done by adding a CIDR address to a file in blacknets.d.
 .
 nftfw can automatically maintain the blacklist by efficiently scanning
 log files using regular expressions and adding miscreant IP addresses
 into blacklist.d. It maintains a database of activity and will
 timeout the entries after a user-defined period. When an IP is
 blocked, nftfw allows for feedback from nftables to notice and
 maintain blocking for frequent attempts from unwanted visitors.
 .
 nftfw makes extensive use of nftables sets to maintain exclusion and
 inclusion lists. It tries to minimise changes to the live firewall by
 only updating sets that have changed. It adds its created statements
 to an nftables template that can be modified to extend the firewall
 setup if needed.
 .
 After installation, some configuration is needed to make the system active,
 see /usr/share/doc/nftfw/README.Debian
 .
 The package is written and developed in Python 3.7.

More information can be found on Github, there are several documents
in the 'docs' directory that I've written first for manual
installation and recently Debian packaging. These are in .md, HTML and
PDF formats.

Once I have this bug number I will be uploading the binary package to github.

What's the history of this project?
-----------------------------------

nftfw is based on work done by Patrick Cherry for his hosting company
in the UK, Bytemark. His system was written in Ruby and was part of a
complete management system called Symbiosis for Debian servers. The
firewall part drove iptables. The company was sold and the buyer
wasn't really interested. Mythic Beasts forked Symbiosis into Sympl and I
moved to this new company as a customer.

At pretty much the same time, Debian Buster was released with the
switch to nftables. I wanted to fix some of the problems that I saw in
the original system and decided to start from scratch writing a new
firewall system in Python and aiming it at nftables.

What I liked about Patrick's approach was the use of what is perhaps
the original UNIX philosophy - everything is done in files. This
firewall is controlled by an nft template file, which is editable so
it can be extended - and then a bunch of specifically named files
controlling the firewall in known locations.

nftfw makes extensive use of sets, and tries never to reload the complete
firewall when a set is changed. There are problems in nftables with
some types of set, (I've reported that upstream and they will
eventually be fixed I understand) that mean that under some
circumstances partial loading doesn't work - and the whole table needs
reloading.

The system includes a module to scrape log files for attacks, and
injects the IP address into blacklist. It can also can scan kernel
logs for nftables logging so that sites that keep repeatedly returning
can be kept out until they stop. Feedback from the scanner is a big
win, bots keep bashing at the door and they are kept out.

Log scanning and blocking is also done by fail2ban of course. The
nftfw system is implemented because it was part of the original system
and I was looking for a drop-in alternative for the Symbiosis system.
Also, starting with nftables as a target has meant a re-appraisal of
how the system should work.

Where is the project?
--------------------

I started nftfw because I was sick of my systems being under attack
from all and sundry. It's been running on two different machines that
I run for a little over 18 months, and also has been used by some
others sys admins who are Mythic Beast customers. There are a few
stars on Github, but I have no idea if these people are using it.

nftfw was originally installed on these machines from github source.
It didn't seem to fit the Python packaging model because it's part of
a system and not an application or library. It was loaded into Github
in April of 2020 and has been largely stable since then. There has
been the odd coding error, or misunderstanding of how to do things,
but I would say that the code is well exercised now.

Once it was in Github, it provoked significant attacks from all over
the world, and mostly from CN. At one point on my public machine,
where its website lives (https://nftfw.uk) it was blocking over 3K IP
addresses and several hundred were in the firewall. This frenzy has
reduced in recent times. I do have some repeat visitors that have
been trying for over a year.

I started to investigate and implement Debian packaging in April of
this year, and now have a preliminary packaged system - which will
be online on github soon.

What do you get?
---------------

The Python code provides:

   nftfw - the main script which manages the firewall, it loads, provides
           scanning of files and manages the sqlite3 database.
   nftfwls - which lists the sqlite database that nftfw maintains
             I run this from websites, it will output HTML too.
   nftfwedit - which allows inspection, addition and deletion of
               ip addresses
   nftwadm - which is really intended as an installation aid when
             you want to retain a working firewall on installation

There are manual pages for all these, and also some section 5 manual pages
describing the config file and the file formats and naming rules.

What to I need?
---------------

I am happy to maintain this package, but obviously need a sponsor. I
would welcome input on the Python, which very probably breaks the 'way
of doing things' in many ways. Also, I have undoubtedly unwittingly
broken some packaging rules and/or there are better ways to do things.

I have intentionally not distributed a live system. Some activation by
hand is needed to get things working.

What would I like?
------------------

I'd like to see this as a Debian package in the near future.

Reply via email to