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:
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 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”:
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:
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.
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 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 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
#---- 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