Búsqueda de sitios web

Iptables para principiantes


Iptables se considera uno de los principales recursos defensivos para muchos administradores de sistemas a pesar de ser reemplazado por Nftables. Los principales fabricantes de redes incorporaron Iptables al hardware aún en entornos de producción.

Iptables es muy versátil y acepta comandos directos del usuario que puede cargar y descargar reglas según la necesidad.

Este tutorial muestra cómo proteger un servidor web, reenviar conexiones a direcciones IP internas desde nuestra LAN y ofrecer servicios específicos solo a direcciones IP incluidas en la lista blanca.

Nota: Este tutorial de Iptables se publicó por primera vez hace dos años y se actualizó el 23/05/2021 con ejemplos mejorados y capturas de pantalla de mejor calidad.

Cómo instalar

Las iptables se omiten por defecto en las distribuciones que incorporan Nftables.

Para instalar Iptables en distribuciones de Linux basadas en Debian, ejecute el siguiente comando:

sudo apt update && apt install iptables

Apertura de puertos HTTP y HTTPS

En primer lugar, agreguemos todas las políticas ACCEPT comenzando con el servidor web.

Nota: Si crea un script con reglas, no necesita usar sudo.

sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

Para ver las reglas agregadas, ejecute “iptables -L

Dónde :

Iptables = llama al programa

-A=agrega una regla

ENTRADA=tráfico entrante

-p=protocolo

–ddport=puerto de destino

-j = especificar el “objetivo”; el objetivo es el tipo de política: ACCEPT, DROP, REJECT (Incorporado)…

Iptables -L=enumera todas las reglas cargadas de iptables (Iptables -L -v=lo mismo con la verbosidad).

En el ejemplo anterior, le indicamos a Iptables que agregue una regla para que se acepte el tráfico entrante a través del protocolo TCP y los puertos 80 (http) y 443 (https).

Podemos cambiar el comando para aceptar la conexión solo desde una IP específica agregando el parámetro “-s”:

sudo iptables -A INPUT -s 127.0.0.1 -p tcp --dport 80 -j ACCEPT

Dónde :

s= fuente

También puede probar su firewall con nmap:

Nota: En el ejemplo anterior, el puerto 443 no se muestra porque el servidor no tiene un certificado SSL configurado adecuadamente.

Nota: Para obtener más información sobre Nmap, puede leer esto.

Protegiendo su servidor con Iptables:

#Open HTTP and HTTPS services.

iptables -A INPUT -p tcp --dport 80 -j ACCEPT

iptables -A INPUT -p tcp --dport 443 -j ACCEPT

#Open SSH Port Service

iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

Donde los nuevos parámetros son:

-m significa "coincidencia" y se utiliza para llamar a extensiones de Iptables como conntrack, que no forma parte de las funciones principales de iptables.

conntrack = Permite rastrear información sobre conexiones como direcciones específicas o, en este caso, el estado de la conexión. Esto debe usarse con cuidado ya que muchas reglas para defender servidores de algunos ataques usan conntrack mientras el hardware limita su uso, y dicha limitación puede usarse para sobrecargar los recursos del servidor.

-ctstate = determina el estado de la regla para que coincida; los estados posibles son: NUEVO, ESTABLECIDO, RELACIONADO y NO VÁLIDO.

#Protect your SSH Service against brute force attacks by allowing only a specific IP

to access iptables -A INPUT -p tcp -s X.X.X.X --dport 22 -m conntrack --ctstate NEW,

ESTABLISHED -j ACCEPT

#Protect your SSH Service against brute force attacks by limiting connection attempts
Iptables -A INPUT -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW -j 22-test

Iptables -A 22-test -m recent --name CONNECTIONS --set --mask 255.255.255.255 --rsource

Iptables -A 22-test -m recent --name CONNECTIONS --rcheck --mask 255.255.255.255

--rsource --seconds 30 --hitcount 3 -j 22-protection

Iptables -A 22-test -j ACCEPT

Iptables -A 22-protection -j DROP

Dónde :

En la primera línea, nuestra regla dice “-m conntrack –ctstate NEW”, lo que significa que si la conexión es nueva, pase a la regla “22-test”.

La segunda línea dice que los paquetes máscara de red 255.255.255.255 se denominan CONEXIONES.

La tercera línea dice que si una CONEXIÓN se repite 3 veces en 30 segundos, el cortafuegos continúa aplicando la protección 22 de la cadena. La cuarta línea dice que si las CONEXIONES no se vieron más de 3 veces en 30 segundos, podrían aceptarse.

La quinta línea, que pertenece a la cadena de protección 22, indica que se eliminen las CONEXIONES si parecen superarse 3 veces en 30 segundos.

Ahora, para terminar, rechacemos todas las conexiones entrantes no deseadas y permitamos todo el tráfico saliente:

iptables -P OUTPUT ACCEPT

iptables -P INPUT DROP

P se refiere a la política de cadena; recuerde que el objetivo es la política, ACEPTAR, ELIMINAR, RECHAZAR. En este caso, estamos diciendo que la política predeterminada para el tráfico saliente es aceptar y la política predeterminada para el tráfico entrante es rechazar, a menos que especifiquemos algo diferente en las reglas anteriores. Este es un firewall muy básico que no incluye reglas para muchos ataques, con fines de aprendizaje y no de producción; al final del artículo, adjunto un firewall que usé para la producción en un servidor; tiene comentarios que explican cada regla.

REENVIAR UNA CONEXIÓN A UN PUERTO ESPECÍFICO A UNA DIRECCIÓN IP ESPECÍFICA

Esto también es muy útil para usuarios de escritorio que desean enrutar una conexión a través de un dispositivo específico; puede ser útil incluso para los jugadores; por lo general, lo hacemos desde la configuración del enrutador, pero supongamos que el dispositivo de enrutamiento está ejecutando Iptables.

iptables -A PREROUTING -t nat -p tcp -d X.X.X.X --dport 8080 -j DNAT --to-destination Y.Y.Y.Y:80

iptables -A POSTROUTING -t nat -p tcp -j SNAT --to-source X.X.X.X

Las reglas anteriores invocan NAT (traducción de direcciones de red) para especificar conexiones a través del protocolo TCP a la dirección X.X.X.X, y el puerto 8080 se redirigirá a la dirección Y.Y.Y.Y, puerto 80. La segunda regla especifica que las respuestas deben enviarse a la dirección de origen (X.X.X.X). Podemos usar estas reglas para permitir el acceso a una cámara IP, habilitar juegos en línea con redes externas, etc.

Este tutorial estaba destinado a presentar Iptables a los principiantes y solo explica una cantidad limitada de conceptos básicos. A continuación puede ver una muestra de un cortafuegos bien planificado utilizado para un servidor de producción; incluye desde algunas de las reglas que ya vimos hasta reglas más complejas para prevenir DDoS, entre otros tipos de ataques.

Bonificación: muestra de firewall de producción

iptables -F

#---- Enable bad error message protection

enable /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses

#---- Turn on reverse path filtering. Safer, but breaks asymmetric routing and/or IPSEC

enable /proc/sys/net/ipv4/conf/*/rp_filter

#---- Don't accept source routed packets. Source routing is rarely used for legitimate

purposes disable /proc/sys/net/ipv4/conf/*/accept_source_route

#---- Disable ICMP redirect acceptance which can be used to alter your routing tables

disable /proc/sys/net/ipv4/conf/*/accept_redirects

#---- As we don't accept redirects, don't send Redirect messages either

disable /proc/sys/net/ipv4/conf/*/send_redirects

#---- Ignore packets with impossible addresses

