Performance Optimization Techniques
Performance Optimization Techniques
Every microsecond of latency impacts user experience on high-traffic websites. Firewall configurations must be meticulously optimized to minimize processing overhead while maintaining security effectiveness.
Hardware Acceleration and Offloading: Modern firewall appliances and network cards support hardware-based packet processing that dramatically improves performance:
# Enable network card offloading features
ethtool -K eth0 rx on tx on
ethtool -K eth0 gso on gro on tso on
ethtool -K eth0 lro on
# Check offload status
ethtool -k eth0 | grep -E "rx-checksumming|tx-checksumming|scatter-gather|tcp-segmentation-offload|generic-segmentation-offload|generic-receive-offload|large-receive-offload"
# Intel SR-IOV for virtualized environments
echo 8 > /sys/class/net/eth0/device/sriov_numvfs
# CPU affinity for network interrupts
# Bind network interrupts to specific CPU cores
grep eth0 /proc/interrupts | awk '{print $1}' | sed 's/://' | while read irq; do
echo 2 > /proc/irq/$irq/smp_affinity # Bind to CPU core 2
done
Connection Table Optimization: High-traffic sites require massive connection tracking tables:
#!/usr/bin/env python3
# Connection table optimizer
import subprocess
import psutil
class ConnectionTableOptimizer:
def __init__(self):
self.metrics = self.gather_metrics()
def gather_metrics(self):
"""Collect system and connection metrics"""
return {
'total_memory': psutil.virtual_memory().total,
'cpu_cores': psutil.cpu_count(),
'current_connections': self.get_connection_count(),
'connection_rate': self.estimate_connection_rate()
}
def calculate_optimal_settings(self):
"""Calculate optimal connection tracking settings"""
# Base calculations on available memory
# Reserve 1KB per connection entry
memory_for_conntrack = self.metrics['total_memory'] * 0.1 # 10% of RAM
max_connections = int(memory_for_conntrack / 1024)
# Calculate hash table size (should be 1/8 of max connections)
hashsize = max(16384, int(max_connections / 8))
# Round to power of 2
hashsize = 1 << (hashsize - 1).bit_length()
settings = {
'nf_conntrack_max': max_connections,
'nf_conntrack_buckets': hashsize,
'nf_conntrack_tcp_timeout_established': 432000, # 5 days for persistent connections
'nf_conntrack_tcp_timeout_time_wait': 60,
'nf_conntrack_tcp_timeout_close_wait': 60,
'nf_conntrack_tcp_timeout_fin_wait': 60,
'nf_conntrack_tcp_timeout_syn_recv': 60,
'nf_conntrack_tcp_timeout_syn_sent': 120
}
return settings
def apply_settings(self, settings):
"""Apply optimized settings"""
commands = [
f"echo {settings['nf_conntrack_max']} > /proc/sys/net/netfilter/nf_conntrack_max",
f"echo {settings['nf_conntrack_buckets']} > /sys/module/nf_conntrack/parameters/hashsize",
]
for param, value in settings.items():
if param.startswith('nf_conntrack_tcp_timeout_'):
commands.append(f"echo {value} > /proc/sys/net/netfilter/{param}")
for cmd in commands:
subprocess.run(cmd, shell=True)
# Make permanent
with open('/etc/sysctl.d/conntrack.conf', 'w') as f:
for param, value in settings.items():
if param != 'nf_conntrack_buckets':
f.write(f"net.netfilter.{param} = {value}\n")
Rule Optimization and Caching: Minimize rule processing overhead through intelligent organization:
#!/bin/bash
# Rule optimizer for high-traffic scenarios
# Create ipset for efficient IP matching
ipset create whitelist_ips hash:net maxelem 100000
ipset create blacklist_ips hash:net maxelem 1000000
ipset create ratelimit_ips hash:ip timeout 300 maxelem 50000
# Optimized iptables rules using ipsets
iptables -A INPUT -m set --match-set whitelist_ips src -j ACCEPT
iptables -A INPUT -m set --match-set blacklist_ips src -j DROP
# Use connection tracking helpers selectively
iptables -t raw -A PREROUTING -p tcp --dport 80 -j CT --notrack
iptables -t raw -A PREROUTING -p tcp --dport 443 -j CT --notrack
iptables -A INPUT -p tcp --dport 80 -m state --state UNTRACKED -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -m state --state UNTRACKED -j ACCEPT
# Implement caching for complex rules
iptables -N CACHED_DECISIONS
iptables -A INPUT -m recent --name cache --rcheck --seconds 60 -j CACHED_DECISIONS
iptables -A CACHED_DECISIONS -m recent --name cache_accept --rcheck -j ACCEPT
iptables -A CACHED_DECISIONS -m recent --name cache_drop --rcheck -j DROP