Skip to content

Instantly share code, notes, and snippets.

@Xpktro
Last active August 29, 2015 13:57
Show Gist options
  • Save Xpktro/9362028 to your computer and use it in GitHub Desktop.
Save Xpktro/9362028 to your computer and use it in GitHub Desktop.
Iptables spanish quickstart

Tutorial Iptables

Iptables es un comando que permite controlar el tráfico entrante, saliente y circulante del equipo, a través de una serie de reglas agrupadas en algo llamado tablas.

Para utilizar iptables se necesita estar en una consola de root, para iniciar sesión como root:

sudo su -

Iptables funciona gracias a un serivicio (un programa que está siempre ejecutándose en el fondo del sistema), para iniciarlo se puede ejecutar:

service iptables start
(start, restart y stop son opciones validas)

Las reglas de iptables se tienen que introducir individualmente usando el comando 'iptables', por lo que se hace tedioso escribir y probar reglas, para arreglar ese problema y por un motivo de orden y practicidad, las reglas se escriben en un script de bash, ahí se pueden ejecutar y editar todas las que se necesiten. El resto del tutorial asume lo siguiente:

- Estás escribiendo tus reglas en un script de bash
- En el script deben de limpiarse todas las reglas antes de añadir nuevas, de otra forma habrán problemas
- El script también se corre como root

Marco teórico

Iptables filtra todo el tráfico a nivel de paquetes (capa de red en el modelo OSI). La organización lógica de iptables se da de la siguiente forma:

- Tablas: Agrupan las cadenas (ver abajo) de una función específica del firewall. Existen 3 tablas:
    - filter: filtrado de los paquetes, es la tabla por defecto y con la que más trabajaremos
    - nat: funciones de enrutamiento de paquetes a nivel de NAT, casi no se toca
    - mangle: esta tabla es avanzada ya que se puede hacer con ella lo mismo que con las dos anteriores a la vez

- Cadenas: Cada tabla tiene un conjunto de cadenas, que en realidad son los 'eventos' para cada tabla que contienen las reglas definidas. Las cadenas pueden ser:
    - INPUT: las reglas que afectan al tráfico entrante (desde la máquina local)
    - FORWARD: las reglas que afectan a los paquetes que pasan por el firewall
    - OUTPUT: las reglas que afectan al tráfico saliente (desde la máquina local)
    - PREROUTING: las reglas que afectan a los paquetes antes de ser direccionados (sólo nat y mangle)
    - POSTROUTING: las reglas que afectan a los paquetes luego de ser direccionados (sólo nat y mangle)

NOTA: Los nombres de las tablas y cadenas van en minúsculas y mayúsculas respectivamente porque es así como se escriben en los comandos de iptables.

En el siguiente grafico se puede observar el flujo de los paquetes a través de iptables con las cadenas y tablas por las que pasan.

                                        +-------+
                                        |FORWARD|
                                        |-------|
                    +------------------>|mangle +---------------------+
                    |                   |filter |                     |
                    |                   +-------+                     v
               +----+-----+                                     +-----------+
               |PREROUTING|                                     |POSTROUTING|
+-------+      |----------|                                     |-----------|       +------+
|Entrada+----->|mangle    |                                     |mangle     +------>|Salida|
+-------+      |nat       |                                     |nat        |       +------+
(Red o         +----+-----+             +----------+            +-----+-----+      (Red o
 Interfaz)          |             +---->|Aplicacion+-----+            ^             Interfaz)
                    |             |     +----------+     |            |
                    |             |                      v            |
                    |          +--+---+              +------+         |
                    |          |INPUT |              |OUTPUT|         |
                    |          |------|              |------|         |
                    +--------->|mangle| (Maq. Local) |mangle+---------+
                               |filter|              |nat   |
                               +------+              |filter|
                                                     +------+

Comandos básicos

Para ver las reglas actuales:

iptables [-t tabla] -L --line-numbers

El argumento -L es para listar y --line-numbers para mostrar los números asociados a cada regla, se verá la utilidad de esto más adelante.

NOTA: Las partes encerradas en corchetes [] son opcionales, en este caso -t sirve para especificar la tabla de la que se quieren ver las reglas, si fuera necesario ver una tabla que no sea filter

Para limpiar tablas:

iptables [-t tabla] -F

El argumento -F limpia todas las reglas de la tabla especificada (filter por defecto). Esta operación es irreversible.

Para guardar un backup de las tablas:

iptables-save > archivo

Para reestablecer el backup:

iptables-restore < archivo

Sintaxis básica de las reglas

Una regla de iptables se escribe de la siguiente manera:

iptables [-t tabla] -A|R CADENA [numlinea] [-p tcp|udp] [opciones...] -j ACCEPT|DROP

