Table of Contents
- Understanding iptables Basics
- Getting Started: Prerequisites & Initial Setup
- Essential iptables Rules for Beginners
- Saving & Restoring Rules (Persistence)
- Advanced Tips for Beginners
- Best Practices
- Conclusion
- References
1. Understanding iptables Basics
Before diving into rules, let’s clarify what iptables is and how it works.
What is iptables?
iptables is a user-space utility that interacts with the Linux kernel’s netfilter framework—a built-in network filtering system. It allows you to define rules to:
- Allow or block network traffic (inbound, outbound, or forwarded).
- Modify packets (e.g., change source/destination IPs).
- Log traffic for monitoring.
Key Concepts:
- Tables: Collections of rules. The most common table for beginners is the
filtertable (used for blocking/allowing traffic). Other tables includenat(network address translation) andmangle(packet modification). - Chains: Predefined sequences of rules within a table. For the
filtertable, the key chains are:INPUT: Rules for traffic coming into the server.OUTPUT: Rules for traffic leaving out of the server.FORWARD: Rules for traffic passing through the server (e.g., a router).
- Rules: Conditions that traffic must match. If a packet matches a rule, an action (target) is applied:
ACCEPT: Let the packet through.DROP: Silently discard the packet (no response sent).REJECT: Discard the packet and send a “connection refused” response.LOG: Log details about the packet (before applying another action likeDROP).
2. Getting Started: Prerequisites & Initial Setup
Prerequisites
- A Linux system (iptables is preinstalled on most distributions like Ubuntu, CentOS, Debian).
sudoor root access (to modify iptables rules).- Basic familiarity with the command line.
Check Current Rules
First, see if there are existing rules (default is usually empty):
sudo iptables -L -v # -L = list rules; -v = verbose (shows packet counts)
Flush Existing Rules (Optional)
If you want to start fresh (warning: this removes all current rules!), run:
sudo iptables -F # -F = flush all rules
sudo iptables -X # -X = delete custom chains (if any)
⚠️ Caution: Flushing rules without saving them first will lose all existing firewall configurations!
3. Essential iptables Rules for Beginners
Let’s build a basic firewall step by step. These rules will block unwanted traffic while allowing essential services.
3.1 Set Default Policies
Default policies define what happens to packets that don’t match any rules. A “default deny” approach is secure: block all inbound traffic except what you explicitly allow.
Commands:
sudo iptables -P INPUT DROP # Drop all incoming packets by default
sudo iptables -P FORWARD DROP # Drop forwarded packets (if not a router)
sudo iptables -P OUTPUT ACCEPT # Allow all outgoing packets by default
What it does:
INPUT DROP: Inbound traffic is blocked unless a rule explicitly allows it.OUTPUT ACCEPT: Outbound traffic (e.g., your server browsing the web) is allowed by default.FORWARD DROP: If your server isn’t a router, there’s no need to forward traffic.
Why you need it: Prevents unauthorized access by default.
3.2 Allow Loopback Traffic
The lo (loopback) interface handles local network traffic (e.g., communication between services on the same server, like a web app and database). Blocking it breaks many applications.
Command:
sudo iptables -A INPUT -i lo -j ACCEPT # -i lo = match traffic from loopback interface
What it does: Allows traffic on the lo interface.
Why you need it: Critical for services like localhost, 127.0.0.1, and tools like curl http://localhost.
3.3 Allow SSH Connections
If you manage your server remotely via SSH (port 22), you must allow SSH traffic—otherwise, you’ll lock yourself out!
Basic Rule (Allow All SSH):
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT # -p tcp = TCP protocol; --dport 22 = port 22
Restrict to a Specific IP (More Secure):
To limit SSH access to your home/work IP (e.g., 192.168.1.100):
sudo iptables -A INPUT -p tcp -s 192.168.1.100 --dport 22 -j ACCEPT
What it does: Allows TCP traffic on port 22 (SSH) from the specified IP(s).
Why you need it: Without this, you won’t be able to SSH into your server after setting INPUT DROP.
3.4 Allow HTTP (Port 80) and HTTPS (Port 443)
If you run a web server (e.g., Nginx, Apache), allow HTTP (port 80) and HTTPS (port 443) traffic.
Commands:
# Allow HTTP (port 80)
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# Allow HTTPS (port 443)
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
What it does: Lets clients connect to your web server on standard HTTP/HTTPS ports.
Why you need it: Required for websites to be accessible to users.
3.5 Allow Ping (ICMP Echo Requests)
“Ping” uses ICMP echo requests to check if a server is reachable. Some admins block pings for security, but allowing them can help with troubleshooting.
Command:
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
What it does: Allows other devices to ping your server (e.g., ping your-server-ip).
Why you need it: Useful for network diagnostics (e.g., checking if your server is online).
3.6 Allow Established/Related Connections
If your server initiates an outbound connection (e.g., downloading a file, updating packages), the response (inbound traffic) must be allowed.
Command:
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
What it does:
ESTABLISHED: Allows traffic from an existing connection (e.g., a response to your server’s outbound request).RELATED: Allows traffic related to an existing connection (e.g., FTP data transfer).
Why you need it: Without this, outbound requests (e.g., sudo apt update) would fail because the server couldn’t receive responses.
3.7 Log Dropped Packets (For Debugging)
Logging dropped packets helps identify blocked traffic (e.g., a user trying to access a port you forgot to allow).
Command:
sudo iptables -A INPUT -j LOG --log-prefix "IPTABLES-DROP: " --log-level 4
What it does:
- Logs details (source IP, port, protocol) of dropped packets to
/var/log/syslog(or/var/log/messageson CentOS). --log-prefix "IPTABLES-DROP: ": Adds a label to log entries for easy filtering.
View Logs:
sudo grep "IPTABLES-DROP" /var/log/syslog
Why you need it: Debugging! If a service isn’t working, logs can show if iptables is blocking the traffic.
4. Saving & Restoring Rules (Persistence)
By default, iptables rules are temporary—they’re lost after a reboot. To make them permanent, save them to a file and restore on boot.
Save Rules
Save current rules to /etc/iptables/rules.v4 (IPv4):
sudo iptables-save | sudo tee /etc/iptables/rules.v4
Restore Rules on Boot
To load rules automatically at startup:
On Debian/Ubuntu:
Install iptables-persistent (saves/loads rules on reboot):
sudo apt install iptables-persistent
During installation, it will ask to save current rules (say “Yes”).
To update rules later:
sudo iptables-save | sudo tee /etc/iptables/rules.v4
sudo systemctl restart netfilter-persistent # Apply changes
On CentOS/RHEL:
Save rules to /etc/sysconfig/iptables:
sudo iptables-save | sudo tee /etc/sysconfig/iptables
Enable iptables service to load rules on boot:
sudo systemctl enable iptables
sudo systemctl start iptables
5. Advanced Tips for Beginners
Add Comments to Rules
Use -m comment --comment "Description" to document rules (avoids confusion later):
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT -m comment --comment "Allow SSH from office IP"
Insert Rules (Instead of Appending)
Use -I (insert) to add a rule at the top of the chain (overrides later rules):
sudo iptables -I INPUT 1 -i lo -j ACCEPT # Insert as the 1st rule (critical for loopback!)
Delete a Specific Rule
First, list rules with line numbers:
sudo iptables -L INPUT --line-numbers
Then delete by line number (e.g., delete line 3 in INPUT chain):
sudo iptables -D INPUT 3
6. Best Practices
- Start Simple: Build your firewall incrementally. Add rules one at a time and test.
- Backup Rules: Save rules before making changes:
sudo iptables-save > ~/iptables-backup-$(date +%F). - Avoid Locking Yourself Out: Always allow SSH before setting
INPUT DROP. If you lock out, use a console/physical access to fix. - Restrict Services: Limit access to ports (e.g., SSH) to specific IPs whenever possible.
- Update Regularly: Review rules periodically to remove outdated entries (e.g., a port you no longer use).
7. Conclusion
You now have a basic but secure iptables firewall! This guide covers the essentials: blocking unwanted traffic, allowing SSH/web services, logging, and persistence.
Remember, iptables is a powerful tool—this is just the starting point. As you learn more, you can explore advanced topics like port forwarding (NAT), rate limiting, or IPv6 (ip6tables).
Stay secure, and happy learning!