Tutorial

UFW Firewall Setup: Secure Your Ubuntu Server in 5 Minutes

March 21, 2026

Back to Blog

Every server connected to the internet faces a constant barrage of connection attempts, port scans, and brute-force attacks. Without a firewall, your server is essentially an open house with every door unlocked. UFW (Uncomplicated Firewall) is Ubuntu's answer to making Linux firewall configuration accessible to everyone — from beginners to seasoned sysadmins who just want to get things done quickly.

In this comprehensive guide, you will learn how to install, configure, and manage UFW to protect your Ubuntu server. We will cover everything from basic setup to advanced techniques like rate limiting and logging, complete with real terminal examples you can copy and paste.

Why Your Server Needs a Firewall

A freshly provisioned Ubuntu server typically has several services listening on various ports. SSH on port 22, perhaps a web server on 80 and 443, maybe a database on 3306 or 5432. Each open port is a potential entry point for attackers. A firewall acts as a gatekeeper, deciding which traffic is allowed in and which gets dropped silently.

The Reality of Unprotected Servers
A server exposed to the internet without a firewall will typically receive its first brute-force SSH attempt within minutes of going online. Automated bots continuously scan IP ranges looking for vulnerable services. A firewall is not optional — it is essential.

Consider what happens without a firewall: your database port might be accessible from the entire internet, your development tools could be exposed, and services meant only for localhost become attack vectors. A firewall ensures that only the traffic you explicitly approve reaches your server.

Internet Traffic
Firewall (UFW)
Allowed Services

What Is UFW?

UFW stands for Uncomplicated Firewall. It is a user-friendly frontend for iptables, the powerful but notoriously complex Linux firewall. While iptables requires you to understand chains, tables, and packet flow, UFW wraps all of that complexity into simple, human-readable commands.

UFW was created by the Ubuntu team and has been the default firewall configuration tool in Ubuntu since version 8.04. It is not a firewall itself — it is a management layer that generates iptables rules behind the scenes. This means you get the full power of iptables with a fraction of the complexity.

iptables (Direct)

iptables -A INPUT -p tcp --dport 22 -j ACCEPT

Complex syntax, easy to misconfigure, hard to read existing rules

UFW (Simplified)

ufw allow 22/tcp

Clean syntax, intuitive commands, human-readable rule output

Installing UFW

UFW comes pre-installed on most Ubuntu distributions. However, if you are using a minimal installation or a different Debian-based system, you may need to install it manually.

$ sudo apt update
$ sudo apt install ufw -y
Reading package lists... Done
ufw is already the newest version (0.36.2-1).

$ sudo ufw version
ufw 0.36.2

Before enabling UFW, let us verify its current status:

$ sudo ufw status
Status: inactive

Setting Default Policies

Before adding any rules, you should establish your default policies. The golden rule of firewall configuration is: deny everything by default, then allow only what you need. This is called a "default deny" policy and is the most secure approach.

$ sudo ufw default deny incoming
Default incoming policy changed to 'deny'
(be sure to update your rules accordingly)

$ sudo ufw default allow outgoing
Default outgoing policy changed to 'allow'
Why Allow Outgoing?
Your server needs to make outgoing connections for software updates, DNS lookups, sending emails, API calls, and time synchronization. Blocking outgoing traffic by default would break most server functionality. In high-security environments, you might deny outgoing and whitelist specific destinations, but for most servers, allowing outgoing is the practical choice.

Step-by-Step: Essential Firewall Rules

Now comes the critical part — adding rules for the services your server needs to function. The order in which you do this matters, especially for SSH.

1

Allow SSH Access (Critical — Do This First!)

If you are connected to your server via SSH and you enable UFW without allowing SSH first, you will be immediately locked out. This is the most common UFW mistake and can require console access to fix.

# Allow SSH (default port 22)
$ sudo ufw allow ssh
Rules updated
Rules updated (v6)

# Or if SSH runs on a custom port (e.g., 2847)
$ sudo ufw allow 2847/tcp
Rules updated
Warning: Do NOT enable UFW before allowing SSH!
If you enable UFW with default deny incoming and no SSH rule, your current SSH session will be terminated and you will lose access to your server. Always add the SSH rule first, then enable UFW.
2

Allow HTTP and HTTPS Traffic

If your server hosts websites or web applications, you need to allow traffic on ports 80 (HTTP) and 443 (HTTPS).

# Allow HTTP
$ sudo ufw allow 80/tcp
Rules updated

# Allow HTTPS
$ sudo ufw allow 443/tcp
Rules updated

# Or use the application profile for both at once
$ sudo ufw allow "Nginx Full"
Rules updated
3

Enable UFW

With your essential rules in place, it is time to activate the firewall.

$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup
4

Verify Your Rules

Always verify your firewall configuration after enabling it.

$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

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

Advanced UFW Rules

Allow Access from a Specific IP

Sometimes you want to allow access to a service only from a trusted IP address. This is common for database ports, admin panels, or monitoring tools.

# Allow MySQL access only from your application server
$ sudo ufw allow from 10.0.1.50 to any port 3306
Rules updated

# Allow SSH only from your office IP
$ sudo ufw allow from 203.0.113.50 to any port 22 proto tcp
Rules updated

# Allow an entire subnet
$ sudo ufw allow from 10.0.1.0/24 to any port 5432
Rules updated

Allow a Port Range

Some applications use a range of ports. For example, passive FTP typically uses ports 40000-50000, and some game servers use port ranges.

# Allow passive FTP port range
$ sudo ufw allow 40000:50000/tcp
Rules updated

# Allow a UDP port range for a game server
$ sudo ufw allow 27015:27030/udp
Rules updated

Deny Specific Traffic

While the default deny policy handles most cases, you might want to explicitly deny traffic from a known malicious IP or block a specific port.

# Block a specific IP address
$ sudo ufw deny from 192.168.1.100
Rules updated

# Block an entire subnet
$ sudo ufw deny from 10.10.0.0/16
Rules updated

# Reject instead of deny (sends ICMP unreachable)
$ sudo ufw reject from 172.16.0.0/12 to any port 25
Rules updated
Deny vs Reject
Deny silently drops the packet — the sender gets no response and eventually times out. Reject sends an ICMP "destination unreachable" message back. Deny is generally preferred for external traffic (attackers learn nothing), while reject can be useful for internal networks where you want quick feedback.

Managing Existing Rules

Viewing Rules with Numbers

To delete or insert rules, you need to know their rule numbers.

$ sudo ufw status numbered
Status: active

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

Deleting Rules

# Delete by rule number
$ sudo ufw delete 4
Deleting:
allow from 10.0.1.50 to any port 3306
Proceed with operation (y|n)? y
Rule deleted

# Or delete by rule specification
$ sudo ufw delete allow 80/tcp
Rule deleted
Rule Number Shift Warning
When you delete a rule by number, all subsequent rules shift down. If you need to delete multiple rules, start from the highest number and work down, or use the rule specification method instead.

Inserting Rules at a Specific Position

UFW processes rules from top to bottom and applies the first matching rule. You can insert rules at specific positions to control priority.

# Insert a deny rule at position 1 (highest priority)
$ sudo ufw insert 1 deny from 198.51.100.0/24
Rules updated

Rate Limiting with UFW

One of UFW's most useful features is built-in rate limiting. The limit rule denies connections from an IP address that has attempted 6 or more connections in the last 30 seconds. This is incredibly effective against brute-force attacks on SSH.

# Enable rate limiting on SSH
$ sudo ufw limit ssh
Rules updated
Rules updated (v6)

# Rate limit a custom port
$ sudo ufw limit 2847/tcp
Rules updated
Pro Tip: Replace allow with limit for SSH
If you already have an allow rule for SSH, delete it and replace it with a limit rule. This provides automatic brute-force protection with zero additional configuration. An IP making more than 6 connection attempts in 30 seconds gets temporarily blocked.
Rule TypeBehaviorBest For
allowPermits all matching trafficWeb ports (80, 443)
denySilently drops matching trafficBlocking malicious IPs
rejectDrops with ICMP responseInternal network blocks
limitRate-limits (6 conn/30 sec)SSH, login pages

Application Profiles

UFW supports application profiles — predefined rule sets that applications can register. This makes it easier to manage firewall rules for complex applications.

# List available application profiles
$ sudo ufw app list
Available applications:
Nginx Full
Nginx HTTP
Nginx HTTPS
OpenSSH

# Get details about a profile
$ sudo ufw app info "Nginx Full"
Profile: Nginx Full
Title: Web Server (Nginx, HTTP + HTTPS)
Description: Small, but very powerful and efficient web server

Ports:
80,443/tcp

Enabling UFW Logging

Firewall logs are invaluable for security monitoring and troubleshooting connectivity issues. UFW supports multiple logging levels.

# Enable logging (default: low)
$ sudo ufw logging on
Logging enabled

# Set logging level (off, low, medium, high, full)
$ sudo ufw logging medium
Logging enabled
LevelWhat It LogsRecommendation
lowBlocked packets that match default policyProduction
mediumLow + allowed packets, invalid packetsDebugging
highMedium + rate limitingTroubleshooting
fullEverything without rate limitingTemporary only

UFW logs are written to /var/log/ufw.log. Here is what a typical blocked connection looks like:

$ sudo tail -5 /var/log/ufw.log
Mar 17 14:23:01 server1 kernel: [UFW BLOCK] IN=eth0 OUT=
MAC=... SRC=198.51.100.45 DST=203.0.113.10 LEN=44
TOS=0x00 PREC=0x00 TTL=242 PROTO=TCP SPT=54321 DPT=22
WINDOW=1024 RES=0x00 SYN URGP=0

