IPTABLES VS FIREWALLD
Hoy analizaremos iptables y firewalld y aprenderemos sobre la historia de estos dos junto con la instalación y cómo podemos configurarlos para nuestras distribuciones de Linux.
Empecemos sin perder más tiempo.
Primero, necesitamos saber qué es iptables. La mayoría de los profesionales de TI de alto nivel lo conocen y también solían trabajar con él. Iptables es una aplicación/programa que permite a un usuario configurar las tablas de seguridad o de seguridad del firewall proporcionadas por el firewall del kernel de Linux y las cadenas para que un usuario pueda agregarle o eliminar reglas de firewall en consecuencia para cumplir con sus requisitos de seguridad. Iptables utiliza diferentes módulos del kernel y diferentes protocolos para que el usuario pueda aprovecharlo al máximo. Como por ejemplo, iptables se usa para IPv4 (versión IP 4/32 bits) e ip6tables para IPv6 (versión IP 6/64 bits) tanto para tcp como para udp. Normalmente, las reglas de iptables las configura el administrador del sistema, el analista del sistema o el administrador de TI. Debe tener privilegios de root para ejecutar cada regla de iptables. El kernel de Linux utiliza el marco Netfilter para poder proporcionar diversas operaciones relacionadas con la red que se pueden realizar mediante iptables. Anteriormente, ipchains se utilizaba en la mayoría de las distribuciones de Linux con el mismo propósito. Todas las reglas de iptables son manejadas directamente por el propio kernel de Linux y se conoce como tarea del kernel. Independientemente de las herramientas GUI u otras herramientas de seguridad que esté utilizando para configurar la seguridad del firewall de su servidor, al final del día, se convierten en reglas de iptables y se suministran al kernel para realizar la operación.
El auge de las iptables comienza con netfilter. Paul Rusty Russell fue el autor inicial y el grupo de expertos principal detrás de netfilter/iptables. Más tarde se le unieron muchas otras personas de tecnología y luego formó y construyó el equipo central de Netfilter y desarrolló y mantuvo el proyecto netfilter/iptables como un esfuerzo conjunto como muchos otros proyectos de código abierto. Harald Welte fue el exlíder hasta 2007 y luego Patrick McHardy fue el jefe hasta 2013. Actualmente, el jefe del equipo central de Netfilter es Pablo Neira Ayuso.
Para saber más sobre netfilter, visite este enlace. Para saber más sobre la historia de netfilter, visite este enlace.
Para saber más sobre la historia de iptables, visite este enlace.
Hoy en día, cada kernel de Linux viene con iptables y se puede encontrar precompilado o preinstalado en todas las distribuciones de Linux modernas y famosas. En la mayoría de los sistemas Linux, iptables se instala en este directorio /usr/sbin/iptables. También se puede encontrar en /sbin/iptables, pero dado que iptables se parece más a un servicio que a un "binario esencial", la ubicación preferida permanece en el directorio /usr/sbin.
Para Ubuntu o Debian
sudo apt-get install iptables
Para CentOS
sudo yum install iptables-services
Para RHEL
sudo yum install iptables
Para conocer su versión de iptables, escriba el siguiente comando en su terminal.
sudo iptables --version
Para OpenSUSE 42.1, escriba lo siguiente para detenerlo.
sudo /sbin/rcSuSEfirewall2 stop
Para empezar de nuevo
sudo /sbin/rcSuSEfirewall2 start
Para Ubuntu, escribe lo siguiente para detenerlo.
sudo service ufw stop
Para empezar de nuevo
sudo service ufw start
Para Debian y RHEL, escriba lo siguiente para detenerlo.
sudo /etc/init.d/iptables stop
Para empezar de nuevo
sudo /etc/init.d/iptables start
Para CentOS, escriba lo siguiente para detenerlo.
sudo service iptables stop
Para empezar de nuevo
sudo service iptables start
Para conocer todas las reglas que están actualmente presentes y activas en sus iprables, simplemente abra una terminal y escriba lo siguiente.
sudo iptables -L
Si no hay salidas de reglas en iptables significa que si no hay reglas agregadas hasta el momento en su firewall de iptables, verá algo como la imagen a continuación.
En esta imagen de arriba, puede ver que hay tres (3) cadenas y son ENTRADA, ADELANTE, SALIDA y no existen reglas. En realidad aún no he agregado ninguno.
Escribe lo siguiente para conocer el estado de las cadenas de tu firewall de iptables.
sudo iptables -S
Con el comando anterior, puede saber si sus cadenas aceptan o no.
Borrar todas las reglas de iptables
Para borrar todas las reglas de su firewall de iptables, escriba lo siguiente. Esto normalmente se conoce como vaciar las reglas de iptables.
sudo iptables -F
Si desea vaciar solo la cadena INPUT o cualquier cadena individual, emita los siguientes comandos según sus requisitos.
sudo iptables -F INPUT
sudo iptables -F OUTPUT
sudo iptables -F FORWARD
ACEPTAR o SOLTAR Cadenas
Para aceptar o descartar una cadena en particular, emita cualquiera de los siguientes comandos en su terminal para cumplir con sus requisitos.
iptables --policy INPUT DROP
La regla anterior no aceptará nada entrante a ese servidor. Para revertirlo nuevamente a ACEPTAR, haga lo siguiente
iptables --policy INPUT ACCEPT
Lo mismo ocurre con otras cadenas como
iptables --policy OUTPUT DROP
iptables --policy FORWARD DROP
Nota: De forma predeterminada, todas las cadenas de iptables (ENTRADA, SALIDA, ADELANTE) están en modo ACEPTAR. Esto se conoce como comportamiento predeterminado de la cadena de políticas.
Permitir cualquier puerto
Si está ejecutando algún servidor web en su host, debe permitir su firewall iptables para que su servidor escuche o responda al puerto 80. De forma predeterminada, el servidor web se ejecuta en el puerto 80. Hagámoslo entonces.
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
En la línea anterior, A significa agregar, lo que significa que estamos agregando una nueva regla a la lista de iptables. INPUT significa cadena INPUT. P significa protocolo y dport significa puerto de destino. De forma predeterminada, cualquier servidor web se ejecuta en el puerto 80. De manera similar, también puede permitir el puerto SSH.
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
De forma predeterminada, SSH se ejecuta en el puerto 22. Pero es una buena práctica no ejecutar SSH en el puerto 22. Ejecute siempre SSH en un puerto diferente. Para ejecutar SSH en un puerto diferente, abra el archivo /etc/ssh/sshd_config en su editor favorito y cambie el puerto 22 a otro puerto.
Digamos que queremos bloquear el puerto 135. Podemos hacerlo mediante
sudo iptables -A INPUT -p tcp --dport 135 -j DROP
Si desea bloquear su servidor para iniciar cualquier conexión SSH desde el servidor a otro host/servidor, emita el siguiente comando
sudo iptables -A OUTPUT -p tcp --dport 22 -j DROP
Al hacerlo, nadie podrá utilizar su servidor para iniciar una conexión SSH desde el servidor. La cadena OUPUT filtrará y ELIMINARA cualquier conexión tcp saliente hacia otros hosts.
Permitir IP específica con puerto
sudo iptables -A INPUT -p tcp -s 0/0 --dport 22 -j ACCEPT
Aquí -s 0/0 representa cualquier fuente entrante con cualquier dirección IP. Por lo tanto, no hay forma de que su servidor responda a un paquete tcp cuyo puerto de destino es 22. Si desea permitir solo una IP en particular, utilice la siguiente.
sudo iptables -A INPUT -p tcp -s 12.12.12.12/32 --dport 22 -j ACCEPT
En el ejemplo anterior, solo permite que la dirección IP 12.12.12.12 se conecte al puerto SSH. Las direcciones IP restantes no podrán conectarse al puerto 22. De manera similar, puede permitirlo utilizando valores CIDR. Como
sudo iptables -A INPUT -p tcp -s 12.12.12.0/24 --dport 22 -j ACCEPT
El ejemplo anterior muestra cómo puede permitir que un bloque de IP completo acepte la conexión en el puerto 22. Aceptará IP desde 12.12.12.1 hasta 12.12.12.255.
Si desea bloquear dicho rango de direcciones IP, haga lo contrario reemplazando ACEPTAR por DROP como se muestra a continuación
sudo iptables -A INPUT -p tcp -s 12.12.12.0/24 --dport 22 -j DROP
Por lo tanto, no permitirá obtener una conexión en el puerto 22 desde las direcciones IP 12.12.12.1 a 12.12.12.255.
Bloqueo de ICMP
Si desea bloquear la solicitud ICMP (ping) hacia y desde su servidor, puede intentar lo siguiente. El primero se bloqueará para no enviar la solicitud de eco de ping ICMP a otro host.
sudo iptables -A OUTPUT -p icmp --icmp-type 8 -j DROP
Ahora, intenta hacer ping a google.com. Su servidor OpenSUSE no podrá hacer ping a google.com.
Si desea bloquear la solicitud de eco ICMP (ping) entrante para su servidor, simplemente escriba lo siguiente en su terminal.
sudo iptables -I INPUT -p icmp --icmp-type 8 -j DROP
Ahora, no responderá a ninguna solicitud de eco de ping ICMP. Digamos que la dirección IP de su servidor es 13.13.13.13. Y si hace ping a esa IP de su servidor, verá que su servidor no responde a esa solicitud de ping.
Bloqueo del puerto MySql/MariaDB
Como Mysql contiene su base de datos, debe protegerla de conexiones externas. Permita que las direcciones IP de su servidor de aplicaciones de confianza solo se conecten con su servidor MySQL. Para bloquear otros
sudo iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
Por lo tanto, no necesitará ninguna conexión MySql excepto el bloque de IP 192.168.1.0/24. De forma predeterminada, MySql se ejecuta en el puerto 3306.
Bloqueo de SMTP
Si no está ejecutando ningún servidor de correo en su servidor host o si su servidor no está configurado para actuar como un servidor de correo, debe bloquear SMTP para que su servidor no envíe spam ni correo a ningún dominio. Debe hacer esto para bloquear cualquier correo saliente de su servidor. Para hacerlo,
sudo iptables -A OUTPUT -p tcp --dport 25 -j DROP
Bloquear ataques DDoS
Todos estamos familiarizados con el término DDoS. Para deshacerse de él, emita el siguiente comando en su terminal.
iptables -A INPUT -p tcp --dport 80 -m limit --limit 20/minute --limit-burst 100 -j ACCEPT
Debe configurar el valor numérico para cumplir con sus requisitos. Este es sólo un estándar a mantener.
Puedes proteger más
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 1 > /proc/sys/net/ipv4/conf/lo/rp_filter
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
echo 1800 > /proc/sys/net/ipv4/tcp_keepalive_time
echo 1 > /proc/sys/net/ipv4/tcp_window_scaling
echo 0 > /proc/sys/net/ipv4/tcp_sack
echo 1280 > /proc/sys/net/ipv4/tcp_max_syn_backlog
Bloqueo de escaneo de puertos
Hay cientos de personas que escanean los puertos abiertos de su servidor e intentan romper la seguridad de su servidor. para bloquearlo
sudo iptables -N block-scan
sudo iptables -A block-scan -p tcp —tcp-flags SYN,ACK,FIN,RST RST -m limit —limit 1/s -j RETURN
sudo iptables -A block-scan -j DROP
Aquí, block-scan es el nombre de una nueva cadena.
Bloquear puertos defectuosos
Es posible que también deba bloquear algunos puertos defectuosos para su servidor. Así es como puedes hacer esto.
badport="135,136,137,138,139,445"
sudo iptables -A INPUT -p tcp -m multiport --dport $badport -j DROP
sudo iptables -A INPUT -p udp -m multiport --dport $badport -j DROP
Puede agregar más puertos según sus necesidades.
Firewalld proporciona un firewall administrado dinámicamente con soporte para zonas de red/firewall que define el nivel de confianza de las conexiones o interfaces de red. Tiene soporte para IPv4, configuraciones de firewall IPv6, puentes Ethernet y conjuntos de IP. Hay una separación entre las opciones de configuración permanente y de tiempo de ejecución. También proporciona una interfaz para que servicios o aplicaciones agreguen reglas de firewall directamente.
El modelo de firewall anterior con system-config-firewall/lokkit era estático y cada cambio requería un reinicio completo del firewall. Esto incluyó también descargar los módulos del kernel netfilter del firewall y cargar los módulos necesarios para la nueva configuración. La descarga de los módulos rompía el firewall con estado y las conexiones establecidas. Por otro lado, el demonio del cortafuegos gestiona el cortafuegos de forma dinámica y aplica los cambios sin reiniciar todo el cortafuegos. Por lo tanto, no es necesario recargar todos los módulos del kernel del firewall. Pero el uso de un demonio de firewall requiere que todas las modificaciones del firewall se realicen con ese demonio para garantizar que el estado del demonio y el firewall en el kernel estén sincronizados. El demonio de firewall no puede analizar las reglas de firewall agregadas por las herramientas de línea de comandos iptables y ebtables. El demonio proporciona información sobre la configuración actual del firewall activo a través de D-BUS y también acepta cambios a través de D-BUS utilizando métodos de autenticación PolicyKit.
Por lo tanto, firewalld utiliza zonas y servicios en lugar de cadenas y reglas para realizar las operaciones y puede administrar reglas dinámicamente, permitiendo actualizaciones y modificaciones sin interrumpir las sesiones y conexiones existentes.
Tiene las siguientes características.
- API D-Bus.
- Reglas de firewall cronometradas.
- Lenguaje enriquecido para reglas de firewall específicas.
- Soporte NAT IPv4 e IPv6.
- Zonas de cortafuegos.
- Soporte de conjunto de IP.
- Registro simple de paquetes denegados.
- Interfaz directa.
- Lockdown: Lista blanca de aplicaciones que pueden modificar el firewall.
- Soporte para iptables, ip6tables, ebtables y backends de firewall ipset.
- Carga automática de módulos del kernel de Linux.
- Integración con Puppet.
Para saber más sobre firewalld, visite este enlace.
Antes de instalar firewalld, asegúrese de detener iptables y también de que iptables ya no se use ni funcione. Para hacerlo,
sudo systemctl stop iptables
Esto detendrá los iptables de su sistema.
Y luego asegúrese de que su sistema ya no utilice iptables emitiendo el siguiente comando en la terminal.
sudo systemctl mask iptables
Ahora, verifica el estado de iptables.
sudo systemctl status iptables
Ahora estamos listos para instalar firewalld en nuestro sistema.
Para Ubuntu
Para instalarlo en Ubuntu, primero debe eliminar UFW y luego instalar Firewalld. Para eliminar UFW, ejecute el siguiente comando en la terminal.
sudo apt-get remove ufw
Después de eliminar UFW, ejecute el siguiente comando en la terminal
sudo apt-get install firewall-applet
O
Puede abrir el Centro de software de Ubuntu y buscar "firewall-applet" y luego instalarlo en su sistema Ubuntu.
Para RHEL, CentOS y Fedora
Escriba el siguiente comando para instalar firewalld en su sistema CentOS.
sudo yum install firewalld firewall-config -y
Antes de configurar firewalld, debemos conocer el estado de firewalld después de la instalación. Para saber eso, escriba lo siguiente.
sudo systemctl status firewalld
Como firewalld funciona por zonas, debemos verificar todas las zonas y servicios, aunque todavía no hemos realizado ninguna configuración.
Para zonas
sudo firewall-cmd --get-active-zones
o
sudo firewall-cmd --get-zones
Para conocer la zona predeterminada, emita el siguiente comando
sudo firewall-cmd --get-default-zone
Y para servicios
sudo firewall-cmd --get-services
Aquí puede ver los servicios cubiertos por firewalld.
Una nota importante es que, después de cada modificación, debe recargar firewalld para que se puedan realizar los cambios.
Para configurar la zona predeterminada
sudo firewall-cmd --set-default-zone=internal
o
sudo firewall-cmd --set-default-zone=public
Después de cambiar la zona, verifique si cambia o no.
sudo firewall-cmd --get-default-zone
sudo firewall-cmd --permanent --zone=public --add-port=80/tcp
Esto agregará el puerto tcp 80 en la zona pública de firewalld. También puede agregar el puerto que desee reemplazando 80 por el suyo.
Ahora recarga el firewall.
sudo firewall-cmd --reload
Ahora, verifique el estado para ver si se agregó el puerto tcp 80 o no.
sudo firewall-cmd --zone=public --list-ports
Aquí puede ver que se ha agregado el puerto TCP 80.
O incluso puedes probar algo como esto.
sudo firewall-cmd --zone=public --list-all
Para eliminar el puerto Tcp 80 de la zona pública, escriba lo siguiente.
sudo firewall-cmd --zone=public --remove-port=80/tcp
Verá un texto de "éxito" resonando en su terminal.
También puedes poner el puerto que desees reemplazando 80 por tu propio puerto.
Para agregar el servicio ftp en firewalld, ejecute el siguiente comando
sudo firewall-cmd --zone=public --add-service=ftp
Verá un texto de "éxito" resonando en su terminal.
De manera similar, para agregar el servicio smtp, ejecute el siguiente comando
sudo firewall-cmd --zone=public --add-service=smtp
Reemplace ftp y smtp por el servicio propio que desee agregar en el firewall.
Para eliminar los servicios ftp y smtp de firewalld, ejecute el siguiente comando en la terminal.
sudo firewall-cmd --zone=public --remove-service=ftp
sudo firewall-cmd --zone=public --remove-service=smtp
Si lo desea, puede bloquear cualquier paquete/conexión entrante o saliente mediante firewalld. Esto se conoce como "entrada de pánico" de firewalld. Para hacerlo, emita el siguiente comando.
sudo firewall-cmd --panic-on
Verá un texto de "éxito" resonando en su terminal.
Después de hacer esto, no podrá hacer ping a un host ni navegar por ningún sitio web.
Para desactivar esto, ejecute el siguiente comando en su terminal.
sudo firewall-cmd --panic-off
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.4" accept'
Al hacerlo, firewalld aceptará paquetes IP v4 de la IP de origen 192.168.1.4.
Del mismo modo, para bloquear cualquier dirección IP
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.4" reject'
Al hacerlo, firewalld eliminará/descartará todos los paquetes IP v4 de la IP de origen 192.168.1.4.
Me quedé con lo básico de Firewalld aquí para que puedas entender fácilmente su metodología de trabajo y las diferencias con iptables.
Eso es todo por hoy. Espero que disfrutes leyendo este artículo.
Cuidarse.