Skip to main content

iptables Basics

iptables is a powerful Linux firewall that controls network traffic using rules and chains. This guide explains the fundamentals with detailed parameter explanations.


Understanding iptables​

What is iptables?​

iptables is a user-space utility program that allows you to configure the Linux kernel firewall (netfilter). It controls incoming and outgoing network traffic based on rules you define.

Key Concepts​

Tables​

iptables uses different tables for different purposes:

  • filter: Default table for packet filtering (ACCEPT, DROP, REJECT)
  • nat: Network Address Translation (PREROUTING, POSTROUTING)
  • mangle: Packet modification (TOS, TTL, MARK)
  • raw: Connection tracking exemption

Chains​

Chains are rule lists that packets traverse:

  • INPUT: Packets destined for the local system
  • OUTPUT: Packets originating from the local system
  • FORWARD: Packets routed through the system
  • PREROUTING: Packets entering the system (nat table)
  • POSTROUTING: Packets leaving the system (nat table)

Basic iptables Syntax​

Command Structure​

iptables [-t table] -[A|I|D|R] chain rule-specification [options]

Parameter Breakdown​

Table Selection (-t)​

-t filter    # Default table (packet filtering)
-t nat # Network Address Translation
-t mangle # Packet modification
-t raw # Connection tracking exemption

Chain Operations​

-A chain     # Append rule to end of chain
-I chain [position] # Insert rule at position (default: 1)
-D chain rule_number # Delete rule by number
-R chain rule_number # Replace rule by number
-F chain # Flush (delete all rules in chain)
-L chain # List rules in chain

Rule Specification​

-p protocol  # Protocol (tcp, udp, icmp, all)
-s source # Source address/network
-d destination # Destination address/network
-i interface # Input interface
-o interface # Output interface
--sport port # Source port
--dport port # Destination port
-j target # Jump to target (ACCEPT, DROP, REJECT)

Common Parameters Explained​

Protocol (-p)​

-p tcp       # TCP protocol
-p udp # UDP protocol
-p icmp # ICMP protocol
-p all # All protocols (default)

Address Specification (-s, -d)​

-s 192.168.1.100        # Single IP address
-s 192.168.1.0/24 # Network with CIDR notation
-s 192.168.1.0/255.255.255.0 # Network with netmask
-s !192.168.1.100 # Negation (NOT this address)
-d 10.0.0.0/8 # Destination network

Interface Specification (-i, -o)​

-i eth0      # Input interface
-i eth+ # Any interface starting with "eth"
-o wlan0 # Output interface
-i !eth0 # Negation (NOT this interface)

Port Specification (--sport, --dport)​

--sport 80           # Source port 80
--dport 22 # Destination port 22
--sport 1024:65535 # Source port range
--dport :1024 # Destination port less than 1024
--dport 80,443 # Multiple ports

Targets (-j)​

-j ACCEPT    # Accept the packet
-j DROP # Drop the packet silently
-j REJECT # Reject the packet with error message
-j LOG # Log the packet
-j RETURN # Return to calling chain
-j DNAT # Destination NAT
-j SNAT # Source NAT
-j MASQUERADE # Source NAT with dynamic IP

Basic Examples​

Allow SSH (Port 22)​

# Allow incoming SSH connections
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# Explanation:
# -A INPUT : Append to INPUT chain
# -p tcp : TCP protocol
# --dport 22 : Destination port 22
# -j ACCEPT : Accept the packet

Allow HTTP and HTTPS​

# Allow HTTP (port 80)
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# Allow HTTPS (port 443)
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

Allow Local Network​

# Allow traffic from local network
iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT

# Explanation:
# -A INPUT : Append to INPUT chain
# -s 192.168.1.0/24 : Source network 192.168.1.0/24
# -j ACCEPT : Accept the packet

Block Specific IP​

# Block traffic from specific IP
iptables -A INPUT -s 192.168.1.100 -j DROP

# Explanation:
# -A INPUT : Append to INPUT chain
# -s 192.168.1.100 : Source IP 192.168.1.100
# -j DROP : Drop the packet

Allow Established Connections​

# Allow established and related connections
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Explanation:
# -A INPUT : Append to INPUT chain
# -m state : Use state match module
# --state ESTABLISHED,RELATED : Match established/related connections
# -j ACCEPT : Accept the packet

Advanced Parameters​

State Matching (-m state)​

-m state --state NEW,ESTABLISHED,RELATED,INVALID

# States:
# NEW : New connection
# ESTABLISHED : Established connection
# RELATED : Related connection (e.g., FTP data)
# INVALID : Invalid packet

Connection Tracking (-m conntrack)​

-m conntrack --ctstate ESTABLISHED,RELATED

# More precise than state module
# --ctstate : Connection tracking state

Limit Rate (-m limit)​

-m limit --limit 10/minute --limit-burst 20

# --limit 10/minute : Allow 10 packets per minute
# --limit-burst 20 : Allow burst of 20 packets

Logging with Limit​

# Log SSH attempts with rate limiting
iptables -A INPUT -p tcp --dport 22 -m limit --limit 5/minute --limit-burst 10 -j LOG --log-prefix "SSH: "
iptables -A INPUT -p tcp --dport 22 -j DROP

Useful Commands​

List Rules​

iptables -L                    # List all rules
iptables -L -v # List with packet counts
iptables -L -n # List with numeric addresses
iptables -L --line-numbers # List with rule numbers

Save and Restore​

# Save rules
iptables-save > /etc/iptables/rules.v4

# Restore rules
iptables-restore < /etc/iptables/rules.v4

Clear Rules​

iptables -F                    # Flush all rules
iptables -F INPUT # Flush INPUT chain only
iptables -X # Delete custom chains

Set Default Policies​

iptables -P INPUT DROP         # Set default INPUT policy to DROP
iptables -P OUTPUT ACCEPT # Set default OUTPUT policy to ACCEPT
iptables -P FORWARD DROP # Set default FORWARD policy to DROP

Best Practices​

1. Set Default Policies​

# Set restrictive default policies
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

2. Allow Loopback​

# Allow loopback interface
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

3. Allow Established Connections​

# Allow established connections
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

4. Log Dropped Packets​

# Log dropped packets (with rate limiting)
iptables -A INPUT -m limit --limit 5/minute -j LOG --log-prefix "DROP: "

5. Save Rules​

# Save rules for persistence
iptables-save > /etc/iptables/rules.v4

Note: Always test your rules carefully and ensure you have alternative access methods before applying restrictive policies.