UncomplicatedFirewall

Differences between revisions 2 and 121 (spanning 119 versions)
Revision 2 as of 2007-10-22 13:55:50
Size: 4795
Editor: mail
Comment:
Revision 121 as of 2019-10-18 01:07:49
Size: 11431
Editor: alexmurray
Comment: Update for eoan release and update bionic version, remove cosmic as is EOL plus list precise and trusty as ESM
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
 * '''Launchpad Entry''': UbuntuSpec:ubuntu-firewall ## page was renamed from UbuntuFirewall
||<tablestyle="float:right; font-size: 0.9em; width:30%; background:#F1F1ED; background-repeat: no-repeat; background-position: 98% 0.5ex; margin: 0 0 1em 1em; padding: 0.5em;"><<TableOfContents>>||
Line 3: Line 4:
== Summary ==
Line 5: Line 5:
Create a high level language for iptables firewall configuration. The language would be based on OpenBSD's PF syntax, along with any improvements to make it easier for users (PF provides a compact, easy to understand firewall language). Initially, the language will consist of only a subset of PF functionality, but eventually could include queuing and traffic optimization. == Introduction ==
The Linux kernel in Ubuntu provides a packet filtering system called
`netfilter`, and the traditional interface for manipulating `netfilter` are the
`iptables` suite of commands. `iptables` provide a complete firewall solution
that is both highly configurable and highly flexible.
Line 7: Line 11:
In addition to the higher level language, ubuntu-firewall should provide packaging integration to make it easier for network daemon packages to integrate with the firewall. Becoming proficient in `iptables` takes time, and getting started with
`netfilter` firewalling using only `iptables` can be a daunting task. As a
result, many frontends for `iptables` have been created over the years, each
trying to achieve a different result and targeting a different audience.
Line 9: Line 16:
It is important to note that this is not simply 'Yet Another Firewall Tool', but rather a high level firewall language to make firewall configuration easier for both users, packaging, and tools. The Uncomplicated Firewall (`ufw`) is a frontend for `iptables` and is particularly
well-suited for host-based firewalls. `ufw` provides a framework for
managing `netfilter`, as well as a command-line interface for manipulating the
firewall. `ufw` aims to provide an easy to use interface for people unfamiliar with
firewall concepts, while at the same time simplifies complicated `iptables` commands
to help an adminstrator who knows what he or she is doing. `ufw` is an upstream for
other distributions and graphical frontends.
Line 11: Line 24:
== Release Note == == UFW in Ubuntu ==
Ubuntu 8.04 LTS introduced `ufw`, and it is available by default in all Ubuntu
installations after 8.04 LTS.
Line 13: Line 28:
ubuntu-firewall will not affect users in the default installation as the tool will not dictate a default firewall policy for all users. Users will have to explicitly enable ubuntu-firewall if they want to use it.
 
== Rationale ==
=== Available Versions in supported versions of Ubuntu ===
 * '''Ubuntu 12.04 ESM''': 0.31.1-1
 * '''Ubuntu 14.04 ESM''': 0.34~rc-0ubuntu2
 * '''Ubuntu 16.04 LTS''': 0.35-0ubuntu2
 * '''Ubuntu 18.04 LTS''': 0.36-0ubuntu0.18.04.1
 * '''Ubuntu 19.04''': 0.36-1ubuntu1
 * '''Ubuntu 19.10''': 0.36-1ubuntu3
 * '''Ubuntu Core''': 0.36pre