Donde:
    -> -t tabla donde tabla es el nombre de la tabla que recibirá la regla (filter por defecto, pero puede ser nat y mangle)
    -> -A ó -R (el símbolo | significa "uno de estos") es la acción a realizar con la regla, siendo A la de "agregar" y R la de "reemplazar"
    -> CADENA es el nombre de la cadena que recibirá la regla (INPUT, OUTPUT, FORWARD, ...)
    -> numlinea es el número de línea de la regla a reemplazar (sólo sirve cuando se especificó -R)
    -> -p es el protocolo que afecta a la regla que puede ser tcp o udp, si no se pone se asumen ambos
    -> opciones... una lista indeterminada de opciones adicionales, se verán más abajo
    -> -j ACCEPT o DROP son las acciones a tomar cuando se cumpla la regla, siendo ACCEPT la de dejar pasar el paquete o DROP para rechazarlo

Políticas

Al igual que en otros sistemas de firewall, cuando una paquete específico no calza en ninguna regla conocida, se aplica una política por defecto. Las reglas por defecto por cada cadena de pueden ver en la lista de reglas, pero para modificar una política se puede ejecutar

iptables -P CADENA ACCION

Donde CADENA es el nombre de la cadena afectada y ACCION es la acción de la política por defecto, por ejemplo para impedir todo el tráfico de INPUT Y OUTPUT se puede ejecutar:

iptables -P INPUT DROP
iptables -P OUTPUT DROP

Recetas para las reglas (ejemplos)

Impedir el tráfico TCP entrante en un puerto:

iptables -A INPUT -p tcp --dport 1000 -j DROP

Quiere decir: "Se añade una regla en la cadena INPUT para el protocolo tcp en el puerto 1000 para que se rechacen los paquetes"

Impedir el tráfico UDP entrante en un rango de puertos:

iptables -A INPUT -p udp --dport 1:1024 -j DROP

Quiere decir: "Se añade una regla en la cadena INPUT para el protocolo udp en los puertos del 1 al 1024 para rechazar los paquetes"

Impedir el tráfico en más de un puerto a la vez

iptables -A INPUT -m multiport -p tcp --dport 21,23,32... -j DROP

Donde --dport es una lista de puertos separados por comas y sin espacios

NOTA: el argumento -m quiere decir "match", es una argumento especial para definir reglas específicas, en este caso, filtrar los paquetes por una lista de puertos

Permitir a la maquina local recibir trafico de afuera solo si uno lo genera (comunicacion de 3 vias)

iptables -A INPUT -m state --state ESTABLIHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state NEW,ESTABLISHED -j ACCEPT

NOTA: el argumento -m quiere decir "match", es una argumento especial para definir reglas específicas, en este caso, filtrar los paquetes por su flag de estado

Quiere decir: "Se añaden las reglas: para el tráfico de entrada, aceptar sólo los paquetes de tipo ESTABLISHED y RELATED, para el tráfico de salida, aceptar sólo los paquetes de tipo NEW y ESTABLISHED"

Impedir todo trafico entrante excepto el de una direcicon:

iptables -A INPUT ! -s 192.168.1.10 -j DROP

NOTA el símbolo ! genera una 'excepción' a la regla general (en este caso DROP) Quiere decir: "Se añade la regla a la cadena INPUT exceptuando a la ip 192.168.1.1 para rechazar los paquetes"

Impedir el tráfico de un MAC en especial:

iptables -A INPUT -m mac --mac-source aa:bb:cc:dd:ee:ff -j DROP

Impedir el trafico de entrada en una tarjeta

iptables -A INPUT -i eth0 -j DROP

Donde -i especifica la interfaz de donde proviene el tráfico. Quiere decir: "Se agrega una regla a la cadena INPUT para rechazar todo paquete proveniente de eht0"

Para cambiar una linea ya existente:

iptables -R CADENA linea .....

Donde el argumento R indica el reemplazo de una regla y linea es el número de línea que obtuvimos del listado de reglas, el resto del comando puede seguir como es habitual en la inserción de nuevas reglas Quiere decir: "Se reemplaza la cadena CADENA en la línea linea con..."

Resumen de opciones:

-i interface entrada
-o interface salida
-s origen (ip o red)
-d destino (ip o red)
-m match
-p protocolo
-j decision
-A añadir
-P politica por defecto
-R reemplazar

Masquerading

El masquerading se refiere a la habilidad de usar el firewall para ser el medio entre una red externa y una interna. Se puede habilitar agregando una entrada a la tabla nat por cada interfaz que se desee proteger con el firewall (en este ejemplo, eth0 está conectado a internet)

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward

El segundo comando cambia una variable en el sistema para que sea capaz de realizar la redirección de paquetes.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment