Las reglas de iptables que debes conocer.
En este articulo veremos las reglas de iptables más utilizadas, por tanto son las que debes conocer.
Si eres, o quieres ser un administrador de sistemas (sysadmin) harás uso de ellas continuamente.
Las vemos.
Las reglas de iptables que debes conocer
En todos los ejemplos propuestos usamos la interfaz de red «eth0«.
Puedes comprobar tu interfaz con el comando:
ifconfig
Las vemos:
Borrar todas las reglas:
iptables -F o iptables --flush
Modificar la política de las reglas predeterminada:
Por defecto las reglas de iptables aceptan la conexión, podemos modificar este comportamiento ejecutando lo siguiente (depende de tus necesidades).
iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT DROP
Bloquear una dirección ip específica:
Donde «BLOCK_THIS_IP» debes insertar la IP a bloquear.
iptables -A INPUT -i eth0 -s "$BLOCK_THIS_IP" -j DROP iptables -A INPUT -i eth0 -p tcp -s "$BLOCK_THIS_IP" -j DROP
Permitir todo el trafico entrante por SSH:
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
Permitir trafico entrante por SSH desde una red especifica, o una IP definida:
Modifica «192.168.100.X» por tu rango, o por una IP especifica.
iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
Permitir todo el trafico entrante HTTP y HTTPS:
HTTP por el puerto 80.
iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
HTTPS por el puerto 443.
iptables -A INPUT -i eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
Combinar reglas con «multiport«:
Permite combinar reglas incluso a varios puertos.
En el ejemplo aceptamos todo el tráfico entrante por SSH, HTTP y HTTPS.
iptables -A INPUT -i eth0 -p tcp -m multiport --dports 22,80,443 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp -m multiport --sports 22,80,443 -m state --state ESTABLISHED -j ACCEPT
Permitir la salida por SSH:
iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
Permitir salida de trafico por SSH desde una red especifica, o una IP definida:
Modifica «192.168.100.X» por tu rango, o por una IP especifica.
iptables -A OUTPUT -o eth0 -p tcp -d 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
Permitir la salida de trafico por HTTP y HTTPS:
HTTP por el puerto 80.
iptables -A OUTPUT -o eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
HTTP por el puerto 443.
iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
Equilibrar la carga del trafico web entrante:
Para está interesante función usaremos la extensión «iptables nth«.
En el ejemplo balancearemos el tráfico HTTPS sobre tres direcciones IP (tres servidores). Por cada 3º paquete, carga el siguiente servidor (con el contador 0). Los servidores tienen las siguientes ip:
192.168.1.117:443
192.168.1.118:443
192.168.1.119:443
iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j DNAT --to-destination 192.168.1.117:443 iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 1 -j DNAT --to-destination 192.168.1.118:443 iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 2 -j DNAT --to-destination 192.168.1.119:443
Permitir que nos hagan ping desde el exterior:
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
Hacer ping desde el servidor (al exterior):
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
Permitir el acceso «Loopback«:
iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT
Permitir que la red interna acceda a la externa:
Damos por supuesto que el servidor cuenta con dos tarjetas de red, en este caso «eth0» y «eth1«. En el ejemplo, eth1 conecta con la externa (internet), y eth0 a la red interna (por ejemplo: 192.168.100.x).
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
Permitir conexiones DNS salientes:
iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT iptables -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT
Permitir conexiones NIS (Network Information System):
Para conocer los puertos ypbind…
rpcinfo -p | grep ypbind
Ahora permitimos la conexión entrante al puerto 111 y los puertos que usa ypbind (en este caso 863 y 865).
iptables -A INPUT -p tcp --dport 111 -j ACCEPT iptables -A INPUT -p udp --dport 111 -j ACCEPT iptables -A INPUT -p tcp --dport 863 -j ACCEPT iptables -A INPUT -p udp --dport 863 -j ACCEPT iptables -A INPUT -p tcp --dport 865 -j ACCEPT iptables -A INPUT -p udp --dport 865 -j ACCEPT
Permitir el trafico de «Rsync» desde una red o ip especifica:
Donde «192.168.100/24», coloca tu red o ip.
iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 873 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 873 -m state --state ESTABLISHED -j ACCEPT
Permitir la conexión MySQL desde una red específica (exclusivamente):
iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT
Permitir el trafico de Sendmail o Postfix (puerto 25):
iptables -A INPUT -i eth0 -p tcp --dport 25 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT
Permitir el tráfico de IMAP / IMAPS:
IMAP
iptables -A INPUT -i eth0 -p tcp --dport 143 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 143 -m state --state ESTABLISHED -j ACCEPT
IMAPS
iptables -A INPUT -i eth0 -p tcp --dport 993 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 993 -m state --state ESTABLISHED -j ACCEPT
Permitir el trafico de POP3 / POP3S:
POP3
iptables -A INPUT -i eth0 -p tcp --dport 110 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 110 -m state --state ESTABLISHED -j ACCEPT
POP3S
iptables -A INPUT -i eth0 -p tcp --dport 995 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 995 -m state --state ESTABLISHED -j ACCEPT
Bloquear ataques Dos:
Explicación y ejemplo:
- -m limit: Usa la extensión limite de iptables.
- –limit 25/minute: Limita a un máximo de 25 conexiones por minuto. Modifica este valor según tus necesidades.
- –limit-burst 100: Este valor indica que el límite / minuto se aplicará solo después de que el número total de conexiones haya alcanzado el nivel límite de ráfaga.
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
En un anterior articulo tienes un desarrollo más extenso.
Port Forwarding (enrutar el trafico de un puerto a otro):
En el ejemplo enrutamos todo el tráfico que accede al puerto 450, al puerto 22 (ssh).
iptables -t nat -A PREROUTING -p tcp -d 192.168.100.117 --dport 450 -j DNAT --to 192.168.100.117:22
Recuerda que entonces también debes abrir el puerto 450.
iptables -A INPUT -i eth0 -p tcp --dport 450 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 450 -m state --state ESTABLISHED -j ACCEPT
Registrar los dropped packets:
Primero creamos la cadena LOGGING.
iptables -N LOGGING
Nos aseguramos que todas las conexiones entrantes restantes salten a la cadena LOGGING.
iptables -A INPUT -j LOGGING
Registramos los paquetes con un prefijo personalizado, esta practica es para identificarlos correctamente.
iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables Packet Dropped: " --log-level 7
Y por ultimo…
iptables -A LOGGING -j DROP
Aquí concluye este manual, si te gusto compártelo.