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
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|
+------+
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
iptables [-t tabla] -F
El argumento -F limpia todas las reglas de la tabla especificada (filter por defecto). Esta operación es irreversible.
iptables-save > archivo
iptables-restore < archivo
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
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
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"
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"
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"
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"
iptables -A INPUT -m mac --mac-source aa:bb:cc:dd:ee:ff -j DROP
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"
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..."
-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
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.