Line 17: Line 37:
Ubuntu currently does not have an integrated firewall in its base installation. Additionally, the tools that are available to create a firewall are largely based on GUI applications, or create iptables scripts that are dependent on the tool to update them. Users are left to choose between one of the many firewall tools available, or roll their own firewall scripts. Existing tools also do not provide package integration so that when a network daemon is installed, users have to manually determine and add the necessary firewall rules (usually with their tool of choice). === Features ===
`ufw` has the following features:
Line 19: Line 40:
== Use Cases == || '''Feature''' || '''0.31.1-1''' || '''0.34~rc-0ubuntu2''' || '''0.34-2''' || '''0.35''' ||
|| default incoming policy (allow/deny) || yes || yes || yes || yes ||
|| allow/deny incoming rules || yes || yes || yes || yes ||
|| IPv6 (by default) || yes || yes || yes || yes ||
|| status || yes || yes || yes || yes ||
|| logging (on/off) || yes || yes || yes || yes ||
|| extensible framework || yes || yes || yes || yes ||
|| python 2.5 support || yes || no || no || no ||
|| application integration || yes || yes || yes || yes* ||
|| IPv4 rate limiting via 'limit' command || yes || yes || yes || yes ||
|| internationalization || yes || yes || yes || yes ||
|| multiport incoming rules || yes || yes || yes || yes ||
|| debconf/preseeding || yes || yes || yes || yes ||
|| default incoming policy (reject) || yes || yes || yes || yes ||
|| reject incoming rules || yes || yes || yes || yes ||
|| rule insertion || yes || yes || yes || yes ||
|| log levels || yes || yes || yes || yes ||
|| per rule logging || yes || yes || yes || yes ||
|| outgoing filtering (on par with incoming) || yes || yes || yes || yes ||
|| filtering by interface || yes || yes || yes || yes ||
|| bash completion || yes || yes || yes || yes ||
|| upstart support || yes || yes || yes || yes ||
|| improved reporting || yes || yes || yes || yes ||
|| reset command || yes || yes || yes || yes ||
|| rsyslog support || yes || yes || yes || yes ||
|| delete by rule number || yes || yes || yes || yes ||
|| python 2.6 support || yes || yes || yes || yes ||
|| 'show listening' report || yes || yes || yes || yes ||
|| python 2.7 support || yes || yes || yes || yes ||
|| increased protocol support (ah, esp) || yes || yes || yes || yes ||
|| IPv6 rate limiting via 'limit' command || -- || yes || yes || yes ||
|| python 3.2 support || -- || yes || yes || no ||
|| python 3.3 support || -- || yes || yes || yes ||
|| 'show added' report || -- || yes || yes || yes ||
|| python 3.4 support || -- || yes || yes || yes ||
|| before/after extensibility hooks || -- || yes || yes || yes ||
|| routed packet filtering (FORWARD) || -- || yes || yes || yes ||
|| systemd support || -- || -- || yes || yes ||
|| increased protocol support (igmp, gre) || -- || -- || yes || yes ||
|| python 3.5 support || -- || -- || yes || yes ||
|| Snappy for Ubuntu Core support || -- || -- || -- || yes ||
|| per rule comments || -- || -- || -- || yes ||
Line 21: Line 83:
Bob uses a desktop system and wants to add a firewall as another layer of protection. Bob can enable ubuntu-firewall to provide this protection. When new packages are added, Bob can optionally enable the firewall rules provided by these packages.  * support for application integration is limited on Ubuntu Core at this time
Line 23: Line 85:
Alice administers many server machines and wants to create a host-based firewall for them. Alice can create a base firewall policy for all the servers using the PF-based ubuntu-firewall language. Once the default policy for her servers is setup and pushed to each machine, she can then install the server packages she wants on the individual servers, and enable the firewall rules provided by those packages. == Basic Usage ==
Getting started with `ufw` is easy. For example, to enable firewall, allow
ssh access, enable logging, and check the status of the firewall, perform:{{{
$ sudo ufw allow ssh/tcp
$ sudo ufw logging on
$ sudo ufw enable
$ sudo ufw status
Firewall loaded
Line 25: Line 94:
== Assumptions == To Action From
-- ------ ----
22:tcp ALLOW Anywhere
}}}
Line 27: Line 99:
While the PF-based abstraction that ubuntu-firewall provides would be a great benefit to users on its own, to fully realize the benefits of ubuntu-firewall, packages providing network services should also provide firewall policy for the applications they provide. For example, apache2 should let ubuntu-firewall know that it provides a TCP service on port 80. It should be noted that ubuntu-firewall is still very useful on its own, so a slow transition for these packages is tolerable. This sets up a default deny (DROP) firewall for incoming connections, with all
outbound connections allowed with state tracking.
Line 29: Line 102:
== Design == On Ubuntu Core, simply replace '`ufw`' with '`ufw.cmd`'. Eg: {{{
$ sudo ufw.cmd enable
}}}
Line 31: Line 106:
 1. Create the high level language for iptables firewall configuration
 1. Create a tool for parsing the high level language. This tool would be called 'ufctl'. Default configuration would be in /etc/uf/uf.conf. ufctl would be smart enough to turn on things like IP forwarding, depending on the configuration in uf.conf. This tool should:
   * Parse and load the resulting iptables/proc/(and eventually ip) values
   * Provide a means to specify another configuration file
   * Provide a 'dry-run' or 'config test' mechanism
 1. Provide a means to load the ubuntu-firewall policy on boot
 1. Integrate with package management by creating an /etc/uf/rules.d directory, and have ubuntu-firewall parse the files in /etc/uf/rules.d
=== Advanced Functionality ===
As mentioned, the `ufw` application is capable of doing anything that `iptables` can
do. This is achieved by using several sets of rules files, which are nothing more
than `iptables-restore` compatible text files. Fine-tuning `ufw` and/or adding additional
`iptables` commands not offered via the `ufw` command is a matter of editing various text
files^1^:
 * '''/etc/default/ufw''': high level configuration, such as default policies, IPv6 support and kernel modules to use
 * '''/etc/ufw/before[6].rules''': rules in these files are evaluated before any rules added via the `ufw` command
 * '''/etc/ufw/after[6].rules''': rules in these files are evaluated after any rules added via the `ufw` command
 * '''/etc/ufw/sysctl.conf''': kernel network tunables
 * '''/var/lib/ufw/user[6].rules''' or '''/lib/ufw/user[6].rules''' (0.28 and later): rules added via the `ufw` command (should not normally be edited by hand)
 * '''/etc/ufw/ufw.conf''': sets whether or not `ufw` is enabled on boot, and in 9.04 (ufw 0.27) and later, sets the LOGLEVEL
 * '''/etc/ufw/after.init''': initialization customization script run after ufw is initialized (ufw 0.34 and later)
 * '''/etc/ufw/before.init''': initialization customization script run before ufw is initialized (ufw 0.34 and later)
Line 39: Line 121:
== Implementation == After modifying any of the above files, activate the new settings with:{{{
$ sudo ufw disable
$ sudo ufw enable
}}}
Line 41: Line 126:
=== UI Changes === ^1^ On Ubuntu Core, these files are located under `/var/lib/apps/ufw*/current`. See '`ufw.doc ufw-on-snappy`' on an Ubuntu Core system for details.
Line 43: Line 128:
There are no specific UI changes for ufctl. Simple CLI or GUI tools could
eventually be created which simply add files to /etc/uf/rules.d. One
implementation could be like RedHat's system-config-securitylevel, which basically declares what protocol and port to open.
== More Information ==
 * Ubuntu 12.04 LTS (Precise Pangolin)
  * [[https://help.ubuntu.com/12.04/serverguide/firewall.html|Server Guide - Firewall]]
  * [[http://manpages.ubuntu.com/manpages/precise/en/man8/ufw.8.html|ufw manual]]
  * [[http://manpages.ubuntu.com/manpages/precise/en/man8/ufw-framework.8.html|ufw framework manual]]
Line 47: Line 134:
=== Code Changes ===  * Ubuntu 14.04 LTS (Trusty Tahr)
  * [[https://help.ubuntu.com/14.04/serverguide/firewall.html|Server Guide - Firewall]]
  * [[http://manpages.ubuntu.com/manpages/trusty/en/man8/ufw.8.html|ufw manual]]
  * [[http://manpages.ubuntu.com/manpages/trusty/en/man8/ufw-framework.8.html|ufw framework manual]]
Line 49: Line 139:
Depending on the method chosen for boot integration, there may be changes to
the loopback entry ('lo') in /etc/network/interfaces.
 * Ubuntu 16.04 LTS (Xenial Xerus)
  * [[http://manpages.ubuntu.com/manpages/xenial/en/man8/ufw.8.html|ufw manual]]
  * [[http://manpages.ubuntu.com/manpages/xenial/en/man8/ufw-framework.8.html|ufw framework manual]]
Line 52: Line 143:
=== Migration ===  * Ubuntu 18.04 LTS (Bionic Beaver)
  * [[http://manpages.ubuntu.com/manpages/bionic/en/man8/ufw.8.html|ufw manual]]
  * [[http://manpages.ubuntu.com/manpages/bionic/en/man8/ufw-framework.8.html|ufw framework manual]]
Line 54: Line 147:
As there is currently no default firewall configuration for Ubuntu, there are no
mandatory migration issues. It should be possible to generate an
ubuntu-firewall policy from an existing firewall policy. Another migration
issue is getting network daemon packages to provide the necessary policy files
to ubuntu-firewall.
 * Ubuntu 18.10 (Cosmic Cuttlefish)
  * [[http://manpages.ubuntu.com/manpages/cosmic/en/man8/ufw.8.html|ufw manual]]
  * [[http://manpages.ubuntu.com/manpages/cosmic/en/man8/ufw-framework.8.html|ufw framework manual]]
Line 60: Line 151:
== Test/Demo Plan ==
TBD
 * Ubuntu 19.04 (Disco Dingo)
  * [[http://manpages.ubuntu.com/manpages/disco/en/man8/ufw.8.html|ufw manual]]
  * [[http://manpages.ubuntu.com/manpages/disco/en/man8/ufw-framework.8.html|ufw framework manual]]
Line 63: Line 155:
== Outstanding Issues ==  * Ubuntu Core
  * See '`ufw.doc`' on your Ubuntu Core system, specifically '`ufw.doc ufw-on-snappy | less`' to see how ufw differs on Ubuntu Core.
Line 65: Line 158:
 * User space tools for generating policies for ubuntu-firewall  * [[https://help.ubuntu.com/community/UFW|Ubuntu Community Documentation on UFW]]
Line 67: Line 160:
== BoF agenda and discussion ==

Use this section to take notes during the BoF; if you keep it in the approved spec, use it for summarizing what was discussed and note any options that were rejected.

----
CategorySpec
 * '''Specification''': UbuntuFirewallSpec
 * '''Code''': [[https://launchpad.net/ufw|https://launchpad.net/ufw]]
 * Graphic User Interface for UFW: [[https://help.ubuntu.com/community/Gufw|Gufw]].

Introduction

The Linux kernel in Ubuntu provides a packet filtering system called netfilter, and the traditional interface for manipulating netfilter are the iptables suite of commands. iptables provide a complete firewall solution that is both highly configurable and highly flexible.

Becoming proficient in iptables takes time, and getting started with netfilter firewalling using only iptables can be a daunting task. As a result, many frontends for iptables have been created over the years, each trying to achieve a different result and targeting a different audience.

The Uncomplicated Firewall (ufw) is a frontend for iptables and is particularly well-suited for host-based firewalls. ufw provides a framework for managing netfilter, as well as a command-line interface for manipulating the firewall. ufw aims to provide an easy to use interface for people unfamiliar with firewall concepts, while at the same time simplifies complicated iptables commands to help an adminstrator who knows what he or she is doing. ufw is an upstream for other distributions and graphical frontends.

UFW in Ubuntu

Ubuntu 8.04 LTS introduced ufw, and it is available by default in all Ubuntu installations after 8.04 LTS.

Available Versions in supported versions of Ubuntu

  • Ubuntu 12.04 ESM: 0.31.1-1

  • Ubuntu 14.04 ESM: 0.34~rc-0ubuntu2

  • Ubuntu 16.04 LTS: 0.35-0ubuntu2

  • Ubuntu 18.04 LTS: 0.36-0ubuntu0.18.04.1

  • Ubuntu 19.04: 0.36-1ubuntu1

  • Ubuntu 19.10: 0.36-1ubuntu3

  • Ubuntu Core: 0.36pre

Features

ufw has the following features:

Feature

0.31.1-1

0.34~rc-0ubuntu2

0.34-2

0.35

default incoming policy (allow/deny)

yes

yes

yes

yes

allow/deny incoming rules

yes

yes

yes

yes

IPv6 (by default)

yes

yes

yes

yes

status

yes

yes

yes

yes

logging (on/off)

yes

yes

yes

yes

extensible framework

yes

yes

yes

yes

python 2.5 support

yes

no

no

no

application integration

yes

yes

yes

yes*

IPv4 rate limiting via 'limit' command

yes

yes

yes

yes

internationalization

yes

yes

yes

yes

multiport incoming rules

yes

yes

yes

yes

debconf/preseeding

yes

yes

yes

yes

default incoming policy (reject)

yes

yes

yes

yes

reject incoming rules

yes

yes

yes

yes

rule insertion

yes

yes

yes

yes

log levels

yes

yes

yes

yes

per rule logging

yes

yes

yes

yes

outgoing filtering (on par with incoming)

yes

yes

yes

yes

filtering by interface

yes

yes

yes

yes

bash completion

yes

yes

yes

yes

upstart support

yes

yes

yes

yes

improved reporting

yes

yes

yes

yes

reset command

yes

yes

yes

yes

rsyslog support

yes

yes

yes

yes

delete by rule number

yes

yes

yes

yes

python 2.6 support

yes

yes

yes

yes

'show listening' report

yes

yes

yes

yes

python 2.7 support

yes

yes

yes

yes

increased protocol support (ah, esp)

yes

yes

yes

yes

IPv6 rate limiting via 'limit' command

--

yes

yes

yes

python 3.2 support

--

yes

yes

no

python 3.3 support

--

yes

yes

yes

'show added' report

--

yes

yes

yes

python 3.4 support

--

yes

yes

yes

before/after extensibility hooks

--

yes

yes

yes

routed packet filtering (FORWARD)

--

yes

yes

yes

systemd support

--

--

yes

yes

increased protocol support (igmp, gre)

--

--

yes

yes

python 3.5 support

--

--

yes

yes

Snappy for Ubuntu Core support

--

--

--

yes

per rule comments

--

--

--

yes

  • support for application integration is limited on Ubuntu Core at this time

Basic Usage

Getting started with ufw is easy. For example, to enable firewall, allow ssh access, enable logging, and check the status of the firewall, perform:

$ sudo ufw allow ssh/tcp
$ sudo ufw logging on
$ sudo ufw enable
$ sudo ufw status
Firewall loaded

To                         Action  From
--                         ------  ----
22:tcp                     ALLOW   Anywhere

This sets up a default deny (DROP) firewall for incoming connections, with all outbound connections allowed with state tracking.

On Ubuntu Core, simply replace 'ufw' with 'ufw.cmd'. Eg:

$ sudo ufw.cmd enable

Advanced Functionality

As mentioned, the ufw application is capable of doing anything that iptables can do. This is achieved by using several sets of rules files, which are nothing more than iptables-restore compatible text files. Fine-tuning ufw and/or adding additional iptables commands not offered via the ufw command is a matter of editing various text files1:

  • /etc/default/ufw: high level configuration, such as default policies, IPv6 support and kernel modules to use

  • /etc/ufw/before[6].rules: rules in these files are evaluated before any rules added via the ufw command

  • /etc/ufw/after[6].rules: rules in these files are evaluated after any rules added via the ufw command

  • /etc/ufw/sysctl.conf: kernel network tunables

  • /var/lib/ufw/user[6].rules or /lib/ufw/user[6].rules (0.28 and later): rules added via the ufw command (should not normally be edited by hand)

  • /etc/ufw/ufw.conf: sets whether or not ufw is enabled on boot, and in 9.04 (ufw 0.27) and later, sets the LOGLEVEL

  • /etc/ufw/after.init: initialization customization script run after ufw is initialized (ufw 0.34 and later)

  • /etc/ufw/before.init: initialization customization script run before ufw is initialized (ufw 0.34 and later)

After modifying any of the above files, activate the new settings with:

$ sudo ufw disable
$ sudo ufw enable

1 On Ubuntu Core, these files are located under /var/lib/apps/ufw*/current. See 'ufw.doc ufw-on-snappy' on an Ubuntu Core system for details.

More Information

UncomplicatedFirewall (last edited 2023-10-18 01:29:55 by sbeattie)