disable /proc/sys/net/ipv4/conf/*/log_martians

#---- Protect against wrapping sequence numbers and aid round trip time measurement

enable /proc/sys/net/ipv4/tcp_timestamps

#---- Help against syn-flood DoS or DDoS attacks using particular choices of initial

TCP sequence numbers enable /proc/sys/net/ipv4/tcp_syncookies

#---- Use Selective ACK which can be used to signify that specific packets are missing

disable /proc/sys/net/ipv4/tcp_sack

modprobe nf_conntrack_ipv4

modprobe nf_nat

# modprobe nf_conntrack_ipv6

# modprobe nf_conntrack_amanda

# modprobe nf_nat_amanda

modprobe nf_conntrack_h323

modprobe nf_nat_h323

modprobe nf_conntrack_ftp

modprobe nf_nat_ftp

# modprobe nf_conntrack_netbios_ns

# modprobe nf_conntrack_irc

# modprobe nf_nat_irc

# modprobe nf_conntrack_proto_dccp

# modprobe nf_nat_proto_dccp

modprobe nf_conntrack_netlink

# modprobe nf_conntrack_pptp

# modprobe nf_nat_pptp

# modprobe nf_conntrack_proto_udplite

# modprobe nf_nat_proto_udplite

# modprobe nf_conntrack_proto_gre

# modprobe nf_nat_proto_gre

# modprobe nf_conntrack_proto_sctp

# modprobe nf_nat_proto_sctp

# modprobe nf_conntrack_sane

modprobe nf_conntrack_sip

modprobe nf_nat_sip

# modprobe nf_conntrack_tftp

# modprobe nf_nat_tftp

# modprobe nf_nat_snmp_basic

#Now we can start adding selected services to our firewall filter. The first such thing

is a localhost interface iptables -A INPUT -i lo -j ACCEPT

#We told the firewall to take all incoming packets with tcp flags NONE and just DROP them.
iptables -A INPUT -p tcp ! -m conntrack --ctstate NEW -j DROP

#We tell iptables to add (-A) a rule to the incoming (INPUT)- SSH works on port 50683

instead 22.

iptables -A INPUT -p tcp -m tcp --dport 50683 -j ACCEPT

iptables -A INPUT -p tcp -m tcp -s specific ip --dport 50683 -j ACCEPT

iptables -A INPUT -p tcp -m tcp -s specific ip --dport 50683 -j ACCEPT

iptables -A INPUT -p tcp -m tcp -s specific ip --dport 50683 -j ACCEPT

iptables -A INPUT -p tcp --dport 50683 -m conntrack --ctstate NEW -m recent --set

--name SSH -j ACCEPT

iptables -A INPUT -p tcp --dport 50683 -m recent --update --seconds 60 --hitcount 4

--rttl --name SSH -j LOG --log-prefix "SSH_brute_force "

iptables -A INPUT -p tcp --dport 50683 -m recent --update --seconds 60 --hitcount 4

--rttl --name SSH -j DROP

iptables -A INPUT -p tcp --dport 50683 -m conntrack --ctstate NEW -m recent --set

--name SSH

iptables -A INPUT -p tcp --dport 50683 -m conntrack --ctstate NEW -j SSH_WHITELIST

iptables -A INPUT -p tcp --dport 50683 -m conntrack --ctstate NEW -m recent --update

--seconds 60 --hitcount 4 --rttl --name SSH -j ULOG --ulog-prefix SSH_bru

iptables -A INPUT -p tcp --dport 50683 -m conntrack --ctstate NEW -m recent --update

--seconds 60 --hitcount 4 --rttl --name SSH -j DROP

#Now I allow imap,and smtp.
-A INPUT -p tcp --dport 25 -j ACCEPT

# Allows pop and pops connections

-A INPUT -p tcp --dport 110 -j ACCEPT

-A INPUT -p tcp --dport 995 -j ACCEPT

############ IMAP & IMAPS ############

-A INPUT -p tcp --dport 143 -j ACCEPT

-A INPUT -p tcp --dport 993 -j ACCEPT

########### MYSQL ###################

iptables -A INPUT -i eth0 -p tcp -m tcp --dport 3306 -j ACCEPT

########## R1soft CDP System ###############

iptables -A INPUT -p tcp -m tcp -s specific ip --dport 1167 -j ACCEPT

############### outgoing ###################

iptables -I INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

### Allow ongoing, block incoming not defined ###

iptables -P OUTPUT ACCEPT

iptables -P INPUT DROP

iptables -L -n

iptables-save | tee /etc/iptables.test.rules

iptables-restore < /etc/iptables.test.rules

#service iptables restart