Skip to main content

Advanced iptables Rules

Advanced iptables configurations for complex networking scenarios with detailed parameter explanations.


Network Address Translation (NAT)​

Source NAT (SNAT)​

Changes the source IP address of outgoing packets.

Basic SNAT​

# Change source IP to 192.168.1.1
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 203.0.113.1

# Explanation:
# -t nat : Use NAT table
# -A POSTROUTING : Append to POSTROUTING chain
# -s 192.168.1.0/24 : Source network (internal)
# -j SNAT : Source NAT target
# --to-source 203.0.113.1 : New source IP (external)

MASQUERADE (Dynamic IP)​

# Use interface IP for NAT (for dynamic IP)
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE

# Explanation:
# -t nat : Use NAT table
# -A POSTROUTING : Append to POSTROUTING chain
# -s 192.168.1.0/24 : Source network
# -o eth0 : Output interface
# -j MASQUERADE : Use interface IP for NAT

Destination NAT (DNAT)​

Changes the destination IP address of incoming packets.

Port Forwarding​

# Forward external port 8080 to internal server
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80

# Explanation:
# -t nat : Use NAT table
# -A PREROUTING : Append to PREROUTING chain
# -p tcp : TCP protocol
# --dport 8080 : External port
# -j DNAT : Destination NAT target
# --to-destination 192.168.1.100:80 : Internal server:port

Load Balancing​

# Load balance between multiple servers
iptables -t nat -A PREROUTING -p tcp --dport 80 -m statistic --mode random --probability 0.5 -j DNAT --to-destination 192.168.1.100:80
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.101:80

# Explanation:
# -m statistic --mode random --probability 0.5 : 50% probability
# First rule: 50% to 192.168.1.100
# Second rule: Remaining 50% to 192.168.1.101

Advanced Matching Modules​

String Matching (-m string)​

Match packets containing specific strings.

# Block packets containing "malware" string
iptables -A INPUT -m string --string "malware" --algo bm -j DROP

# Explanation:
# -m string : Use string match module
# --string "malware" : String to match
# --algo bm : Boyer-Moore algorithm (faster)
# -j DROP : Drop matching packets

Time Matching (-m time)​

Match packets based on time criteria.

# Allow SSH only during business hours
iptables -A INPUT -p tcp --dport 22 -m time --timestart 09:00 --timestop 17:00 --days Mon,Tue,Wed,Thu,Fri -j ACCEPT

# Explanation:
# -m time : Use time match module
# --timestart 09:00 : Start time
# --timestop 17:00 : End time
# --days Mon,Tue,Wed,Thu,Fri : Days of week

Connection Limit (-m connlimit)​

Limit the number of connections per IP.

# Limit SSH connections to 3 per IP
iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP

# Explanation:
# -m connlimit : Use connection limit module
# --connlimit-above 3 : Drop if more than 3 connections

Recent Module (-m recent)​

Track recent connections and take action.

# Block IPs with too many SSH attempts
iptables -A INPUT -p tcp --dport 22 -m recent --name SSH --set
iptables -A INPUT -p tcp --dport 22 -m recent --name SSH --update --seconds 60 --hitcount 3 -j DROP

# Explanation:
# --name SSH : Name for tracking list
# --set : Add source IP to list
# --update : Update existing entry
# --seconds 60 : Time window
# --hitcount 3 : Block after 3 attempts

Custom Chains​

Creating Custom Chains​

# Create custom chain for web traffic
iptables -N WEB

# Add rules to custom chain
iptables -A WEB -p tcp --dport 80 -j ACCEPT
iptables -A WEB -p tcp --dport 443 -j ACCEPT
iptables -A WEB -j DROP

# Use custom chain in INPUT
iptables -A INPUT -p tcp -j WEB

# Explanation:
# -N WEB : Create new chain named WEB
# -A WEB : Add rules to WEB chain
# -A INPUT -p tcp -j WEB : Jump to WEB chain for TCP traffic

Logging Chain​

# Create logging chain
iptables -N LOGGING

# Add logging rules
iptables -A LOGGING -j LOG --log-prefix "IPTABLES-LOG: "
iptables -A LOGGING -j DROP

# Use logging chain
iptables -A INPUT -p tcp --dport 22 -j LOGGING

Complex Rule Examples​

Web Server Protection​

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

# Allow HTTP/HTTPS
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# Rate limit HTTP requests
iptables -A INPUT -p tcp --dport 80 -m limit --limit 100/minute --limit-burst 200 -j ACCEPT

# Block excessive requests
iptables -A INPUT -p tcp --dport 80 -m limit --limit 10/minute -j LOG --log-prefix "HTTP-FLOOD: "
iptables -A INPUT -p tcp --dport 80 -j DROP

FTP Server Rules​

# Allow FTP control connection
iptables -A INPUT -p tcp --dport 21 -j ACCEPT

# Allow FTP data connections (related)
iptables -A INPUT -m state --state RELATED -j ACCEPT

# Allow passive FTP ports (if needed)
iptables -A INPUT -p tcp --dport 30000:31000 -j ACCEPT

DMZ Configuration​

# Allow traffic to DMZ
iptables -A FORWARD -i eth0 -o eth1 -d 192.168.2.0/24 -j ACCEPT

# Allow return traffic from DMZ
iptables -A FORWARD -i eth1 -o eth0 -s 192.168.2.0/24 -j ACCEPT

# NAT for DMZ
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o eth0 -j MASQUERADE

Performance Optimization​

Rule Ordering​

# Most common rules first (for performance)
iptables -I INPUT 1 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -I INPUT 2 -i lo -j ACCEPT
iptables -I INPUT 3 -p tcp --dport 22 -j ACCEPT

Using ipset for Large Lists​

# Create ipset for blocked IPs
ipset create blocked hash:ip

# Add IPs to set
ipset add blocked 192.168.1.100
ipset add blocked 10.0.0.50

# Use ipset in iptables
iptables -A INPUT -m set --match-set blocked src -j DROP

Monitoring and Debugging​

Packet Counting​

# List rules with packet counts
iptables -L -v

# Reset counters
iptables -Z

Rule Testing​

# Test specific rule
iptables -C INPUT -p tcp --dport 22 -j ACCEPT

# Check if rule exists (exit code 0 = exists)
echo $?

Logging and Monitoring​

# Log all dropped packets
iptables -A INPUT -j LOG --log-prefix "DROP: "

# Monitor logs
tail -f /var/log/messages | grep "DROP: "

Security Considerations​

Anti-Spoofing Rules​

# Block spoofed packets
iptables -A INPUT -s 127.0.0.0/8 -j DROP
iptables -A INPUT -s 0.0.0.0/8 -j DROP
iptables -A INPUT -s 255.255.255.255 -j DROP

Fragment Protection​

# Block fragmented packets (potential attacks)
iptables -A INPUT -f -j DROP

SYN Flood Protection​

# Limit SYN packets (SYN flood protection)
iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP

Persistence and Management​

Save Rules​

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

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

Automatic Restoration​

# Create systemd service for auto-restore
cat > /etc/systemd/system/iptables-restore.service << EOF
[Unit]
Description=Restore iptables rules
Before=network.target

[Service]
Type=oneshot
ExecStart=/sbin/iptables-restore /etc/iptables/rules.v4
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
EOF

# Enable service
systemctl enable iptables-restore.service

Note: Test all rules in a safe environment before applying to production systems.