Comandos LinuxExplicados en español
/
Ficha61 / 104
Categoría
Redes
Ejemplos
6
Ver también
ip · ss · ping · sudo

iptables

IP packet filtering (filtrado de paquetes IP)

Filtra el tráfico de red según reglas que tú escribes.

Es el programa que decide qué paquetes de red entran, salen, se rechazan o se reenvían, según una lista de reglas que tú escribes. Con él armas el cortafuegos (firewall) de la máquina: qué puertos se aceptan, cuáles se bloquean y qué tráfico pasa de una interfaz a otra. En Debian 13 y Ubuntu 24.04 sus reglas se guardan en nftables por debajo, aunque el comando siga siendo iptables. Ubuntu lo trae instalado; en Debian quizá tengas que instalarlo con sudo apt install iptables.

Sintaxissudo iptables [-t TABLA] [-A|-I|-D CADENA] [-p PROTO] [--dport PUERTO] [-j ACCION]
Precaución

Vaciar las reglas (sudo iptables -F) deja la máquina sin cortafuegos, y borrar la regla que acepta tu sesión de SSH te deja afuera y sin forma de volver a entrar por SSH. Antes de tocar reglas en un servidor, ten abierta una segunda sesión y guarda un respaldo con sudo iptables-save > reglas.bak. Y recuerda que las reglas viven solo en memoria: si no las guardas, un reinicio se las lleva.

§ 1

Despiece

6 ejemplos
Ver las reglas que hay ahora

Ver las reglas que hay ahora

5 piezas
Lámina01 / 06
Comandosudo iptables -L -n -v
Piezas5
Escala1:1
N.ºPiezaTipoQué hace
1sudoComandoEjecuta la orden como root, que es lo que pide iptables.
2iptablesComandoEl programa que administra las reglas de filtrado.
3-LOpciónLista las reglas de la tabla que se le indique.
4-nOpciónMuestra los puertos como números, sin resolver nombres. Es más rápido.
5-vOpciónAgrega las columnas de paquetes y bytes que han pasado o bloqueado.
Resultado

Ves la tabla filter con sus tres cadenas (INPUT, FORWARD, OUTPUT), qué acepta cada una y qué política tienen al final. La columna pkts te dice cuántas veces se ha aplicado cada regla: si una que acabas de agregar marca cero, el tráfico no está llegando por ahí.

Abrir el puerto 22 para SSH

10 piezas
Lámina02 / 06
Comandosudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
Piezas10
Escala1:1
N.ºPiezaTipoQué hace
1sudoComandoEjecuta la orden como root.
2iptablesComandoEl programa que administra las reglas de filtrado.
3-AOpciónAgrega la regla al final de la cadena.
4INPUTValorLa cadena de tráfico que entra a la máquina.
5-pOpciónFiltra por protocolo.
6tcpValorEl protocolo que usa SSH.
7--dportOpciónFiltra por el puerto de destino.
822ValorEl puerto donde escucha el servidor de SSH.
9-jOpciónIndica qué hacer con el paquete que coincida.
10ACCEPTValorAceptar el paquete y dejarlo pasar.
Resultado

Queda permitido el tráfico TCP que llega al puerto 22. Por defecto iptables no bloquea nada (la política de INPUT es ACCEPT), así que esta regla solo es necesaria cuando ya pusiste DROP como política o cuando agregaste reglas de bloqueo antes. Lo que protege de verdad el SSH sigue siendo la contraseña y las claves.

Bloquear un puerto

10 piezas
Lámina03 / 06
Comandosudo iptables -A INPUT -p tcp --dport 23 -j DROP
Piezas10
Escala1:1
N.ºPiezaTipoQué hace
1sudoComandoEjecuta la orden como root.
2iptablesComandoEl programa que administra las reglas de filtrado.
3-AOpciónAgrega la regla al final de la cadena.
4INPUTValorLa cadena de tráfico que entra a la máquina.
5-pOpciónFiltra por protocolo.
6tcpValorEl protocolo del puerto 23, que es telnet.
7--dportOpciónFiltra por el puerto de destino.
823ValorEl puerto de telnet, que casi siempre conviene cerrar.
9-jOpciónIndica qué hacer con el paquete que coincida.
10DROPValorDescartar el paquete en silencio, sin responder.
Resultado

Los paquetes al puerto 23 se pierden sin respuesta: quien intente conectar solo ve que la conexión se queda colgada. DROP esconde mejor que REJECT, porque REJECT responde de inmediato y le avisa al que escanea que hay algo escuchando ahí. DROP hace que tu máquina parezca apagada en ese puerto.

Borrar una regla por su número

5 piezas
Lámina04 / 06
Comandosudo iptables -D INPUT 3
Piezas5
Escala1:1
N.ºPiezaTipoQué hace
1sudoComandoEjecuta la orden como root.
2iptablesComandoEl programa que administra las reglas de filtrado.
3-DOpciónBorra una regla.
4INPUTValorLa cadena donde vive la regla.
53ValorEl número de la regla tal como aparece en el listado.
Resultado

Se elimina la tercera regla de la cadena INPUT y las de abajo se recorren un número. Los números los ves con sudo iptables -L -n --line-numbers. Si no pones número, iptables espera que le repitas la regla completa tal como la escribiste, incluyendo las opciones y el -j.

Guardar las reglas en un archivo

4 piezas
Lámina05 / 06
Comandosudo iptables-save > reglas.bak
Piezas4
Escala1:1
N.ºPiezaTipoQué hace
1sudoComandoEjecuta iptables-save como root para que pueda leer todas las reglas.
2iptables-saveComandoEl compañero de iptables que imprime todas las reglas en formato que se puede volver a cargar.
3>OperadorRedirección: manda la salida del comando al archivo en vez de a la pantalla.
4reglas.bakArgumentoEl archivo donde queda el respaldo.
Resultado

reglas.bak guarda todas las reglas en texto plano. Con ese archivo las recuperas con sudo iptables-restore < reglas.bak. Y para que sobrevivan a un reinicio, instala iptables-persistent (sudo apt install iptables-persistent), que copia el respaldo a /etc/iptables/rules.v4 y lo vuelve a cargar al arrancar.

Dar salida a internet a la red local

10 piezas
Lámina06 / 06
Comandosudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Piezas10
Escala1:1
N.ºPiezaTipoQué hace
1sudoComandoEjecuta la orden como root.
2iptablesComandoEl programa que administra las reglas de filtrado.
3-tOpciónElige otra tabla, en vez de la de filtrado.
4natValorLa tabla donde se hace la traducción de direcciones (NAT).
5-AOpciónAgrega la regla al final de la cadena.
6POSTROUTINGValorLa cadena de paquetes que van saliendo de la máquina.
7-oOpciónFiltra por la interfaz de salida.
8eth0ValorLa tarjeta de red conectada al internet. La ves con ip -br addr.
9-jOpciónIndica qué acción aplicar.
10MASQUERADEValorReescribe la dirección de origen por la de esa interfaz. Es el NAT que usan los routers.
Resultado

Todo lo que salga por eth0 sale con la IP de esa interfaz en vez de la del equipo que lo pidió. Es la forma más simple de darle salida a internet a una red privada, y es justo lo que hacen los routers y los contenedores. Sustituye eth0 por tu interfaz real y activa además el reenvío de paquetes con net.ipv4.ip_forward=1.

§ 2

Opciones

Las que sí vas a usar
OpciónQué hace
-A--appendAgrega la regla al final de la cadena. Es la más usada y la más segura, porque no cambia el orden de las que ya están.
-I--insertInserta la regla al principio de la cadena, o en la posición que le indiques: -I 3 la pone tercera. Importa porque las cadenas se evalúan en orden.
-D--deleteBorra una regla, por número (sudo iptables -D INPUT 3) o repitiendo la regla completa tal como la escribiste.
-L--listMuestra las reglas de una tabla o cadena. La -n (--numeric) evita resolver nombres y la -v agrega los contadores de paquetes y bytes.
-t--tableElige la tabla: filter (la de entrada y salida, la que se usa sin decir nada), nat, mangle, raw o security.
-p--protocolEl protocolo de la regla: tcp, udp o icmp. Es obligatorio para poder usar --dport.
--dport--destination-portEl puerto de destino, el que llega al servidor. Solo funciona con -p tcp o -p udp; para varios puertos usa -m multiport --dports 80,443.
-j--jumpLa acción: ACCEPT (dejar pasar), DROP (descartar), REJECT (rechazar avisando) o LOG (registrar). Si no pones -j, la regla solo cuenta paquetes.
§ 3

Fallas comunes

FallaRemedio
Correr iptables sin sudo.Sale un error de permisos (Permission denied (you must be root)). Las reglas las maneja el kernel, así que hace falta root: sudo iptables -L -n.
Usar --dport sin decir el protocolo.El puerto solo tiene sentido para tcp y udp, así que iptables rechaza la opción. Escribe -p tcp antes: sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT. Para varios puertos en una regla: -p tcp -m multiport --dports 80,443.
Vaciar las reglas con -F y perder el acceso por SSH.Si la máquina tenía DROP como política y tu sesión dependía de una regla que acabas de borrar, te quedas afuera sin poder entrar por SSH. En un servidor nunca uses -F a ciegas: ten una segunda sesión abierta y un respaldo de sudo iptables-save listo para restaurar.
Esperar que las reglas sobrevivan a un reinicio.iptables las carga en memoria, no en disco. Guarda con sudo iptables-save > /etc/iptables/rules.v4 e instala iptables-persistent (sudo apt install iptables-persistent) para que las vuelva a cargar al arrancar. En Ubuntu, la herramienta netfilter-persistent hace lo mismo con netfilter-persistent save.
§ 4

Preguntas frecuentes

¿Qué es iptables y para qué sirve?
Es el programa que filtra el tráfico de red del kernel según reglas que tú escribes. Con él abres o cierras puertos, rechazas conexiones y reenvías tráfico entre interfaces, que es lo que hace un cortafuegos. En Debian 13 y Ubuntu 24.04 sus reglas se guardan en nftables por debajo, así que también las puedes ver con sudo nft list ruleset.
¿Cuál es la diferencia entre DROP y REJECT en iptables?
DROP descarta el paquete sin responder nada, así que quien intenta conectar solo ve que la conexión se queda colgada. REJECT responde de inmediato con un mensaje de error, normalmente icmp-port-unreachable o tcp-reset, y por eso le confirma a quien escanea que hay algo escuchando. DROP esconde mejor el servicio; REJECT es más fácil de depurar.
¿Cómo abro un puerto en iptables?
Con una regla que acepte ese puerto en la cadena INPUT: sudo iptables -A INPUT -p tcp --dport 8080 -j ACCEPT. La A la agrega al final de la cadena y el -p tcp es obligatorio para poder usar --dport. Recuerda que por defecto iptables no bloquea nada, así que solo hace falta si ya pusiste DROP como política.
¿Por qué se pierden mis reglas de iptables al reiniciar?
Porque iptables las mantiene en memoria y no las guarda en disco. Para arreglarlo, guarda con sudo iptables-save > /etc/iptables/rules.v4 e instala el paquete iptables-persistent, que restaura ese archivo al arrancar. También existe netfilter-persistent, que usa los comandos netfilter-persistent save y netfilter-persistent restore.
¿Cuál es la diferencia entre iptables y nftables?
iptables es la interfaz que conocían todos, y en Debian 13 y Ubuntu 24.04 escribe sus reglas en nftables por debajo. nftables es la herramienta nueva: más rápida y con un lenguaje más potente, con tablas, sets y mapas que iptables no tiene. Casi todos los ejemplos que ves en Google son de iptables y todavía funcionan.
§ 5

Ver también