iptables, una herramienta de cortafuegos que permite no solamente filtrar paquetes, sino también realizar traducción de direcciones de red (NAT) para IPv4 o mantener registros de log.
iptables es el nombre de la herramienta de espacio de usuario mediante la cual el administrador puede definir políticas de filtrado del tráfico que circula por la red.
iptables es un software disponible en prácticamente todas las distribuciones de Linux actuales.
Cadenas
Las cadenas pueden ser para tráfico entrante (INPUT), tráfico saliente (OUTPUT) o tráfico reenviado (FORWARD).
Reglas de destino
Las reglas de destino pueden ser aceptar conexiones (ACCEPT), descartar conexiones (DROP),vrechazar conexiones (REJECT), encaminamiento posterior (POSTROUTING), encaminamiento previo (PREROUTING), SNAT, NAT, entre otras.
Políticas por defecto
Establecen cual es la acción a tomar por defecto ante cualquier tipo de conexión. La opción -P cambia una política para una cadena. En el siguiente ejemplo se descartan ( DROP) todas las conexiones que ingresen (INPUT), todas las conexiones que se reenvíen (FORWARD) y todas las conexiones que salgan (OUTPUT), es decir, se descarta todo el tráfico que entre desde una red pública y el que trate de salir desde la red local.
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
Limpieza de reglas
A fin de poder crear nuevas reglas, se deben borrar las existentes, para el tráfico entrante, tráfico reenviado y tráfico saliente así como el NAT.
iptables -F INPUT
iptables -F FORWARD
iptables -F OUTPUT
iptables -F -t nat
Las opciones más comunes son:
-A añade una cadena, la opción -i define una interfaz de tráfico entrante
-o define una interfaz para trafico saliente
-j establece una regla de destino del tráfico, que puede ser ACCEPT, DROP o REJECT.
-m define que se aplica la regla si hay una coincidencia específica
–state define una lista separada por comas de distinto tipos de estados de las conexiones (INVALID, ESTABLISHED, NEW, RELATED).
–to-source define que IP reportar al tráfico externo
-s define trafico de origen
-d define tráfico de destino
–source-port define el puerto desde el que se origina la conexión
–destination-port define el puerto hacia el que se dirige la conexión
-t tabla a utilizar, pueden ser nat, filter, mangle o raw.
Ejemplos de reglas
Reenvío de paquetes desde una interfaz de red local (eth1) hacia una interfaz de red pública (eth0):
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
Aceptar reenviar los paquetes que son parte de conexiones existentes (ESTABLISHED) o relacionadas de tráfico entrante desde la interfaz eth1 para tráfico saliente por la interfaz eth0:
iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT
Permitir paquetes en el propio muro cortafuegos para tráfico saliente a través de la interfaz eth0 que son parte de conexiones existentes o relacionadas:
iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
Permitir (ACCEPT) todo el tráfico entrante (INPUT) desde (-s) cualquier dirección (0/0) la red local (eth1) y desde el retorno del sistema (lo) hacia (-d) cualquier destino (0/0):
iptables -A INPUT -i eth1 -s 0/0 -d 0/0 -j ACCEPT
iptables -A INPUT -i lo -s 0/0 -d 0/0 -j ACCEPT
Hacer (-j) SNAT para el tráfico saliente (-o) a tráves de la interfaz eth0 proveniente desde (-s) la red local (192.168.0.0/24) utilizando (–to-source) la dirección IP w.x.y.z
iptables -A POSTROUTING -t nat -s 192.168.0.0/24 -o eth0 -j SNAT --to-source w.x.y.z
Descartar (DROP) todo el tráfico entrante (-i) desde la interfaz eth0 que trate de utilizar la dirección IP pública del servidor(w.x.y.z), alguna dirección IP de la red local (192.168.0.0/24) o la dirección IP del retorno del sistema (127.0.01)
iptables -A INPUT -i eth0 -s w.x.y.x/32 -j DROP
iptables -A INPUT -i eth0 -s 192.168.0.0/24 -j DROP
iptables -A INPUT -i eth0 -s 127.0.0.0/8 -j DROP
Aceptar (ACCEPT) todos los paquetes SYN (–syn) del protocolo TCP (-p tcp) para los puertos (–destination-port) de los protocolos SMTP (25), HTTP(80), SSH (22) y HTTPS (443):
iptables -A INPUT -p tcp -s 0/0 -d 0/0 --destination-port 25 --syn -j ACCEPT
iptables -A INPUT -p tcp -s 0/0 -d 0/0 --destination-port 80 --syn -j ACCEPT
iptables -A INPUT -p tcp -s 0/0 -d 0/0 --destination-port 22 --syn -j ACCEPT
iptables -A INPUT -p tcp -s 0/0 -d 0/0 --destination-port 443 --syn -j ACCEPT
Aceptar (ACCEPT) todos los paquetes SYN (–syn) del protocolo TCP (-p -tcp) para los puertos (–destination-port) del protocolos SMTP (25) en el servidor (w.x.y.z/32), desde (-s) cualquier lugar (0/0) hacia (-d) cualquier lugar (0/0).
iptables -A INPUT -p tcp -s 0/0 -d w.x.y.z/32 --destination-port 25 --syn -j ACCEPT
Aceptar (ACCEPT) todos los paquetes SYN (–syn) del protocolo TCP (-p tcp) para los puertos (–destination-port) de los protocolos POP3 (110), POP3S (995), IMAP (143) y IMAPS (993):
iptables -A INPUT -p tcp -s 0/0 -d 0/0 --destination-port 110 --syn -j ACCEPT
iptables -A INPUT -p tcp -s 0/0 -d 0/0 --destination-port 995 --syn -j ACCEPT
iptables -A INPUT -p tcp -s 0/0 -d 0/0 --destination-port 143 --syn -j ACCEPT
iptables -A INPUT -p tcp -s 0/0 -d 0/0 --destination-port 993 --syn -j ACCEPT
Aceptar (ACCEPT) el tráfico entrante (-i) proveniente desde la interfaz eth1 cuando las conexiones se establezcan desde el puerto (–sport) 67 por protocolos (-p) TCP y UDP.
iptables -A INPUT -i eth1 -p tcp --sport 68 --dport 67 -j ACCEPT
iptables -A INPUT -i eth1 -p udp --sport 68 --dport 67 -j ACCEPT
Aceptar (ACCEPT) conexiones de tráfico entrante (INPUT) por protocolo (-p) UDP cuando se establezcan desde (-s) el servidor DNS 200.33.145.217 desde el puerto (–source-port) 53 hacia (-d) cualquier destino (0/0):
iptables -A INPUT -p udp -s 200.33.146.217/32 --source-port 53 -d 0/0 -j ACCEPT
Cerrar accesos
Descartar (DROP) el tráfico entrante (INPUT) para el protocolo (-p) TCP hacia los puerto (–destination-port) de SSH (22) y Telnet (23):
iptables -A INPUT -p tcp --destination-port 22 -j DROP
iptables -A INPUT -p tcp --destination-port 23 -j DROP
Descartar (DROP) todo tipo de conexiones de tráfico entrante (INPUT) desde (-s) la dirección IP 190.32.123.98:
iptables -A INPUT -s 190.32.123.98 -j DROP
Rechazar (REJECT) conexiones hacia (OUTPUT) la dirección IP a.b.c.d desde la red local:
iptables -A OUTPUT -d a.b.c.d -s 192.168.0.0/24 -j REJECT
Eliminar reglas
En general se utiliza la misma regla, pero en lugar de utilizar -A (append), se utiliza -D (delete).
Eliminar la regla que descarta (DROP) todo tipo de conexiones de tráfico entrante (INPUT) desde (-s) la dirección IP a.b.c.d:
iptables -D INPUT -s a.b.c.d -j DROP
Mostrar la lista de cadenas y reglas
Una vez cargadas todas las cadenas y reglas de iptables es posible visualizar éstas utilizando el mandato iptables con las opciones -n, para ver las listas en formato numérico y -L, para solicitar la lista de éstas cadenas.
iptables -nL
Cuando no hay reglas ni cadenas cargadas, la salida debe devolver lo siguiente:
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Firewall con iptables
Para generar este script con iptables, se deben seguir los siguientes pasos:
Se crea un archivo de texto con un editor de texto plano cualquiera, como ser vi, emacs o nano, entre muchísimos otros. A este archivo se lo llama, por ejemplo, iptables_ipt
Se le da permiso de ejecución mediante el comando chmod u+x o también chmod 700 iptables_ipt.
Se ejecuta desde la línea de comandos ./iptables_ipt
Firewall para protejer el propio equipo
Veamos un ejemplo completamente funcional.
#!/bin/sh
## SCRIPT de IPTABLES – ejemplo del manual de iptables
## Ejemplo de script para proteger la propia máquina con DROP por defecto
## Pello Xabier Altadill Izura
## http://www.pello.info – pello@pello.info
## Con algunas modificaciones
## por albalband de Taringa
## Si queres descargar el script hacelo de aca:
## http://files.myopera.com/alband/files/iptables_ipt
echo -n Aplicando Reglas de Firewall…
## Definimos variables
RED_EXT=»eth0″ ## Interface conectada a internet
IP_EXTER=»192.168.1.103″ ## IP de interface eth0
## FLUSH de reglas
iptables -F
iptables -X
iptables -Z
iptables -t nat -F
## Establecemos politica por defecto: DROP
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
## Empezamos a filtrar? no! empezamos a abrir! porque ahora esta TODO denegado.
## Debemos decir de manera explicita qué es lo que queremos abrir
# Operar en localhost sin limitaciones
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# Permitimos que la maquina pueda salir a la web
iptables -A INPUT -p tcp -m tcp –sport 80 -m state –state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp –dport 80 -j ACCEPT
# Ya tambien a webs seguras
iptables -A INPUT -p tcp -m tcp –sport 443 -m state –state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp –dport 443 -j ACCEPT
# Reglas necesarias para FTP pasivo y activo. Se permiten conexiones entrantes YA establecidas
iptables -A INPUT -p tcp -m tcp –sport 20:21 -m state –state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp –dport 20:21 -j ACCEPT
iptables -A INPUT -p tcp -m tcp –sport 1024:65535 –dport 1024:65535 -m state –state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp –dport 1024:65535 -m state –state NEW,RELATED,ESTABLISHED -j ACCEPT
# Permitimos consultas DNS
iptables -A INPUT -p udp -m udp –sport 53 -m state –state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p udp -m udp –dport 53 -j ACCEPT
# Permitimos consultar servidores ntp para sincronizarse el reloj
/sbin/iptables -A INPUT -p udp -m udp –dport 123 -m state –state RELATED,ESTABLISHED -j ACCEPT
/sbin/iptables -A OUTPUT -p udp -m udp –sport 123 -j ACCEPT
# Barrera de backup por si cambiamos a modo ACCEPT temporalmente
# Con esto protegemos los puertos reservados y otros well-known
iptables -A INPUT -p tcp -m tcp –dport 1:1024 -j DROP
iptables -A INPUT -p udp -m udp –dport 1:1024 -j DROP
iptables -A INPUT -p tcp -m tcp –dport 1723 -j DROP
iptables -A INPUT -p tcp -m tcp –dport 3306 -j DROP
iptables -A INPUT -p tcp -m tcp –dport 5432 -j DROP
# Anti-spoofing (falseo de ip origen)
iptables -A INPUT -i $RED_EXT -s $IP_EXTER -j DROP
iptables -A INPUT -i $RED_EXT -s 10.0.0.0/24 -j DROP
iptables -A INPUT -i $RED_EXT -s 172.16.0.0/24 -j DROP
iptables -A INPUT -i $RED_EXT -s 192.168.0.0/24 -j DROP
iptables -A INPUT -i $RED_EXT -s 224.0.0.0/8 -j DROP
iptables -A INPUT -i $RED_EXT -d 127.0.0.0/8 -j DROP
iptables -A INPUT -i $RED_EXT -d 255.255.255.255 -j DROP
# Deshabilitar broadcast
/bin/echo «1» > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
# Deshabilitar el ping… quizá discutible.
/bin/echo «1» > /proc/sys/net/ipv4/icmp_echo_ignore_all
# Deshabilitar la redirección del ping
/bin/echo «0» > /proc/sys/net/ipv4/conf/all/accept_redirects
# Registrar los accesos extraños, paquetes falseados, etc..
/bin/echo «1» > /proc/sys/net/ipv4/conf/all/log_martians
# Anti-flooding o inundación de tramas SYN.»
iptables -N syn-flood
iptables -A INPUT -i $RED_EXT -p tcp –syn -j syn-flood
iptables -A syn-flood -m limit –limit 1/s –limit-burst 4 -j RETURN
iptables -A syn-flood -j DROP
# Guardar los accesos con paquetes fragmentados, recurso utilizado para tirar
# servidores y otras maldades (bug en Apache por ejemplo)
iptables -A INPUT -i $RED_EXT -f -j LOG –log-prefix «Fragmento! »
iptables -A INPUT -i $RED_EXT -f -j DROP
echo » OK . Verifique que lo que se aplica con: iptables -L -n»
# Fin del script
Ya esta, tenemos levantado un verdadero muro entre internet y nuestro equipo listando las reglas lo podemos verificar.
Agregar el servicio iptables al arranque del sistema.
Como se explico antes para hacer que el servicio de iptables esté activo con el siguiente inicio del sistema, en todos los niveles de ejecución (2, 3, 4 y 5), se hace lo siguiente:
Copiar el script con el siguiente comando:
cp iptables_ipt /etc/network/if-up/iptables_ipt
una vez modificados los datos con los correspondientes a su red ejecutamos el script
chmod 700 /etc/network/if-up/iptables_ipt
bash /etc/network/if-up/iptables_ipt
Eso es todo, espero que este pequeño tutorial les ayude a crear sus primeros scripts para iptables.
Fuente: http://www.taringa.net/posts/linux/15851762/Introduccion-amigable-a-iptables.html
Saludos!