IPv6 Support

Modern servers need to handle both IPv4 and IPv6 traffic. UFW supports IPv6 out of the box, but you should verify it is enabled in the configuration file.

# Verify IPv6 is enabled
$ grep IPV6 /etc/default/ufw
IPV6=yes

# If it shows 'no', edit the file
$ sudo nano /etc/default/ufw
# Change IPV6=no to IPV6=yes

# Reload UFW to apply
$ sudo ufw reload
Firewall reloaded

Resetting UFW

If your rules become too complex or you want to start fresh, you can reset UFW to its default state.

$ sudo ufw reset
Resetting all rules to installed defaults. This may disrupt existing
ssh connections. Proceed with operation (y|n)? y
Backing up 'user.rules' to '/etc/ufw/user.rules.20260317_142500'
Backing up 'before.rules' to '/etc/ufw/before.rules.20260317_142500'
Reset Creates Backups
UFW automatically backs up your current rules before resetting. These backups are stored in /etc/ufw/ and can be restored if needed. However, reset also disables UFW, so remember to re-enable it after reconfiguring your rules.

Common UFW Configurations

Here are complete UFW configurations for common server roles:

Web Server

ufw default deny incoming
ufw default allow outgoing
ufw limit ssh
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable

Database Server

ufw default deny incoming
ufw default allow outgoing
ufw limit ssh
ufw allow from 10.0.1.0/24 to any port 5432
ufw allow from 10.0.1.0/24 to any port 3306
ufw enable

Mail Server

ufw default deny incoming
ufw default allow outgoing
ufw limit ssh
ufw allow 25/tcp
ufw allow 587/tcp
ufw allow 993/tcp
ufw enable

FTP Server

ufw default deny incoming
ufw default allow outgoing
ufw limit ssh
ufw allow 21/tcp
ufw allow 40000:50000/tcp
ufw enable

Troubleshooting Common Issues

ProblemCauseSolution
Locked out of SSHEnabled UFW without SSH ruleAccess via console, run ufw allow ssh
Website not loadingPort 80/443 not allowedufw allow "Nginx Full"
Database connection refusedDB port blocked for remote IPsufw allow from [IP] to any port [PORT]
Rules not taking effectUFW not enabled or needs reloadufw enable or ufw reload
IPv6 traffic not filteredIPv6 disabled in UFW configSet IPV6=yes in /etc/default/ufw
FTP passive mode failingPassive port range not openAllow the passive port range (e.g., 40000:50000)

UFW vs nftables: Understanding the Landscape

While UFW is excellent for straightforward firewall management, it is worth understanding the broader Linux firewall ecosystem. Under the hood, UFW generates iptables rules. However, the Linux kernel has been transitioning to nftables as the successor to iptables since kernel 3.13, and modern distributions are increasingly adopting it as the default.

FeatureUFW (iptables)nftables
Ease of useSimple CLIModerate
PerformanceGoodBetter
IPv4/IPv6 unifiedSeparateUnified
Atomic rule updatesNoYes
Advanced matchingLimitedPowerful
Best forSingle servers, simple rulesComplex setups, high traffic

For most single-server setups, UFW provides more than enough capability. As your infrastructure grows or your requirements become more complex, migrating to nftables directly gives you more power and better performance.

Security Best Practices Checklist

  • Always set default deny incoming before enabling UFW
  • Allow SSH first, then enable the firewall — never the reverse
  • Use limit instead of allow for SSH to prevent brute-force attacks
  • Restrict database ports to specific IPs, never open them to the world
  • Enable logging at low level for production monitoring
  • Regularly audit your rules with ufw status numbered
  • Use application profiles when available for cleaner rule management
  • Test firewall changes from a second terminal before closing your current session
  • Keep IPv6 enabled — attackers use it too
  • Document your firewall rules and the reason for each one

Web-Based Firewall Management with Panelica

While UFW is a solid choice for command-line firewall management, server management panels can simplify the process further. Panelica uses nftables — UFW's more powerful successor — as its firewall backend, providing a modern web-based interface for all your firewall needs.

nftables
Modern firewall backend with unified IPv4/IPv6
Fail2Ban
Integrated intrusion prevention with auto-ban

With Panelica's firewall module, you can create inbound and outbound rules through a visual interface, block IP addresses temporarily or permanently with a single click, view real-time firewall logs, and integrate with Fail2Ban for automatic brute-force protection. The combination of nftables and Fail2Ban provides enterprise-grade security without requiring deep command-line expertise.

Key Takeaway
UFW is an excellent starting point for securing your Ubuntu server. Within five minutes, you can establish a solid firewall configuration that blocks unauthorized access while allowing legitimate traffic. As your needs grow, consider tools like nftables for more advanced capabilities, or use a panel that manages firewall rules through a web interface.
Share: