Iptable
iptables es una herramienta de línea de comandos en Linux que se utiliza para configurar reglas de filtrado de paquetes en el firewall del kernel. Permite a los administradores definir qué tráfico de red está permitido o bloqueado en un sistema.
En iptables, las tablas y cadenas son fundamentales para organizar y aplicar las reglas de firewall. Aquí te doy una breve explicación:
Tablas:
-
filter:
- La tabla por defecto para el filtrado de paquetes.
- Gestiona si un paquete es permitido o bloqueado.
- Es la tabla que se utiliza por defecto.
-
nat:
-
mangle:
-
raw:
Cadenas:
Las cadenas son secuencias de reglas dentro de una tabla. Cada tabla contiene una o más de estas cadenas:
-
INPUT:
- Procesa los paquetes entrantes dirigidos al sistema local.
-
OUTPUT:
- Gestiona los paquetes salientes generados por el sistema local.
-
FORWARD:
- Maneja los paquetes que pasan a través del sistema, pero no están dirigidos a él ni originados en él (útil en enrutadores).
-
PREROUTING:
- Modifica paquetes antes de que se tomen decisiones de enrutamiento.
-
POSTROUTING:
- Modifica los paquetes después de que se haya decidido la ruta.
PARÁMETRO -t -A -P
-t (Tablas):
- Función: El parámetro
-tse utiliza para especificar la tabla con la que deseas trabajar. - Ejemplo:
iptables -t nat -Lmuestra las reglas en la tablanat. - Importancia: Las reglas de
iptablesestán organizadas en diferentes tablas (comofilter,nat,mangle, etc.), y este parámetro te permite seleccionar la tabla sobre la que quieres actuar.
-A (Añadir reglas a Cadenas):
- Función: El parámetro
-Ase utiliza para añadir una nueva regla al final de una cadena específica dentro de una tabla. - Ejemplo:
iptables -A INPUT -p tcp --dport 22 -j ACCEPTañade una regla a la cadenaINPUTen la tabla por defecto (que esfilter) para aceptar el tráfico SSH. - Importancia: Las cadenas son las estructuras dentro de las tablas que contienen las reglas de firewall. Este parámetro se usa para agregar nuevas reglas a esas cadenas.
-P (Política por Defecto):
- Función: El parámetro
-Pse utiliza para establecer la política por defecto de una cadena específica en una tabla. Esto determina qué acción se tomará para los paquetes que no coincidan con ninguna de las reglas definidas en esa cadena. - Ejemplo:
iptables -P INPUT DROPestablece que todos los paquetes entrantes se descarten a menos que coincidan con una regla específica que los acepte. - Importancia: La política por defecto es crucial para la seguridad, ya que define el comportamiento de la cadena cuando no hay reglas específicas que coincidan con un paquete. Por ejemplo, tener
DROPcomo política predeterminada enINPUTayuda a asegurar que solo se permita el tráfico explícitamente autorizado.
Lo primero que podemos hacer es borrar todas las reglas del firewall para aquellos casos donde hayamos cometido errores o queramos empezar desde cero:

DENEGAR O ACEPTAR EL TRÁFICO
Podemos denegar todo el tráfico y luego ir añadiendo reglas que permitan el tráfico que queramos, o bien podemos permitir todo el tráfico y luego añadir reglas que rechacen el que queramos. Vamos a elegir alguna de estas dos políticas con el comando iptables -P, por ejemplo que empiece rechazando todo el tráfico:
Ahora podemos listar todas estas reglas del firewall con este comando:
Y si navegamos vemos que no tenemos internet porque el firewall lo está bloqueando:
Y ahora si queremos permitir el tráfico del firewall, ejecutamos estos otros comandos:
Y ya tendremos otra vez conexión a internet y podremos navegar:

SCRIPT PARA ELIMINAR TRÁFICO E IR PERMITIENDO UNO A UNO
Creamos un script que en principio se encarga de denegar todo el tráfico y luego en dicho script se van contemplando aquel tráfico que queramos permitir:
Si ejecutamos este script volvemos a no tener tráfico:
Sin embargo, podemos crear otro script que haga lo mismo pero que por defecto permita todo el tráfico:
Y volvemos a tener conectividad:
Ahora tenemos 2 scripts, uno para permitir el tráfico y otro para denegarlo:

IR AÑADIENDO REGLAS PARA PERMITIR CIERTO TRÁFICO (desde script restrictivo que limita todo el tráfico)
Tenemos activado el script que deniega todo el tráfico, y ahora podemos ir permitiendo regla a regla; por ejemplo vamos a permitir que haya tráfico ICMP tanto de salida como de entrada con estos comandos:

AÑADIENDO REGLAS AL SCRIPT
Ahora desde un script restrictivo, podemos ir permitiendo tráfico con las reglas, por ejemplo vamos añadir al script que nos permita el tráfico ICMP para hacer ping:
Lo que pasa con esto es que sólo hemos permitido el tráfico de ping, pero nos falta el tráfico DNS, ya que ahora mismo si hacemos un ping a google no podrá resolver:
Para permitir el tráfico DNS en iptables lo hacemos con este comando, donde además también habilitamos la interfaz loopback:
Y ahora si hacemos un ping vemos que ya lo realiza correctamente:

REGULAR TRÁFICO HTTP Y HTTPS NAVEGADOR WEB
Ahora en este punto no tenemos la capacidad de navegar por la web, ya que el firewall lo está bloqueando, por lo que tendremos que añadir nuevas reglas para regularlo, por ejemplo vamos a habilitar el tráfico por el puerto 80:
Y ahora si hacemos un curl a una web http vemos que funciona:
Pero el problema está en que tenemos que habilitar el tráfico https y este se mueve por el puerto 443; por lo que para ello deberemos habilitar el tráfico también por este puerto:
Y ahora ya si podremos hacer un curl a un https://google.es o acceder a él a través del navegador:

BLOQUEAR DIRECCIÓN IP EN FIREWALL IPTABLES
Para bloquear una dirección IP, tendremos que hacerlo así, y ahora si intentamos hacer un ping no vamos a poder:
Aunque también podemos limitar sólo el tráfico por ICMP de esta IP:

BLOQUEAR TRÁFICO DE UN PUERTO CON IPTABLES
Por ejemplo vamos a limitar todo el tráfico por el puerto 22, que es el ssh:
Y si intentamos acceder por ssh desde otro equipo no podremos:
Y podríamos habilitar el tráfico por ssh sólo a una determinada dirección IP; y para ello lo haríamos de esta forma:
Y si accedemos desde esta dirección IP, sí podremos, ya que será la única IP que podrá acceder: