IPTables es una utilidad de línea de comandos que es la interfaz estándar para administrar el firewall en Linux.
Claves para trabajar con cadenas:
-A: agregar una nueva regla.
-D: elimina la regla.
-F: elimina todas las reglas.
-R: reemplaza la regla.
-L: enumera todas las reglas.
INPUT – tráfico entrante.
OUTPUT – tráfico saliente.
FORWARD – tráfico reenviado (tránsito).
Opciones:
-p: protocolo, puede ser todo, icmp, tcp, udp.
-s: dirección IP de origen / host.
-d: dirección IP de destino / host.
-i: interfaz a la que llegó el paquete.
-o: la interfaz desde la que sale el paquete.
–sport: puerto de origen.
–port: puerto de destino.
Acciones:
ACCEPT: permitir paquetes.
REJECT: bloquea los paquetes con un mensaje de error.
DROP: bloques de paquetes (menos carga de CPU para solicitudes masivas, una opción de mayor prioridad que REJECT). Aqui el paquete sera descartado.
RETURN: deje de verificar la cadena actual y continúe con el padre.
MARK y CONNMARK: etiquetado de paquetes.
LOG: registro de paquetes en syslog.
Ejemplos de visualización de las reglas:
iptables -nvL
iptables -nvL | grep 192.168.0
iptables -n -L -v –line-numbers
iptables -L INPUT -n -v
iptables -L OUTPUT -n -v –line-numbers
iptables -L OUTPUT -n –line-numbers | less
iptables -L OUTPUT -n –line-numbers | grep 192.168.2.14
iptables -L INPUT –line-numbers
ip6tables -nvL
ip6tables -t filter -nvL
Ver NAT y reglas de manipulación:
iptables -L -t nat
iptables -L -t mangle
Ejemplos de eliminación de reglas:
iptables -D INPUT 3
iptables -D INPUT -s 192.168.2.14 -j DROP
Aquí hay un ejemplo de una regla NAT simple (donde 10.0.0.0/24 es una red de área local y 10.50.50.1 la salida hacia Internet):
iptables -t nat -I POSTROUTING -s 10.0.0.0/24 -j SNAT –to-source 10.50.50.1 –persistent
Un ejemplo de eliminación y adición de reglas NAT:
iptables -t nat -D POSTROUTING -s 172.16.2.0/16 -o eth1 -j SNAT –to-source 192.168.1.251-192.168.1.254 –persistent
iptables -t nat -A POSTROUTING -s 172.16.2.0/17 -o eth1 -j SNAT –to-source 192.168.1.218-192.168.1.222 –persistent
Si NAT está configurado y necesita reenviar el puerto a la IP local (donde 192.168.0.18 es la IP local y 10.50.50.2 busca eth0 en Internet):
iptables -t nat -A PREROUTING -d 10.50.50.2/32 -i eth0 -p tcp -m tcp –dport 81 -j DNAT –to-destination 192.168.0.18:81
Suponga que NAT para la red 192.168.0.0/24 se configura a través de 10.50.50.1, y 192.168.0.18 debe iniciarse a través de 10.50.50.2:
iptables -t nat -A POSTROUTING -s 192.168.0.18/32 -o eth0 -j SNAT –to-source 10.50.50.2
Reglas de reinicio completo (cuidado con esta regla):
iptables -F
Gestión De Servicios:
service iptables stop/start/restart/save
Ejemplo de permitir reglas para pop3, pop3s:
iptables -A INPUT -p tcp –dport 110 -j ACCEPT
iptables -A INPUT -p tcp –dport 995 -j ACCEPT
Ejemplo de imap, imaps:
iptables -A INPUT -p tcp –dport 143 -j ACCEPT
iptables -A INPUT -p tcp –dport 993 -j ACCEPT
Configurar las políticas INPUT y FORWARD predeterminadas para que se eliminen (cuidado con estas reglas):
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
Para permitir ping:
iptables -A INPUT -p icmp -j ACCEPT
iptables -A OUTPUT -p icmp -j ACCEPT
Ejemplos de bloqueo y desbloqueo de una dirección IP o red:
iptables -A INPUT -s xx.xx.xx.xx -j DROP
iptables -A INPUT -s xx.xx.xx.xx/24 -j DROP
iptables -A INPUT -s xx.xx.xx.xx/24 -j REJECT –reject-with icmp-port-unreachable
iptables -D INPUT -s xx.xx.xx.xx -j DROP
Al agregar una regla, es recomendable agregar un comentario, por ejemplo:
iptables -A INPUT -s xx.xx.xx.xx -m comment –comment “text” -j DROP
Limite el número de conexiones a 200 por puerto específico, por ejemplo, 443 y 80 (tenga en cuenta que el límite con un tráfico muy alto puede cargar mucho el procesador):
iptables -A INPUT -p tcp -m tcp –dport 443 -m connlimit –connlimit-above 200 –connlimit-mask 32 -j DROP
iptables -A INPUT -p tcp -m tcp –dport 443 –tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT
iptables -A INPUT -s 172.16.0.0/12 -p tcp –dport 80 -m connlimit –connlimit-above 200 -j DROP
iptables -A INPUT -s 172.16.0.0/12 -p tcp –dport 80 -j ACCEPT
Apertura del puerto 80 con límites de conexión:
iptables -A INPUT -p tcp –dport 80 -m limit –limit 50/second -j ACCEPT
Si necesita especificar varios puertos en la regla, debe agregar multipuerto, por ejemplo:
-m multiport –dports 80,8080
Un ejemplo de etiquetado de paquetes:
iptables -t mangle -A PREROUTING -s 192.168.5.0/24 -j MARK –set-mark 38
Opción para prohibir el escaneo de puertos (la IP se bloquea durante 300 segundos, de los cuales los paquetes provienen además de los puertos permitidos):
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -A INPUT -p all -i eth0 -j ACCEPT
iptables -A OUTPUT -p all -o eth0 -j ACCEPT
iptables -A INPUT -m recent –rcheck –seconds 300 –name STOPSCAN -j DROP
iptables -A INPUT -p tcp -m multiport ! –dports 80,443 -m recent –set –name STOPSCAN -j DROP
iptables -A INPUT -p tcp –syn –dport 80 -j ACCEPT
iptables -A INPUT -p tcp –syn –dport 443 -j ACCEPT
iptables -A INPUT -p all -m state –state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p all -m state –state NEW,ESTABLISHED,RELATED -j ACCEPT
Puede hacer una copia de seguridad de las reglas en un archivo y también restaurarlas con los comandos:
iptables-save > iptables.dump
iptables-restore < iptables.dump
ip6tables-save > ip6tables.dump
ip6tables-restore < ip6tables.dump
Puede buscar el texto de acuerdo con las reglas de la siguiente manera:
iptables-save|grep 172.16.2.0/24
Dado que puede haber vulnerabilidades a través de RPC, es mejor cerrar el puerto 111 (e incluso mejor abrir solo los puertos necesarios y hacer el INPUT DROP predeterminado):
rpcinfo -p localhost
/sbin/iptables -A INPUT -p tcp –dport 111 -j DROP
/sbin/iptables -A INPUT -p udp –dport 111 -j DROP