Configure Ubuntu Firewall (UFW) on Ubuntu 18.04

Published on: Fri, Nov 16, 2018 at 12:45 pm EST

Install UFW

UFW is installed by default in Ubuntu 18.04, but you can verify this:

which ufw

You should receive the following output:

/usr/sbin/ufw

If you don't receive output, that means that UFW is not installed. You can install it yourself if this is the case:

sudo apt-get install ufw

Allow connections

If you are running a web server, you want the world to be able to access your website(s). Therefore, you need to make sure that the default TCP ports for web are open.

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

In general, you can allow any port you need by using the following format:

sudo ufw allow <port>/<optional: protocol>

Deny connections

If you need to deny access to a certain port, use the deny command:

sudo ufw deny <port>/<optional: protocol>

For example, you can deny access to your default MySQL port:

sudo ufw deny 3306

UFW also supports a simplified syntax for the most common service ports:

root@ubuntu:~$ sudo ufw deny mysql
Rule updated
Rule updated (v6)

It is highly recommended that you restrict access to your SSH port, (by default, this is port 22), from anywhere except your trusted IP addresses.

Allow access from a trusted IP address

Typically, you would need to allow access only to publicly open ports, such as port 80. Access to all other ports should be restricted or limited. You can whitelist your home or office IP address, (preferably a static IP), to be able to access your server through SSH or FTP:

sudo ufw allow from 192.168.0.1 to any port 22

You can also allow access to the MySQL port:

sudo ufw allow from 192.168.0.1 to any port 3306

Enable UFW

Before enabling (or restarting) UFW, you need to make sure that the SSH port is allowed to receive connections from your IP address. To start/enable your UFW firewall, use the following command:

sudo ufw enable

You will see the following output:

root@ubuntu:~$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)?

Press Y, then press ENTER to enable the firewall:

Firewall is active and enabled on system startup

Check UFW status

Print the UFW rule list:

sudo ufw status

You will see output similar to the following:

Status: active

To                         Action      From
--                         ------      ----
80/tcp                     DENY        Anywhere
443/tcp                    DENY        Anywhere
3306                       DENY        Anywhere
22                         ALLOW       192.168.0.1
3306                       ALLOW       192.168.0.1
80/tcp (v6)                DENY        Anywhere (v6)
443/tcp (v6)               DENY        Anywhere (v6)
3306 (v6)                  DENY        Anywhere (v6)

Use the verbose parameter to see a more detailed status report:

sudo ufw status verbose

That output will resemble the following:

Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
80/tcp                     DENY IN     Anywhere
443/tcp                    DENY IN     Anywhere
3306                       DENY IN     Anywhere
22                         ALLOW IN    192.168.0.1
3306                       ALLOW IN    192.168.0.1
80/tcp (v6)                DENY IN     Anywhere (v6)
443/tcp (v6)               DENY IN     Anywhere (v6)
3306 (v6)                  DENY IN     Anywhere (v6)

Disable/reload/restart UFW

If you need to reload the firewall rules run the following:

sudo ufw reload

To disable, or stop UFW:

sudo ufw disable

In order to restart UFW, you will need to disable it first, and then enable it again:

sudo ufw disable
sudo ufw enable

Note: Before enabling UFW, make sure that the SSH port is allowed for your IP address.

Removing rules

To manage your UFW rules, you need to list them. You can do that by checking UFW status with the parameter numbered:

sudo ufw status numbered

You will see output similar to the following:

Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 80/tcp                     DENY IN     Anywhere
[ 2] 443/tcp                    DENY IN     Anywhere
[ 3] 3306                       DENY IN     Anywhere
[ 4] 22                         ALLOW IN    192.168.0.1
[ 5] 3306                       ALLOW IN    192.168.0.1
[ 6] 80/tcp (v6)                DENY IN     Anywhere (v6)
[ 7] 443/tcp (v6)               DENY IN     Anywhere (v6)
[ 8] 3306 (v6)                  DENY IN     Anywhere (v6)

Now, to remove any of these rules, you will need to use these numbers in the square brackets:

sudo ufw delete [number]

To remove the HTTP rule, (80), use the following command:

sudo ufw delete 1

Enabling IPv6 support

If you use IPv6 on your VPS, you need to ensure that IPv6 support is enabled in UFW. To do so, open the config file in a text editor:

sudo vi /etc/default/ufw

Once opened, make sure that IPV6 is set to "yes":

IPV6=yes

After making this change, save the file. Then, restart UFW by disabling and re-enabling it:

sudo ufw disable
sudo ufw enable

Back to default settings

If you need to go back to default settings, simply type in the following command. This will revert any of your changes:

sudo ufw reset

Congratulations, you've just set up some basic firewall rules. To learn some more examples, check out the UFW - Community Help Wiki.