Iptables es una utilidad de firewall extremadamente flexible creada para sistemas operativos Linux. Ya sea que sea un geek novato de Linux o un administrador de sistemas, probablemente haya alguna forma en que iptables pueda ser un gran uso para usted. Siga leyendo mientras le mostramos cómo configurar el firewall de Linux más versátil.
Foto por ezioman.
¿De qué vamos a hablar?
Acerca de iptables
iptables es una utilidad de firewall de línea de comandos que utiliza cadenas de directivas para permitir o bloquear el tráfico. Cuando una conexión intenta establecerse en su sistema, iptables busca una regla en su lista para que coincida con ella. Si no encuentra uno, recurre a la acción predeterminada.
iptables casi siempre viene preinstalado en cualquier distribución de Linux. Para actualizarlo / instalarlo, simplemente recupere el paquete iptables:
sudo apt-get install iptables
Hay alternativas de GUI a iptables como Iniciador de fuego, pero iptables no es realmente tan difícil una vez que tiene algunos comandos abajo. Debe tener mucho cuidado al configurar las reglas de iptables, especialmente si está SSH’d en un servidor, porque un comando incorrecto puede bloquearlo permanentemente hasta que se arregle manualmente en la máquina física. Y no te olvides de bloquear el servidor SSH si abre el puerto.
Tipos de cadenas
iptables utiliza tres cadenas diferentes: entrada, avance y salida.
Entrada – Esta cadena se utiliza para controlar el comportamiento de las conexiones entrantes. Por ejemplo, si un usuario intenta SSH en su PC/servidor, iptables intentará hacer coincidir la dirección IP y el puerto con una regla de la cadena de entrada.
Adelante – Esta cadena se utiliza para las conexiones entrantes que en realidad no se entregan localmente. Piense en un enrutador: siempre se le envían datos, pero rara vez se destinan al enrutador en sí; los datos se reenvían a su objetivo. A menos que esté haciendo algún tipo de enrutamiento, NATing o algo más en su sistema que requiera reenvío, ni siquiera usará esta cadena.
Hay una forma segura de verificar si su sistema usa / necesita o no la cadena de avance.
iptables -L -v
La captura de pantalla anterior es de un servidor que se ha estado ejecutando durante unas semanas y no tiene restricciones en las conexiones entrantes o salientes. Como puede ver, la cadena de entrada ha procesado 11 GB de paquetes y la cadena de salida ha procesado 17 GB. La cadena de avance, por otro lado, no ha necesitado procesar un solo paquete. Esto se debe a que el servidor no está haciendo ningún tipo de reenvío o se utiliza como un dispositivo de paso a través.
Salida – Esta cadena se utiliza para las conexiones salientes. Por ejemplo, si intenta hacer ping a howtogeek.com, iptables comprobará su cadena de salida para ver cuáles son las reglas con respecto a ping y howtogeek.com antes de tomar la decisión de permitir o denegar el intento de conexión.
La advertencia
A pesar de que hacer ping a un host externo parece algo que solo necesitaría atravesar la cadena de salida, tenga en cuenta que para devolver los datos, también se utilizará la cadena de entrada. Al usar iptables para bloquear su sistema, recuerde que muchos protocolos requerirán comunicación bidireccional, por lo que tanto las cadenas de entrada como las de salida deberán configurarse correctamente. SSH es un protocolo común que las personas olvidan permitir en ambas cadenas.
Comportamiento predeterminado de la cadena de directivas
Antes de entrar y configurar reglas específicas, querrá decidir cuál desea que sea el comportamiento predeterminado de las tres cadenas. En otras palabras, ¿qué quieres que haga iptables si la conexión no coincide con ninguna regla existente?
Para ver para qué están configuradas actualmente las cadenas de directivas con el tráfico no coincidente, ejecute el iptables -L
mandar.
Como puede ver, también usamos el comando grep para darnos una salida más limpia. En esa captura de pantalla, nuestras cadenas están actualmente pensadas para aceptar tráfico.
La mayoría de las veces, querrá que su sistema acepte conexiones de forma predeterminada. A menos que haya cambiado las reglas de la cadena de directivas anteriormente, esta configuración ya debería estar configurada. De cualquier manera, aquí está el comando para aceptar conexiones de forma predeterminada:
iptables --policy INPUT ACCEPT
iptables --policy OUTPUT ACCEPT
iptables --policy FORWARD ACCEPT
De forma predeterminada, la regla de aceptación, puede usar iptables para denegar direcciones IP o números de puerto específicos, mientras continúa aceptando todas las demás conexiones. Llegaremos a esos comandos en un minuto.
Si prefiere denegar todas las conexiones y especificar manualmente cuáles desea permitir que se conecten, debe cambiar la política predeterminada de sus cadenas para que se elimine. Hacer esto probablemente solo sería útil para servidores que contienen información confidencial y solo tienen las mismas direcciones IP que se conectan a ellos.
iptables --policy INPUT DROP
iptables --policy OUTPUT DROP
iptables --policy FORWARD DROP
Respuestas específicas de la conexión
Con sus directivas de cadena predeterminadas configuradas, puede start agregando reglas a iptables para que sepa qué hacer cuando encuentre una conexión desde o hacia una dirección IP o puerto en particular. En esta guía, vamos a repasar las tres “respuestas” más básicas y de uso común.
Aceptar – Permitir la conexión.
Soltar – Abandona la conexión, actúa como si nunca hubiera sucedido. Esto es mejor si no desea que la fuente se dé cuenta de que su sistema existe.
Rechazar – No permita la conexión, pero envíe de vuelta un error. Esto es mejor si no desea que una fuente en particular se conecte a su sistema, pero desea que sepan que su firewall los bloqueó.
La mejor manera de mostrar la diferencia entre estas tres reglas es mostrar cómo se ve cuando una PC intenta hacer ping a una máquina Linux con iptables configurados para cada una de estas configuraciones.
Permitiendo la conexión:
Eliminación de la conexión:
Rechazo de la conexión:
Permitir o bloquear conexiones específicas
Con las cadenas de directivas configuradas, ahora puede configurar iptables para permitir o bloquear direcciones, intervalos de direcciones y puertos específicos. En estos ejemplos, estableceremos las conexiones en DROP
, pero puede cambiarlos a ACCEPT
o REJECT
, en función de sus necesidades y de cómo haya configurado las cadenas de directivas.
Nota: En estos ejemplos, vamos a usar iptables -A
para anexar reglas a la cadena existente. iptables comienza en la parte superior de su lista y revisa cada regla hasta que encuentra una que coincide. Si necesita insertar una regla encima de otra, puede usar iptables -I [chain] [number]
para especificar el número que debe estar en la lista.
Conexiones desde una única dirección IP
En este ejemplo se muestra cómo bloquear todas las conexiones desde la dirección IP 10.10.10.10.
iptables -A INPUT -s 10.10.10.10 -j DROP
Conexiones desde un rango de direcciones IP
En este ejemplo se muestra cómo bloquear todas las direcciones IP del intervalo de red 10.10.10.0/24. Puede utilizar una máscara de red o una notación de barra diagonal estándar para especificar el intervalo de direcciones IP.
iptables -A INPUT -s 10.10.10.0/24 -j DROP
o
iptables -A INPUT -s 10.10.10.0/255.255.255.0 -j DROP
Conexiones a un puerto específico
En este ejemplo se muestra cómo bloquear conexiones SSH desde 10.10.10.10.
iptables -A INPUT -p tcp --dport ssh -s 10.10.10.10 -j DROP
Puede reemplazar “ssh” con cualquier protocolo o número de puerto. El -p tcp
parte del código indica a iptables qué tipo de conexión utiliza el protocolo. Si estaba bloqueando un protocolo que usa UDP en lugar de TCP, entonces -p udp
sería necesario en su lugar.
En este ejemplo se muestra cómo bloquear conexiones SSH desde cualquier dirección IP.
iptables -A INPUT -p tcp --dport ssh -j DROP
Estados de conexión
Como mencionamos anteriormente, muchos protocolos requerirán una comunicación bidireccional. Por ejemplo, si desea permitir conexiones SSH a su sistema, las cadenas de entrada y salida necesitarán una regla agregada a ellas. Pero, ¿qué pasa si solo desea que se permita la entrada de SSH en su sistema? ¿Agregar una regla a la cadena de salida no permitirá también los intentos de SSH salientes?
Ahí es donde entran en juego los estados de conexión, que le brindan la capacidad que necesitaría para permitir la comunicación bidireccional, pero solo permitir que se establezcan conexiones unidirecciones. Eche un vistazo a este ejemplo, donde las conexiones SSH DESDE 10.10.10.10 están permitidas, pero las conexiones SSH A 10.10.10.10 no lo están. Sin embargo, el sistema puede enviar información a través de SSH siempre que la sesión ya se haya establecido, lo que hace posible la comunicación SSH entre estos dos hosts.
iptables -A INPUT -p tcp --dport ssh -s 10.10.10.10 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -d 10.10.10.10 -m state --state ESTABLISHED -j ACCEPT
Guardar cambios
Los cambios que realice en las reglas de iptables se desecharán la próxima vez que se reinicie el servicio iptables, a menos que ejecute un comando para guardar los cambios. Este comando puede diferir dependiendo de su distribución:
Ubuntu:
sudo /sbin/iptables-save
Red Hat / CentOS:
/sbin/service iptables save
O
/etc/init.d/iptables save
Otros comandos
Enumere las reglas iptables configuradas actualmente:
iptables -L
Añadiendo el -v
le dará información de paquetes y bytes, y agregará -n
enumerará todo numéricamente. En otras palabras, los nombres de host, los protocolos y las redes se enumeran como números.
Para borrar todas las reglas configuradas actualmente, puede emitir el comando flush.
iptables -F