iptables · 10 min read · Feb 13, 2026
Iptables Básico - Debian/RedHat
Resumen
Puedes encontrar una versión más fácil de leer aquí: 5dollarwhitebox.org
Muchos se asustan con IPTables y lo encuentran difícil de entender. Sin embargo, una vez que lo comprendes, lo básico es fácil. Este documento servirá como una guía básica sobre el uso de iptables. No soy un gurú de iptables, pero lo he estado usando así durante bastante tiempo. Si he cometido algún error, no dudes en enviarme un correo electrónico.
El Sistema
Debian Sarge 3.1 Núcleo 2.6.12.4 de mirrors.kernel.org utilidad de administración de iptables versión 1.2.11-10
Preparación
Este How-To se realiza en una máquina Debian Sarge 3.1, aunque los comandos y la sintaxis deberían funcionar para cualquier distribución de linux. Antes de poder configurar iptables, primero debes asegurarte de que se haya compilado en el núcleo y que tengas las utilidades de usuario adecuadas instaladas.
Deberías tener un archivo de configuración de cuando se compiló el núcleo. Al buscar “CONFIG_IP_NF” debería producir ‘=y’ o ‘=m’ para la mayoría de las líneas/opciones. Aquí puedes ver que “CONFIG_IP_NF_IPTABLES” se compiló como un módulo del núcleo.
# cat /boot/config-2.4.30 | grep -i “CONFIG_IP_NF”
- CONFIG_IP_NF_CONNTRACK=m
CONFIG_IP_NF_FTP=m
CONFIG_IP_NF_AMANDA=m
CONFIG_IP_NF_TFTP=m
CONFIG_IP_NF_IRC=m
CONFIG_IP_NF_QUEUE=m
CONFIG_IP_NF_IPTABLES=m
CONFIG_IP_NF_MATCH_LIMIT=m
CONFIG_IP_NF_MATCH_MAC=m
CONFIG_IP_NF_MATCH_PKTTYPE=m
CONFIG_IP_NF_MATCH_MARK=m
CONFIG_IP_NF_MATCH_MULTIPORT=m
CONFIG_IP_NF_MATCH_TOS=m
CONFIG_IP_NF_MATCH_RECENT=m
CONFIG_IP_NF_MATCH_ECN=m
CONFIG_IP_NF_MATCH_DSCP=m
CONFIG_IP_NF_MATCH_AH_ESP=m
CONFIG_IP_NF_MATCH_LENGTH=m
CONFIG_IP_NF_MATCH_TTL=m
CONFIG_IP_NF_MATCH_TCPMSS=m
CONFIG_IP_NF_MATCH_HELPER=m
CONFIG_IP_NF_MATCH_STATE=m
CONFIG_IP_NF_MATCH_CONNTRACK=m
CONFIG_IP_NF_MATCH_UNCLEAN=m
CONFIG_IP_NF_MATCH_OWNER=m
CONFIG_IP_NF_FILTER=m
CONFIG_IP_NF_TARGET_REJECT=m
CONFIG_IP_NF_TARGET_MIRROR=m
CONFIG_IP_NF_NAT=m
CONFIG_IP_NF_NAT_NEEDED=y
CONFIG_IP_NF_TARGET_MASQUERADE=m
CONFIG_IP_NF_TARGET_REDIRECT=m
CONFIG_IP_NF_NAT_AMANDA=m
CONFIG_IP_NF_NAT_SNMP_BASIC=m
CONFIG_IP_NF_NAT_IRC=m
CONFIG_IP_NF_NAT_FTP=m
CONFIG_IP_NF_NAT_TFTP=m
CONFIG_IP_NF_MANGLE=m
CONFIG_IP_NF_TARGET_TOS=m
CONFIG_IP_NF_TARGET_ECN=m
CONFIG_IP_NF_TARGET_DSCP=m
CONFIG_IP_NF_TARGET_MARK=m
CONFIG_IP_NF_TARGET_LOG=m
CONFIG_IP_NF_TARGET_ULOG=m
CONFIG_IP_NF_TARGET_TCPMSS=m
CONFIG_IP_NF_ARPTABLES=m
CONFIG_IP_NF_ARPFILTER=m
CONFIG_IP_NF_ARP_MANGLE=m
CONFIG_IP_NF_COMPAT_IPCHAINS=m
CONFIG_IP_NF_NAT_NEEDED=y
CONFIG_IP_NF_COMPAT_IPFWADM=m
CONFIG_IP_NF_NAT_NEEDED=y*
Esto no es tan necesario, ya que descubrirás rápidamente si iptables funciona o no una vez que intentemos agregar algunas reglas.
Puedes verificar si tienes instalada la utilidad de administración de iptables ejecutando:
# dpkg -l iptables
- iptables 1.2.11-10 administración de iptables del núcleo de Linux 2.4+
…o para distribuciones basadas en rpm:
# rpm -qa | grep iptables
iptables-xxxxx
…o simplemente puedes ver si el binario está allí!
# which iptables
/sbin/iptables
Si la utilidad falta, puedes instalarla así:
APT
# apt-get update && apt-get install iptables
RPM
# rpm -Uvh iptables-xxxx.rpm
Preparando ################################# [100%]
Los Archivos Principales
Debian
/etc/init.d/iptables – Script INIT para iniciar|detener|reiniciar el servicio (y guardar conjuntos de reglas). Este archivo ya no es predeterminado a partir de Sarge, pero aún puedes obtenerlo (te lo mostraré).
/var/lib/iptables – El hogar de Debian para los archivos de contadores ‘activos’ e ‘inactivos’ de iptables-save (es decir, los conjuntos de reglas guardados). En RedHat encontrarías las reglas guardadas en ‘/etc/sysconfig/iptables’.
/var/lib/iptables/active – Contadores Activos (más sobre eso más tarde)
/var/lib/iptables/inactive – Contadores Inactivos
/sbin/iptables – La utilidad/binario de administración.
RedHat
/etc/init.d/iptables – Script INIT para iniciar|detener|reiniciar el servicio (y guardar conjuntos de reglas).
/etc/sysconfig/iptables – Archivo de RedHat para los archivos de contadores de iptables-save (es decir, los conjuntos de reglas guardados).
/sbin/iptables – La utilidad/binario de administración.
Un Poco Sobre IPTables
Para ver qué conjuntos de reglas tenemos actualmente en su lugar, ejecuta:
# iptables –list
*Cadena INPUT (política ACEPTAR)
target prot opt source destination
Cadena FORWARD (política ACEPTAR)
target prot opt source destination
Cadena OUTPUT (política ACEPTAR)
target prot opt source destination*
Esto es lo que verás cuando no hay conjuntos de reglas en su lugar. Al mirar esto, vemos 3 ‘Cadenas’.
INPUT - Contiene reglas para el tráfico dirigido a este servidor.
FORWARD – Contiene reglas para el tráfico que se reenviará a una IP detrás de este servidor (es decir, si esta máquina actúa como un firewall para otros servidores).
OUTPUT – Contiene reglas para el tráfico que proviene de este servidor hacia Internet.
Principalmente estaremos tratando con el tráfico dirigido a este servidor, y emitiremos reglas para la Cadena INPUT. Cuando el tráfico pasa a través del núcleo, determina un “TARGET” basado en si el paquete coincide con una regla o no. Los objetivos generales son:
ACCEPT – El tráfico es aceptado para su entrega.
REJECT – El tráfico es rechazado, enviando un paquete de vuelta al host que envió.
DROP - El tráfico es descartado. No se envía nada de vuelta al host que envió.
Configurando Conjuntos de Reglas
Entonces, vamos al grano. Es importante notar que el orden en que se agregan las reglas es muy importante. Por ejemplo, si tu primera regla es negar todo… entonces, no importa lo que permitas específicamente, será denegado.
También es importante notar que nada de lo que hagas se guarda en el disco hasta que ejecutes ‘iptables-save’ (o uses el script init para guardar). Todos los contadores/conjuntos de reglas están en memoria. Una vez que el servidor se reinicia, o ejecutas ‘iptables –flush’, todo en lo que has trabajado se pierde. Personalmente, trabajo desde un archivo de script bash llamado ‘iptables-rules.sh’, que me permite mantener todo organizado y comentado. Si cometo un error, no tengo preocupaciones si solo quiero eliminar todas las reglas, simplemente vuelvo a mi script bash y empiezo a editar de nuevo, lo guardo y ejecuto el script (esto sin embargo no se ejecutará al inicio… eso se cubrirá en la siguiente sección).
Es muy importante que si estás trabajando en este servidor de forma remota a través de ssh, que hagas todo lo posible para no quedarte fuera. Por lo tanto, nuestra primera regla será asegurarnos de que, pase lo que pase, aún pueda acceder a ssh desde mi dirección IP.
# iptables -A INPUT -s 192.168.1.10 -d 10.1.15.1 -p tcp –dport 22 -j ACCEPT
Desglosemos eso:
-A => Indica a iptables que ‘agregue’ esta regla a la Cadena INPUT
-s => Dirección de origen. Esta regla solo se refiere al tráfico que proviene de esta IP. Sustitúyela con la dirección IP desde la que te estás conectando por SSH.
-d => Dirección de destino. Esta regla solo se refiere al tráfico que va a esta IP. Sustitúyela con la IP de este servidor.
-p => Protocolo. Especificando tráfico que es TCP.
–dport => Puerto de destino. Especificando tráfico que es para el Puerto TCP 22 (SSH)
-j => Salto. Si todo en esta regla coincide, entonces ‘salta’ a ACEPTAR
A continuación, queremos usar algunas reglas estándar para el tráfico de red general. Esto va un poco más allá de lo básico, sin embargo, iptables puede determinar el ‘estado’ en el que se encuentra un paquete. Esto tiene que ver con la comunicación TCP estándar. Por ejemplo, el apretón de manos de 3 vías entre dos hosts al transmitir datos.
NEW => Server1 se conecta a Server2 emitiendo un paquete SYN (Sincronizar).
RELATED => Server 2 recibe el paquete SYN y luego responde con un paquete SYN-ACK (Reconocimiento de Sincronización).
ESTABLISHED => Server 1 recibe el paquete SYN-ACK y luego responde con el paquete ACK final (Reconocimiento).
Después de que este apretón de manos de 3 vías se complete, el tráfico ahora está ESTABLECIDO. Para este tipo de comunicación TCP, son necesarias algo similares a estas tres reglas:
# iptables -A INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT
La última regla, obviamente, permite cualquier tráfico que salga del servidor.
Ahora que tenemos nuestros básicos establecidos, veamos qué lista de reglas tiene iptables:
# iptables –list
*Cadena INPUT (política ACEPTAR)
target prot opt source destination
ACCEPT tcp – 192.168.1.10 10.1.15.1 tcp dpt:ssh
ACCEPT all – anywhere anywhere state RELATED,ESTABLISHED
Cadena FORWARD (política ACEPTAR)
target prot opt source destination
ACCEPT all – anywhere anywhere state RELATED,ESTABLISHED
Cadena OUTPUT (política ACEPTAR)
target prot opt source destination
ACCEPT all – anywhere anywhere state NEW,RELATED,ESTABLISHED*
Desde aquí puedes agregar cualquier regla que desees. Si estás ejecutando un servidor web básico, probablemente necesitarás algo similar a:
RECHAZOS INDIVIDUALES PRIMERO:
MALOS (Bloquear Dirección IP de Origen):
# iptables -A INPUT -s 172.34.5.8 -j DROP
NO SPAMMERS (nota el uso de FQDN):
# iptables -A INPUT -s mail.spammer.org -d 10.1.15.1 -p tcp –dport 25 -j REJECT
ENTONCES ABRELO: ———————————————————————–
MYSQL (Permitir Acceso Remoto a una IP Particular):
SSH:
# iptables -A INPUT -d 10.1.15.1 -p tcp –dport 22 -j ACCEPT
Enviar correo/Postfix:
# iptables -A INPUT -d 10.1.15.1 -p tcp –dport 25 -j ACCEPT
FTP: (Nota cómo puedes especificar un rango de puertos 20-21)
# iptables -A INPUT -d 10.1.15.1 -p tcp –dport 20:21 -j ACCEPT
Puertos FTP Pasivos Tal Vez: (Nuevamente, especificando puertos 50000 a 50050 en una regla)
# iptables -A INPUT -d 10.1.15.1 -p tcp –dport 50000:50050 -j ACCEPT
HTTP/Apache
# iptables -A INPUT -d 10.1.15.1 -p tcp –dport 80 -j ACCEPT
SSL/Apache
# iptables -A INPUT -d 10.1.15.1 -p tcp –dport 443 -j ACCEPT
IMAP
# iptables -A INPUT -d 10.1.15.1 -p tcp –dport 143 -j ACCEPT
IMAPS
# iptables -A INPUT -d 10.1.15.1 -p tcp –dport 993 -j ACCEPT
POP3
# iptables -A INPUT -d 10.1.15.1 -p tcp –dport 110 -j ACCEPT
POP3S
# iptables -A INPUT -d 10.1.15.1 -p tcp –dport 995 -j ACCEPT
Cualquier Tráfico Desde localhost:
# iptables -A INPUT -d 10.1.15.1 -s 127.0.0.1 -j ACCEPT
ICMP/Ping:
# iptables -A INPUT -d 10.1.15.1 -p icmp -j ACCEPT
RECHAZOS GLOBALES ÚLTIMOS:
Rechazar todo lo demás a esa IP:
# iptables -A INPUT -d 10.1.15.1 -j REJECT
O, rechazar todo lo demás que venga a cualquier IP:
# iptables -A INPUT -j REJECT
¡Nota que hacemos las líneas de RECHAZO global al final! Estas deben ser las últimas.
Guardando Conjuntos de Reglas
Con los scripts init, guardar conjuntos de reglas es bastante fácil. Una vez que estés satisfecho con tu configuración, simplemente haz una de las siguientes:
La Forma Debian
El antiguo script init ya no está en Sarge por defecto, pero aún está disponible para uso legado. Creo que la nueva forma es usar ‘/etc/network/if-up.d’ y ‘/etc/network/if-down.d’ para scripts de iptables (pero no me gusta eso).
Puedes obtener el script INIT legado de esta manera:
# gunzip /usr/share/doc/iptables/examples/oldinitdscript.gz -c > /etc/init.d/iptables
Ahora que tienes el script en su lugar, puedes hacer lo necesario.
Reglas Activas
Las reglas activas son aquellas cargadas al iniciar iptables:
# /etc/init.d/iptables save active
Guardando conjunto de reglas iptables: guardar “activo” con contadores.
Esto guarda tus reglas en /var/lib/iptables/active
Reglas Inactivas
También puedes configurar un segundo conjunto de reglas para cuando detienes iptables llamado ‘inactivo’. Iptables en realidad no “detiene”, simplemente elimina los conjuntos de reglas que están en su lugar y luego carga las reglas ‘inactivas’.
# /etc/init.d/iptables stop
Cargando conjunto de reglas iptables: cargar “inactivo”
Por lo tanto, puedes establecer tus reglas ‘inactivas’, y luego guardarlas con:
# /etc/init.d/iptables save inactive
Guardando conjunto de reglas iptables: guardar “inactivo” con contadores.
La Forma RedHat
El script INIT de RedHat es muy similar. Puedes usarlo para iniciar y detener iptables, así como guardar conjuntos de reglas.
Para guardar tus reglas activas, ejecuta lo siguiente:
# /etc/init.d/iptables save
Esto guardará tus reglas en ‘/etc/sysconfig/iptables’.
Cuando inicias iptables, las reglas se leen desde ‘/etc/sysconfig/iptables’:
# /etc/init.d/iptables start
Iniciando iptables [OK]
Y cuando detienes iptables, todas las reglas se eliminan:
# /etc/init.d/iptables stop
Deteniendo iptables [OK]
Guardar y Restaurar Manualmente
También puedes usar manualmente las utilidades iptables-save e iptables-restore así:
Guardar las reglas en un archivo
# iptables-save > /root/iptables-save.out
Restaurar las reglas
# iptables-restore -c /root/iptables-save.out
El -c le dice a iptables-restore que este archivo fue creado usando iptables-save, que genera las reglas como “contadores”.
Conclusión
Y ahí lo tienes, iptables en su forma más básica. Los usos de iptables son demasiado numerosos como para siquiera comenzar a hacer un howto sobre ellos. Sin embargo, para la seguridad básica y la comprensión de IPTables, espero que esto te haya ayudado. Si hay algo que podría agregar, no dudes en enviarme un correo electrónico.
—
BJ Dierkes, RHCE4-LPIC1
wdierkes [at] 5dollarwhitebox [dot] org
Texas, EE. UU.
Recursos
- Netfilter/Iptables: http://www.netfilter.org/
- Protocolo de Control de Transmisión: http://www.rhyshaden.com/tcp.htm
Recibe nuevas publicaciones en tu bandeja de entrada.
No spam. Cancela la suscripción en cualquier momento.