La guía para principiantes de iptables, el firewall de Linux
Iptables es una utilidad de firewall extremadamente flexible creada para sistemas operativos Linux. Ya sea que sea un experto en Linux o un administrador de sistemas, probablemente haya alguna forma en que iptables pueda serle de gran utilidad. Sigue leyendo mientras te mostramos cómo configurar el firewall de Linux más versátil..
Foto por ezioman.
Acerca de iptables
iptables es una utilidad de firewall de línea de comandos que utiliza cadenas de políticas 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. 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 de iptables:
sudo apt-get install iptables
Existen alternativas GUI para iptables como Firestarter, pero iptables no es realmente tan difícil una vez que tienes algunos comandos hacia abajo. Desea ser extremadamente cuidadoso al configurar las reglas de iptables, especialmente si está SSH en un servidor, porque un comando incorrecto puede bloquearlo permanentemente hasta que se arregle manualmente en la máquina física.
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 en la cadena de entrada.
Adelante - Esta cadena se utiliza para las conexiones entrantes que en realidad no se entregan localmente. Piense en un enrutador: los datos siempre se le envían, pero rara vez se destinan al enrutador; los datos simplemente se reenvían a su destino. A menos que esté realizando algún tipo de enrutamiento, NAT u otra cosa en su sistema que requiera reenvío, ni siquiera utilizará esta cadena..
Hay una manera segura de verificar si su sistema usa o necesita la cadena de avance.
iptables -L -v
La captura de pantalla de arriba es de un servidor que se ha estado ejecutando durante algunas semanas y no tiene restricciones en las conexiones entrantes o salientes. Como puede ver, la cadena de entrada ha procesado 11GB de paquetes y la cadena de salida ha procesado 17GB. La cadena de avance, por otro lado, no ha necesitado procesar un solo paquete. Esto se debe a que el servidor no realiza ningún tipo de reenvío ni se utiliza como dispositivo de paso..
Salida - Esta cadena se utiliza para conexiones salientes. Por ejemplo, si intenta hacer ping a howtogeek.com, iptables verificará 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, la cadena de entrada también se usará. Cuando utilice iptables para bloquear su sistema, recuerde que muchos protocolos requerirán una comunicación bidireccional, por lo que tanto la cadena de entrada como la 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 políticas
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é desea que haga iptables si la conexión no coincide con ninguna regla existente??
Para ver para qué están configuradas actualmente sus cadenas de políticas con el tráfico sin igual, ejecute el iptables -L
mando.
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 diseñadas para aceptar tráfico..
La mayoría de las veces, deseará que su sistema acepte conexiones de forma predeterminada. A menos que haya cambiado las reglas de la cadena de políticas anteriormente, esta configuración ya debería estar configurada. De cualquier manera, aquí está el comando para aceptar conexiones por defecto:
iptables --política ENTRADA DE ENTRADA
iptables - política de salida de entrada
iptables --policy FORWARD ACCEPT
De forma predeterminada a la regla de aceptación, puede usar iptables para denegar direcciones IP específicas o números de puerto, 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 eliminarlas. Hacer esto probablemente solo sería útil para servidores que contienen información confidencial y solo tienen las mismas direcciones IP conectadas a ellos.
iptables --policy ENTRADA DE GOTA
iptables - politica SALIDA SALIDA
iptables --policy FORWARD DROP
Respuestas específicas de conexión
Con sus políticas de cadena predeterminadas configuradas, puede comenzar a agregar reglas a iptables para que sepa qué hacer cuando encuentra una conexión desde o hacia una dirección IP o puerto en particular. En esta guía, repasaremos 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 un error. Esto es lo mejor si no desea que una fuente en particular se conecte a su sistema, pero quiere 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 configuradas para cada una de estas configuraciones..
Permitiendo la conexión:
Abandonando la conexión:
Rechazando la conexión:
Permitir o bloquear conexiones específicas
Con las cadenas de políticas configuradas, ahora puede configurar iptables para permitir o bloquear direcciones específicas, rangos de direcciones y puertos. En estos ejemplos, estableceremos las conexiones a SOLTAR
, pero puedes cambiarlos a ACEPTAR
o RECHAZAR
, Dependiendo de sus necesidades y cómo configuró sus cadenas de pólizas.
Nota: En estos ejemplos, vamos a utilizar iptables -A
para añadir reglas a la cadena existente. iptables comienza en la parte superior de su lista y sigue cada regla hasta que encuentra una que coincida. Si necesita insertar una regla sobre otra, puede usar iptables -I [cadena] [número]
Para especificar el número debe estar en la lista..
Conexiones desde una sola dirección IP
Este ejemplo muestra cómo bloquear todas las conexiones desde la dirección IP 10.10.10.10.
iptables -A ENTRADA -s 10.10.10.10 -j GOTAR
Conexiones desde un rango de direcciones IP
Este ejemplo muestra cómo bloquear todas las direcciones IP en el rango de red 10.10.10.0/24. Puede usar una notación de barra o una máscara de red para especificar el rango de direcciones IP.
iptables -A ENTRADA -s 10.10.10.0/24 -j GOTAR
o
iptables -A ENTRADA -s 10.10.10.0/255.255.255.0 -j DROP
Conexiones a un puerto específico
Este ejemplo muestra cómo bloquear las conexiones SSH de 10.10.10.10.
iptables -A ENTRADA -p tcp --dport ssh -s 10.10.10.10 -j DROP
Puede reemplazar "ssh" con cualquier protocolo o número de puerto. los -p tcp
parte del código le dice a iptables qué tipo de conexión usa el protocolo. Si estaba bloqueando un protocolo que usa UDP en lugar de TCP, entonces -p udp
sería necesario en su lugar.
Este ejemplo muestra cómo bloquear las conexiones SSH desde cualquier dirección IP.
iptables -A ENTRADA -p tcp --dport ssh -j DROP
Estados de conexión
Como mencionamos anteriormente, muchos protocolos requerirán comunicación bidireccional. Por ejemplo, si desea permitir conexiones SSH a su sistema, las cadenas de entrada y salida necesitarán una regla adicional. Pero, ¿qué sucede si solo desea que se permita la entrada de SSH en su sistema? No agregar una regla a la cadena de salida también permitirá intentos salientes de SSH?
Ahí es donde entran los estados de conexión, lo que le brinda la capacidad que necesitaría para permitir la comunicación bidireccional, pero solo permite que se establezcan conexiones unidireccionales. Eche un vistazo a este ejemplo, donde se permiten las conexiones SSH DESDE 10.10.10.10, pero las conexiones SSH HASTA 10.10.10.10 no. Sin embargo, el sistema puede enviar información a través de SSH siempre que la sesión ya haya sido establecida, lo que hace posible la comunicación SSH entre estos dos hosts..
iptables -A ENTRADA -p tcp --dport ssh -s 10.10.10.10 -m estado --estado NUEVO, ESTABLECIDO -j ACEPTAR
iptables -A SALIDA -p tcp --sport 22 -d 10.10.10.10 -m estado --estado ESTABLECIDO -j ACEPTAR
Guardando cambios
Los cambios que realice en las reglas de iptables se eliminarán la próxima vez que se reinicie el servicio de 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 guardar
O
/etc/init.d/iptables guardar
Otros comandos
Listar las reglas de iptables configuradas actualmente:
iptables -L
Añadiendo el -v
La opción le dará información sobre paquetes y bytes, y agregar -norte
Listará todo numéricamente. En otras palabras, los nombres de host, protocolos y redes se enumeran como números.
Para borrar todas las reglas configuradas actualmente, puede emitir el comando flush.
iptables -F