Firewall y iptables en Linux: Seguridad de Red Avanzada
Un firewall es la primera línea de defensa en la seguridad de cualquier sistema. En Linux, iptables es la herramienta estándar para configurar el firewall del kernel (netfilter), ofreciendo un control granular sobre todo el tráfico de red que entra, sale o atraviesa el sistema.
Conceptos Fundamentales
¿Qué es Netfilter/iptables?
Netfilter es un framework en el kernel de Linux que permite interceptar y manipular paquetes de red. iptables es la herramienta de espacio de usuario que configura las reglas de netfilter.
1
2
3
4
5
6
7
| # Verificar si iptables está disponible
which iptables
iptables --version
# Ver estado del kernel netfilter
lsmod | grep netfilter
lsmod | grep iptable
|
Arquitectura de Netfilter
Las 5 Tablas Principales
- filter (por defecto): Filtra paquetes (ACCEPT, DROP, REJECT)
- nat: Network Address Translation
- mangle: Modifica headers de paquetes
- raw: Configuración antes del connection tracking
- security: Usado por SELinux
Las 5 Cadenas Predefinidas
- INPUT: Paquetes dirigidos al sistema local
- OUTPUT: Paquetes generados por el sistema local
- FORWARD: Paquetes que atraviesan el sistema (routing)
- PREROUTING: Paquetes antes del routing
- POSTROUTING: Paquetes después del routing
1
2
3
4
5
6
7
| # Ver todas las reglas de todas las tablas
iptables -L -n -v
iptables -t nat -L -n -v
iptables -t mangle -L -n -v
# Ver reglas con números de línea
iptables -L --line-numbers
|
Comandos Básicos de iptables
Gestión de Reglas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| # Listar reglas actuales
iptables -L # Lista formato legible
iptables -L -n # Sin resolución DNS
iptables -L -v # Verbose (con contadores)
iptables -L -n -v --line-numbers # Con números de línea
# Limpiar todas las reglas
iptables -F # Flush todas las reglas
iptables -F INPUT # Flush solo cadena INPUT
iptables -X # Eliminar cadenas custom
iptables -Z # Reset contadores
# Política por defecto
iptables -P INPUT DROP # Denegar por defecto en INPUT
iptables -P FORWARD DROP # Denegar por defecto en FORWARD
iptables -P OUTPUT ACCEPT # Permitir por defecto en OUTPUT
|
Sintaxis de Reglas
1
2
3
4
5
6
7
8
9
| # Estructura básica
iptables -A INPUT -s IP_ORIGEN -d IP_DESTINO -p PROTOCOLO --dport PUERTO -j ACCIÓN
# Ejemplos básicos
iptables -A INPUT -p tcp --dport 22 -j ACCEPT # Permitir SSH
iptables -A INPUT -p tcp --dport 80 -j ACCEPT # Permitir HTTP
iptables -A INPUT -p tcp --dport 443 -j ACCEPT # Permitir HTTPS
iptables -A INPUT -i lo -j ACCEPT # Permitir loopback
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # Conexiones establecidas
|
Configuración de Firewall Básico
Firewall Restrictivo (Deny by Default)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
| #!/bin/bash
# firewall_basico.sh - Configuración básica de firewall
# Limpiar reglas existentes
iptables -F
iptables -X
iptables -Z
# Políticas por defecto (DENY)
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# Permitir loopback (esencial)
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# Permitir conexiones establecidas y relacionadas
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Permitir SSH (cambiar puerto si es necesario)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# Permitir servicios web
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# Permitir ping (ICMP)
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
# Log y drop resto del tráfico
iptables -A INPUT -j LOG --log-prefix "IPTABLES DROP: "
iptables -A INPUT -j DROP
echo "Firewall básico configurado"
|
Firewall para Servidor Web
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
| #!/bin/bash
# firewall_web_server.sh - Firewall para servidor web
# Reset reglas
iptables -F && iptables -X && iptables -Z
# Políticas por defecto
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# Loopback
iptables -A INPUT -i lo -j ACCEPT
# Conexiones establecidas
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# SSH con rate limiting
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --name SSH -j DROP
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# Servicios web
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# FTP (si es necesario)
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 20 -j ACCEPT
# DNS (para resoluciones locales)
iptables -A INPUT -p udp --dport 53 -j ACCEPT
iptables -A INPUT -p tcp --dport 53 -j ACCEPT
# NTP
iptables -A INPUT -p udp --dport 123 -j ACCEPT
# ICMP (ping) con rate limiting
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/second -j ACCEPT
# Log ataques antes de drop
iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "IPTABLES DENIED: " --log-level 7
# Drop resto
iptables -A INPUT -j DROP
echo "Firewall de servidor web configurado"
|
Reglas Avanzadas
Connection Tracking y Estado
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| # Estados de conexión
# NEW: Nueva conexión
# ESTABLISHED: Conexión establecida
# RELATED: Relacionada con conexión existente
# INVALID: Paquete inválido
# Permitir solo nuevas conexiones HTTP/HTTPS
iptables -A INPUT -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
# Bloquear paquetes inválidos
iptables -A INPUT -m state --state INVALID -j DROP
# FTP con connection tracking
iptables -A INPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --sport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT
|
Rate Limiting y DoS Protection
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| # Limitar conexiones SSH por IP
iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j REJECT
# Rate limiting para HTTP
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
# Protección contra syn flood
iptables -A INPUT -p tcp --syn -m limit --limit 1/second --limit-burst 3 -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP
# Bloquear ping flood
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/second -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
# Protección contra port scan
iptables -N port-scan
iptables -A port-scan -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j RETURN
iptables -A port-scan -j DROP
iptables -A INPUT -p tcp -j port-scan
|
Geo-blocking y Listas de IPs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| # Bloquear país específico (requiere xtables-addons)
iptables -A INPUT -m geoip --src-cc CN,RU -j DROP
# Lista negra de IPs
iptables -A INPUT -s 192.168.1.100 -j DROP
iptables -A INPUT -s 10.0.0.0/8 -j DROP
# Lista blanca para administración
iptables -A INPUT -s 203.0.113.10 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
# Usar ipset para listas grandes
ipset create blacklist hash:ip
ipset add blacklist 192.168.1.100
ipset add blacklist 10.0.0.50
iptables -A INPUT -m set --match-set blacklist src -j DROP
|
Time-based Rules
1
2
3
4
5
6
7
8
9
| # Permitir SSH solo en horario laboral
iptables -A INPUT -p tcp --dport 22 -m time --timestart 08:00 --timestop 18:00 --weekdays Mon,Tue,Wed,Thu,Fri -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
# Backup nocturno
iptables -A INPUT -s 192.168.1.200 -p tcp --dport 22 -m time --timestart 02:00 --timestop 04:00 -j ACCEPT
# Bloquear tráfico web los fines de semana
iptables -A FORWARD -p tcp --dport 80 -m time --weekdays Sat,Sun -j DROP
|
NAT y Port Forwarding
SNAT y Masquerading
1
2
3
4
5
6
7
8
9
10
11
12
| # Masquerading para red interna (router/gateway)
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
# SNAT específico
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.10
# Habilitar IP forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
# Hacer permanente en /etc/sysctl.conf:
# net.ipv4.ip_forward = 1
|
DNAT y Port Forwarding
1
2
3
4
5
6
7
8
9
10
11
12
| # Redirigir puerto externo a servidor interno
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80
# Redirigir múltiples puertos
iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to-destination 192.168.1.100:443
iptables -t nat -A PREROUTING -p tcp --dport 25 -j DNAT --to-destination 192.168.1.101:25
# Port forwarding con rango de puertos
iptables -t nat -A PREROUTING -p tcp --dport 8000:8010 -j DNAT --to-destination 192.168.1.100:8000-8010
# Redirigir SSH a puerto no estándar
iptables -t nat -A PREROUTING -p tcp --dport 2222 -j DNAT --to-destination 192.168.1.50:22
|
Load Balancing con iptables
1
2
3
4
5
6
7
| # Load balancing simple entre dos servidores
iptables -t nat -A PREROUTING -p tcp --dport 80 -m statistic --mode nth --every 2 --packet 0 -j DNAT --to-destination 192.168.1.100:80
iptables -t nat -A PREROUTING -p tcp --dport 80 -m statistic --mode nth --every 2 --packet 1 -j DNAT --to-destination 192.168.1.101:80
# Load balancing con pesos (random)
iptables -t nat -A PREROUTING -p tcp --dport 80 -m statistic --mode random --probability 0.7 -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
|
Cadenas Personalizadas
Crear y Usar Cadenas Custom
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| # Crear cadena personalizada
iptables -N SECURITY_CHECKS
iptables -N SSH_RULES
iptables -N WEB_RULES
# Agregar reglas a cadena personalizada
iptables -A SECURITY_CHECKS -m state --state INVALID -j DROP
iptables -A SECURITY_CHECKS -p tcp --tcp-flags ALL NONE -j DROP
iptables -A SECURITY_CHECKS -p tcp --tcp-flags ALL ALL -j DROP
iptables -A SECURITY_CHECKS -j RETURN
# Usar cadena en INPUT
iptables -A INPUT -j SECURITY_CHECKS
# Cadena para SSH con rate limiting
iptables -A SSH_RULES -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH_CONN
iptables -A SSH_RULES -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --name SSH_CONN -j DROP
iptables -A SSH_RULES -p tcp --dport 22 -j ACCEPT
iptables -A SSH_RULES -j RETURN
# Usar cadena SSH
iptables -A INPUT -j SSH_RULES
|
Logging Avanzado
1
2
3
4
5
6
7
8
9
10
11
12
| # Crear cadena de logging
iptables -N LOG_AND_DROP
iptables -A LOG_AND_DROP -j LOG --log-prefix "FIREWALL DROP: " --log-level 4
iptables -A LOG_AND_DROP -j DROP
# Logging con rate limiting
iptables -A INPUT -j LOG --log-prefix "DENIED: " --log-level 4 -m limit --limit 5/min --limit-burst 10
iptables -A INPUT -j DROP
# Log específico para SSH
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j LOG --log-prefix "SSH_NEW_CONN: "
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
|
Scripts de Automatización
Script Modular de Firewall
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
| #!/bin/bash
# firewall_advanced.sh - Firewall modular avanzado
set -e
# Configuración
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
IPTABLES="/sbin/iptables"
IP6TABLES="/sbin/ip6tables"
# Interfaces de red
WAN_IF="eth0"
LAN_IF="eth1"
# Redes
LAN_NET="192.168.1.0/24"
WAN_IP="203.0.113.10"
# Puertos permitidos
SSH_PORT="22"
WEB_PORTS="80 443"
MAIL_PORTS="25 587 993 995"
# Función de logging
log() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1"
}
# Función para limpiar reglas
cleanup_rules() {
log "Limpiando reglas existentes..."
$IPTABLES -F
$IPTABLES -X
$IPTABLES -Z
$IPTABLES -t nat -F
$IPTABLES -t nat -X
$IPTABLES -t mangle -F
$IPTABLES -t mangle -X
}
# Configurar políticas por defecto
set_default_policies() {
log "Configurando políticas por defecto..."
$IPTABLES -P INPUT DROP
$IPTABLES -P FORWARD DROP
$IPTABLES -P OUTPUT ACCEPT
}
# Reglas básicas de seguridad
basic_security_rules() {
log "Aplicando reglas básicas de seguridad..."
# Loopback
$IPTABLES -A INPUT -i lo -j ACCEPT
$IPTABLES -A OUTPUT -o lo -j ACCEPT
# Conexiones establecidas
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Bloquear paquetes inválidos
$IPTABLES -A INPUT -m state --state INVALID -j DROP
# Protección básica contra ataques
$IPTABLES -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
$IPTABLES -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
$IPTABLES -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
$IPTABLES -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
}
# Reglas para servicios
configure_services() {
log "Configurando servicios permitidos..."
# SSH con rate limiting
$IPTABLES -A INPUT -p tcp --dport $SSH_PORT -m state --state NEW -m recent --set --name SSH
$IPTABLES -A INPUT -p tcp --dport $SSH_PORT -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --name SSH -j DROP
$IPTABLES -A INPUT -p tcp --dport $SSH_PORT -j ACCEPT
# Servicios web
for port in $WEB_PORTS; do
$IPTABLES -A INPUT -p tcp --dport $port -j ACCEPT
done
# Email (si es servidor de mail)
for port in $MAIL_PORTS; do
$IPTABLES -A INPUT -p tcp --dport $port -j ACCEPT
done
# ICMP con rate limiting
$IPTABLES -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/second -j ACCEPT
$IPTABLES -A INPUT -p icmp --icmp-type echo-request -j DROP
}
# NAT para red interna
configure_nat() {
if [ -n "$LAN_IF" ]; then
log "Configurando NAT para red interna..."
# Masquerading
$IPTABLES -t nat -A POSTROUTING -o $WAN_IF -j MASQUERADE
# Forward rules
$IPTABLES -A FORWARD -i $LAN_IF -o $WAN_IF -j ACCEPT
$IPTABLES -A FORWARD -i $WAN_IF -o $LAN_IF -m state --state RELATED,ESTABLISHED -j ACCEPT
# Habilitar IP forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
fi
}
# Logging y reglas finales
final_rules() {
log "Aplicando reglas de logging y drop final..."
# Log antes de drop (con rate limiting)
$IPTABLES -A INPUT -m limit --limit 5/min -j LOG --log-prefix "IPTABLES DROP: " --log-level 7
# Drop todo lo demás
$IPTABLES -A INPUT -j DROP
$IPTABLES -A FORWARD -j DROP
}
# Guardar reglas (Debian/Ubuntu)
save_rules() {
log "Guardando reglas..."
if command -v iptables-save > /dev/null; then
iptables-save > /etc/iptables/rules.v4
log "Reglas guardadas en /etc/iptables/rules.v4"
fi
}
# Función principal
main() {
log "Iniciando configuración de firewall..."
cleanup_rules
set_default_policies
basic_security_rules
configure_services
configure_nat
final_rules
save_rules
log "Firewall configurado exitosamente"
# Mostrar estadísticas
echo
echo "=== REGLAS ACTIVAS ==="
$IPTABLES -L -n -v --line-numbers
}
# Verificar que se ejecuta como root
if [ "$EUID" -ne 0 ]; then
echo "Este script debe ejecutarse como root"
exit 1
fi
# Ejecutar función principal
main "$@"
|
Script de Monitoreo de Firewall
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
| #!/bin/bash
# monitor_firewall.sh - Monitoreo del firewall
LOG_FILE="/var/log/firewall_monitor.log"
BLOCKED_IPS_FILE="/tmp/blocked_ips.txt"
ALERT_THRESHOLD=50
# Función de logging
log() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
}
# Obtener IPs bloqueadas en la última hora
get_blocked_ips() {
grep "IPTABLES DROP" /var/log/syslog | \
grep "$(date '+%b %d %H')" | \
awk '{print $12}' | \
sed 's/SRC=//' | \
sort | uniq -c | sort -nr > "$BLOCKED_IPS_FILE"
}
# Verificar ataques
check_attacks() {
local attacks=0
while read line; do
count=$(echo $line | awk '{print $1}')
ip=$(echo $line | awk '{print $2}')
if [ "$count" -gt "$ALERT_THRESHOLD" ]; then
log "ALERTA: IP $ip bloqueada $count veces en la última hora"
attacks=$((attacks + 1))
# Agregar a lista negra temporal si no existe
if ! iptables -L INPUT -n | grep -q "$ip"; then
iptables -I INPUT -s "$ip" -j DROP
log "IP $ip agregada a lista negra temporal"
fi
fi
done < "$BLOCKED_IPS_FILE"
if [ "$attacks" -gt 0 ]; then
log "Total de ataques detectados: $attacks"
fi
}
# Estadísticas de conexiones
connection_stats() {
local total_rules=$(iptables -L INPUT -n | grep -c "^ACCEPT\|^DROP\|^REJECT")
local established_conns=$(netstat -ant | grep ESTABLISHED | wc -l)
log "Estadísticas: $total_rules reglas activas, $established_conns conexiones establecidas"
}
# Función principal
main() {
log "Iniciando monitoreo de firewall"
get_blocked_ips
check_attacks
connection_stats
log "Monitoreo completado"
}
main "$@"
|
Herramientas Avanzadas
UFW (Uncomplicated Firewall)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| # Instalar UFW
sudo apt install ufw
# Configuración básica
sudo ufw default deny incoming
sudo ufw default allow outgoing
# Permitir servicios específicos
sudo ufw allow ssh
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow from 192.168.1.0/24
# Reglas avanzadas
sudo ufw allow from 203.0.113.10 to any port 22
sudo ufw limit ssh
sudo ufw deny from 192.168.1.100
# Activar firewall
sudo ufw enable
# Ver estado
sudo ufw status verbose
sudo ufw status numbered
|
firewalld (CentOS/RHEL)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| # Instalar firewalld
sudo dnf install firewalld
# Configuración básica
sudo systemctl enable firewalld
sudo systemctl start firewalld
# Zonas y servicios
firewall-cmd --get-default-zone
firewall-cmd --list-all
firewall-cmd --get-services
# Permitir servicios
firewall-cmd --permanent --add-service=ssh
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
# Puertos específicos
firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --permanent --add-port=1000-2000/tcp
# Rich rules
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" accept'
# Aplicar cambios
firewall-cmd --reload
|
Mejores Prácticas
Seguridad
- Principio de menor privilegio: Solo permitir tráfico necesario
- Denegar por defecto: Política restrictiva inicial
- Rate limiting: Proteger contra ataques de fuerza bruta
- Logging: Auditar todo el tráfico bloqueado
- Backup de reglas: Mantener configuraciones respaldadas
- Testing: Probar reglas en entorno controlado
1
2
3
4
5
6
7
8
9
10
| # Optimizar rendimiento de iptables
# Usar ipset para listas grandes de IPs
ipset create blacklist hash:ip maxelem 1000000
iptables -A INPUT -m set --match-set blacklist src -j DROP
# Usar connection tracking eficientemente
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Minimizar número de reglas
# Colocar reglas más frecuentes primero
|
Automatización
1
2
3
4
5
6
7
8
| # Cron job para aplicar reglas al inicio
@reboot /root/scripts/firewall_advanced.sh
# Backup diario de reglas
0 2 * * * iptables-save > /backup/iptables-$(date +\%Y\%m\%d).rules
# Monitoreo cada 5 minutos
*/5 * * * * /root/scripts/monitor_firewall.sh
|
Troubleshooting
Debugging de Reglas
1
2
3
4
5
6
7
8
9
10
11
12
| # Rastrear paquetes específicos
iptables -t raw -A PREROUTING -s 192.168.1.100 -j TRACE
iptables -t raw -A OUTPUT -d 192.168.1.100 -j TRACE
# Ver logs en tiempo real
tail -f /var/log/syslog | grep "TRACE\|iptables"
# Verificar contadores de reglas
iptables -L -n -v --line-numbers
# Reset contadores para testing
iptables -Z
|
Problemas Comunes
1
2
3
4
5
6
7
8
9
10
11
| # Permitir tráfico local temporalmente
iptables -I INPUT 1 -s 192.168.1.0/24 -j ACCEPT
# Verificar si regla existe
iptables -C INPUT -p tcp --dport 22 -j ACCEPT
# Eliminar regla específica
iptables -D INPUT -p tcp --dport 22 -j ACCEPT
# Flush todas las reglas (CUIDADO en remoto)
iptables -F && iptables -X && iptables -P INPUT ACCEPT
|
Conclusión
Un firewall bien configurado es fundamental para la seguridad de cualquier sistema Linux. iptables ofrece un control granular y flexible que, cuando se domina, proporciona protección robusta contra amenazas de red.
Las claves del éxito incluyen:
- Entender la arquitectura de netfilter
- Implementar políticas restrictivas por defecto
- Usar rate limiting para prevenir ataques
- Monitorear y loggear actividad sospechosa
- Automatizar configuración con scripts
- Mantener reglas actualizadas y documentadas
La inversión en aprender iptables a fondo se traduce en sistemas más seguros y administración más eficiente.
Andrés Nuñez - t4ifi