Esta es una pregunta canónica propuesta sobre la comprensión y la depuración del firewall del software en sistemas Linux.
En respuesta a la respuesta de EEAA y al comentario de @ Shog de que necesitamos un Q&A canónico adecuado para cerrar preguntas comunes relativamente simples sobre iptables.
¿Cuál es un método estructurado para depurar problemas con el firewall de software de Linux, el marco de filtrado de paquetes de netfilter , comúnmente conocido por la interfaz de usuario iptables ?
¿Cuáles son los escollos comunes, las preguntas recurrentes y las cosas simples o un poco más oscuras para verificar que un administrador de firewall ocasional podría pasar por alto o de lo contrario beneficiarse de saber?
Incluso cuando utiliza herramientas como UFW , FirewallD (alias firewall-cmd
), Shorewall o similares, puede beneficiarse de mirar debajo del capó sin la capa de abstracción que ofrecen esas herramientas.
Esta pregunta no pretende ser una guía práctica para construir firewalls: consulte la documentación del producto para eso y, por ejemplo, contribuya con recetas a iptables Trips & Tricks o busque en las preguntas etiquetadas de iptables ufw firewalld firewall-cmd las puntuaciones existentes frecuentes y bien consideradas de alto puntaje Preguntas y respuestas
net.netfilter.nf_conntrack_log_invalid
255 capturará bastante bien los paquetes inválidos, lo que puede ayudar si es la parte con estado de netfilter que está produciendo el mal comportamiento.Respuestas:
En general:
Ver y modificar la configuración del firewall requiere privilegios de administrador (
root
) al igual que abrir servicios en el rango de número de puerto restringido. Eso significa que debe iniciar sesión comoroot
o utilizar alternativamentesudo
para ejecutar el comando como root. Intentaré marcar tales comandos con el opcional[sudo]
.Contenido:
-I
y-A
iptables -L -v -n
1. El orden importa o la diferencia entre
-I
y-A
Lo que debe recordar es que las reglas del firewall se verifican en el orden en que se enumeran. El núcleo dejará de procesar la cadena cuando se active una regla que permitirá o deshabilitará un paquete o conexión.
Creo que el error más común para los administradores de firewall novatos es que siguen las instrucciones correctas para abrir un nuevo puerto, como el siguiente:
y luego descubre que no tendrá efecto.
La razón de esto es que la
-A
opción agrega esa nueva regla, después de todas las reglas existentes y dado que muy a menudo la regla final en el firewall existente era una que bloquea todo el tráfico que no está explícitamente permitido, lo que resulta enO equivalente en iptables-save:
y nunca se alcanzará la nueva regla que abre el puerto TCP 8080. (como lo demuestran los contadores que permanecen obstinadamente en 0 paquetes y cero bytes).
Al insertar la regla con
-I
la nueva regla habría sido la primera en la cadena y funcionará.2. Visualice la configuración actual del firewall
Mi recomendación para el administrador del firewall es mirar la configuración real que está ejecutando el kernel de Linux, en lugar de tratar de diagnosticar problemas de firewall con herramientas fáciles de usar. A menudo, una vez que comprende los problemas subyacentes, puede resolverlos fácilmente en un asunto respaldado por esas herramientas.
El comando
[sudo] iptables -L -v -n
es tu amigo (aunque a algunas personas les gustaiptables-save
más). A menudo, cuando se discuten configuraciones, es útil usar la--line-numbers
opción también para numerar líneas. Refiriéndose a la regla #X hace que discutirlos sea algo más fácil.Nota: las reglas de NAT están incluidos en la
iptables-save
salida, pero que muestran por separado mediante la adición de la-t nat
opción es decir,[sudo] iptables -L -v -n -t nat --line-numbers
.Ejecutar el comando varias veces y verificar el incremento de contadores puede ser una herramienta útil para ver si una nueva regla realmente se activa.
Alternativamente, la salida de
iptables-save
da un script que puede regenerar la configuración de firewall anterior:Es una cuestión de preferencia lo que encontrará más fácil de entender.
3. Interpretar la salida de
iptables -L -v -n
La política establece la acción predeterminada que usa la cadena cuando no coincide ninguna regla explícita. En la
INPUT
cadena configurada para ACEPTAR todo el tráfico.La primera regla en la cadena INPUT es inmediatamente interesante, envía todo el tráfico (fuente 0.0.0.0/0 y destino 0.0.0.0/0) destinado al puerto TCP 22 (
tcp dpt:22
) el puerto predeterminado para SSH a un destino personalizado (fail2ban-SSH
) . Como su nombre lo indica, fail2ban mantiene esta regla (un producto de seguridad que, entre otras cosas, analiza los archivos de registro del sistema para detectar posibles abusos y bloquea la dirección IP del abusador).Esa regla habría sido creada por una línea de comandos de iptables similar ao
iptables -I INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH
se encuentra en la salida de iptables-save as-A INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH
. A menudo encontrará cualquiera de esas anotaciones en la documentación.Los contadores indican que esta regla ha coincidido con 784'000 paquetes y 65 megabytes de datos.
El tráfico que coincide con esta primera regla es procesado por la
fail2ban-SSH
cadena que, como una cadena no estándar, se enumera debajo de la cadena de SALIDA.Esa cadena consta de dos reglas, una para cada abusador (dirección IP de origen 117.253.221.166 o 58.218.211.166) que está bloqueada (con a
reject-with icm-port-unreachable
).Los paquetes SSH que no son de esos hosts bloqueados aún no están permitidos ni deshabilitados, y ahora que la cadena personalizada se haya completado se verificará con la segunda regla en la cadena INPUT.
Todos los paquetes que no estaban destinados al puerto 22 pasaron la primera regla en la cadena INPUT y también serán evaluados en la regla INPUT # 2.
La regla de ENTRADA número 2 hace que este sea un firewall con estado , que rastrea las conexiones. Esto tiene algunas ventajas, solo los paquetes para las nuevas conexiones deben verificarse con el conjunto completo de reglas, pero una vez permitidos, se aceptan paquetes adicionales que pertenecen a una conexión establecida o relacionada sin una verificación adicional.
La regla de entrada n. ° 2 coincide con todas las conexiones abiertas y relacionadas y los paquetes que coinciden con esa regla no tendrán que evaluarse más.
Nota: los cambios de reglas en la configuración de un firewall con estado solo afectarán las conexiones nuevas, no las conexiones establecidas.
En contraste, un filtro de paquete simple prueba cada paquete contra el conjunto completo de reglas, sin rastrear el estado de la conexión. En dicho firewall no se utilizarían palabras clave de estado .
La regla INPUT # 3 es bastante aburrida, todo el tráfico que se conecta a la
lo
interfaz loopback ( o 127.0.0.1) está permitido.Las reglas INPUT 4, 5 y 6 se usan para abrir los puertos TCP 22, 80 y 443 (los puertos predeterminados para SSH, HTTP y HTTPS resp.) Al otorgar acceso a NUEVAS conexiones (las conexiones existentes ya están permitidas por la regla INPUT 2).
En un firewall sin estado, esas reglas aparecerían sin los atributos de estado:
o
La regla INPUT final, # 7 es una regla que bloquea todo el tráfico al que NO se le otorgó acceso en las reglas INPUT 1-7. Una convención bastante común: todo lo que no está permitido se niega. En teoría, esta regla podría haberse omitido al establecer la POLÍTICA predeterminada en RECHAZAR.
Siempre investiga toda la cadena.
4. Conoce tu entorno
4.1. La configuración en un firewall de software no afectará la configuración de seguridad mantenida en otra parte de la red, es decir, a pesar de abrir un servicio de red con
iptables
las listas de control de acceso no modificadas en los enrutadores u otros firewalls en su red, aún puede bloquear el tráfico ...4.2. Cuando no hay ningún servicio escuchando, no podrá conectarse y obtener un error de conexión rechazada , independientemente de la configuración del firewall. Por lo tanto:
[sudo] netstat -plnut
o utiliza alternativamentess -tnlp
.[sudo] nc -l -p 123
oopenssl s_server -accept 1234 [options]
si necesita un escucha TLS / SSL (verifique lasman s_server
opciones).telnet <IP of Server> 123
oecho "Hello" | nc <IP of Server> 123
cuando pruebe el servicio seguro TLS / SSLopenssl s_client -connect <IP of Server>:1234
, antes de intentar lo mismo desde un host remoto.4.3. Comprenda los protocolos utilizados por sus servicios. No puede habilitar / deshabilitar adecuadamente los servicios que no comprende suficientemente. Por ejemplo:
/etc/services
no coinciden necesariamente con el servicio real que utiliza un puerto.4.4. El filtro de paquetes del núcleo no es lo único que puede restringir la conectividad de red:
getenforce
confirmará si SELinux se está ejecutando.ldd /path/to/service |grep libwrap
y los/hosts.[allow|deny]
archivos de control.5.
INPUT
oFORWARD
cadenasEl concepto de cadenas se explica más a fondo aquí, pero en resumen:
La
INPUT
cadena es donde abre y / o cierra puertos de red para servicios que se ejecutan localmente, en el host donde emite los comandos de iptables.La
FORWARD
cadena es donde aplica reglas para filtrar el tráfico que el núcleo reenvía a otros sistemas, sistemas reales, pero también contenedores Docker y servidores de Servidores invitados virtuales cuando su máquina Linux actúa como un puente, enrutador, hipervisor y / o dirección de red traducción y reenvío de puertos.Una idea errónea común es que, dado que un contenedor Docker o un invitado KVM se ejecuta localmente, las reglas de filtro que se aplican deben estar en la cadena INPUT, pero ese no suele ser el caso.
6. Módulos del núcleo
Dado que el filtro de paquetes se ejecuta dentro del kernel de Linux, también se puede compilar como módulo dinámico, en realidad, múltiples módulos. La mayoría de las distribuciones incluyen netfilter como módulos y los módulos de netfilter necesarios se cargarán en el kernel según sea necesario, pero para algunos módulos un administrador de firewall deberá asegurarse manualmente de que se carguen. Esto se refiere principalmente a los módulos de seguimiento de conexión, como los
nf_conntrack_ftp
que se pueden cargarinsmod
.Los módulos cargados actualmente en el kernel en ejecución se pueden mostrar con
lsmod
.El método para garantizar que los módulos se carguen de forma persistente en los reinicios depende de la distribución de Linux.
fuente
watch --difference -n 1 iptables -L FORWARD -v -n
. Dejar que la herramienta ejecute periódicamente el comando y resalte los cambios hace que sea mucho más fácil.iptables-save
salida (preferiblemente con-c
) cada vez sobre estaiptables -L
salida temida (con varios argumentos).Problemas comunes con diferentes protocolos
DNS: DNS utiliza el puerto 53 UDP de manera predeterminada, pero los mensajes que no caben en un solo datagrama UDP se transmitirán utilizando TCP en su lugar (generalmente transferencias de zona y similares) que requieren que el puerto 53 TCP también se abra cuando ejecuta un servidor de nombres .
Correo electrónico: muchos ISP de los consumidores bloquean el tráfico SMTP (o al menos el puerto predeterminado TCP 25), lo que hace imposible recibir o enviar correos electrónicos directamente y sus clientes se ven obligados a usar el relé SMTP del ISP para todo el correo saliente y a veces también para el correo entrante. . Se relaciona con §1.1.
FTP: FTP es un protocolo extraño en el sentido de que se utilizan dos conexiones. La primera es la conexión de control, por defecto un servidor FTP escuchará en el puerto TCP 21 para eso. La conexión de control se utiliza para la autenticación y la emisión de comandos. Las transferencias de archivos reales y cosas como la salida de un listado de directorio pasan por una segunda conexión TCP, la conexión de DATOS. En FTP activo, esa conexión de DATOS se iniciaría desde el servidor FTP desde el puerto TCP 20 y se conectaría al cliente FTP. El FTP activo no funciona muy bien con usuarios detrás de firewalls y puertas de enlace NAT, por lo que ha caído en desuso. La mayoría de los servidores FTP admiten FTP pasivo en su lugar. Con FTP pasivo, el servidor FTP abre un escucha para la conexión de DATOS en un segundo puerto, al que el cliente FTP puede conectarse. El problema para un firewall es que el puerto DATA puede ser cualquier puerto no privilegiado disponible entre 1024-65536.
En un firewall sin estado que generalmente se resuelve restringiendo la cantidad de puertos pasivos que el servidor FTP puede asignar y luego abriendo explícitamente esos puertos. es decir
En un firewall con estado, no es necesario abrir explícitamente el puerto DATA, el módulo auxiliar netfilter reconocerá el puerto dinámico que se asigna y abrirá dinámicamente ese puerto para el cliente correcto marcando la conexión DATA
RELATED
después de lo cual coincidirá con la regla genérica :Esto requiere que se cargue el módulo de kernel correcto , en el caso de FTP, ejecutando manualmente, por ejemplo
insmod nf_conntrack_ftp
, lo que hace que persistente dependa de reiniciar depende de la distribución.Nota: El módulo de seguimiento de la conexión FTP fallará cuando se use FTP con SSL, ya que la conexión de control estará encriptada y el nf_conntrack_ftp ya no podrá leer la respuesta PASV.
NFS y servicios RPC similares : el problema con los servicios RPC es que, por diseño, no utilizan un puerto fijo específico. Pueden elegir cualquier puerto disponible al azar, que luego se registrará con el demonio RPC Portmap. Un cliente que intente conectarse consultará el demonio Portmap y luego se conectará directamente al puerto correcto. Eso resolvió el problema de quedarse sin puertos reservados ...
Desde la perspectiva del cortafuegos, es necesario abrir el puerto TCP / UDP 111 y el puerto real que el servicio RPC está utilizando actualmente. El problema de abrir un puerto aleatorio de este tipo en un firewall generalmente se resuelve restringiendo el servicio RPC, como el servidor NFS, para usar un puerto fijo predefinido.
fuente
Iptables / Firewall "introducción"
Un firewall es básicamente un filtro de red basado en políticas. Los firewalls de Linux están construidos alrededor de Netfilter; El marco de procesamiento de paquetes de red del núcleo que está formado por varios módulos del núcleo que realizan tareas específicas:
Los usuarios configuran el marco Netfilter para satisfacer sus necesidades de firewall utilizando iptables desde la línea de comandos. Con iptables definimos reglas que le indican al núcleo qué hacer con los paquetes IP cuando llegan, pasan o salen de nuestra caja de Linux. Cada proceso principal de Netfilter está representado por una TABLA (FILTRO, NAT, MANGLE) en la jerga de iptables. Tienen varios puntos de enlace específicos en el mapa de flujo de paquetes de red donde el núcleo los invoca para realizar sus tareas. Ciertas secuencias de llamadas TABLE ubicadas específicamente se denominan genéricamente CADENAS integradas que reciben los nombres de PREROUTING, INPUT, FORWARD, OUTPUT y POSTROUTING. Es fácil recordar si asociamos una TABLA con un "tipo de proceso" y una CADENA con la "ubicación" en el mapa de flujo de paquetes de red donde se invocan instancias de esos procesos.
Dado que un paquete IP se recibe en una interfaz de red o se crea mediante un proceso local, hasta que finalmente se entregue o descarte, el motor Netfilter probará secuencialmente y aplicará las reglas contenidas en el mapa de flujo de paquetes de red. En cada bloque identificado por un par TABLE @ CHAIN, el usuario puede agregar una o más de estas reglas consecutivas que contienen un criterio de coincidencia de paquetes IP y el curso de acción correspondiente. Hay acciones (es decir, ACEPTAR, DROP, etc.) que pueden realizarse en más de una TABLA y otras acciones (es decir, SNAT, DNAT, etc.) que son específicas de la TABLA.
es decir, cuando un paquete IP llega desde una interfaz de red, primero lo procesa la cadena PREROUTING invocando las reglas definidas por el usuario de la tabla MANGLE, si las hay. Si no hay reglas que coincidan con el paquete actual, se aplicará el curso de acción predeterminado o "política" correspondiente a MANGLE @ PREROUTING. En este punto, si el paquete no se descartó, el proceso continuará invocando las reglas de la tabla NAT en la cadena PREROUTING (ver el mapa) y así sucesivamente. Para facilitar el diseño de reglas, los usuarios también pueden crear sus propias cadenas personalizadas y "saltar" a ellas desde diferentes puntos del mapa como lo deseen.
Si bien las cadenas integradas pueden tener políticas definidas por el usuario de paquetes ACEPTAR o DROP, las cadenas definidas por el usuario tienen siempre una política predeterminada de CAMBIO por defecto para que el llamante continúe el proceso.
Comandos iptables
Los comandos principales de iptables llenan el mapa de flujo de paquetes de red con las reglas de procesamiento requeridas.
La regla genérica de iptables se puede escribir como:
# iptables <table> <Add/Insert/Delete> <CHAIN> <PKT_MATCHING_CRITERIA> <ACTION>
Se podría leer como:
Los comandos auxiliares de iptables completan el escenario estableciendo condiciones predeterminadas, enumerando reglas, reglas de vaciado, etc.
Iptables carga nuestros comandos en el motor de Netfilter en tiempo de ejecución, Netfilter aplica inmediatamente las reglas y configuraciones cargadas, pero no son persistentes. Después de reiniciar, se perderán todas las reglas y configuraciones de Netfilter cargadas previamente. Por esta razón, existen utilidades de iptables que permiten guardar el conjunto de reglas actualmente activo en un archivo y volver a cargarlo más tarde.
Resumen de Iptables
Netfilter es un marco extremadamente flexible y potente, pero hay un precio que pagar por él; Iptables es complejo. Desde el punto de vista del usuario, ciertos términos como TABLE, CHAIN, TARGET no coinciden realmente bien con el concepto que representan y al principio no tienen mucho sentido. El tema es largo, los comandos parecen tener una lista interminable de parámetros. Para empeorar las cosas, no hay un solo libro que realmente domine Iptables. En su mayoría se dividen en dos categorías: "libro de recetas" o "libro de páginas de manual". Creo que esta introducción le ofrece una instantánea del panorama de Netfilter / Iptables más la dosis necesaria de material de página de manual previamente digerido. Si es nuevo en iptables, después de leer estos párrafos un par de veces estará listo para leer ejemplos de iptables. Con algo de práctica, pronto se encontrará escribiendo sus propias reglas.
Cortafuegos
Un firewall está diseñado principalmente para permitir o denegar dinámicamente el tráfico de red en función de un conjunto de reglas. En este punto, es fácil entender por qué el marco Linux Netfilter / Iptables es perfecto para la construcción de firewall. Mirando el mapa de flujo de paquetes de red encontramos dos puntos particularmente interesantes en la tabla FILTER en las cadenas INPUT y FORWARD; Podemos decidir allí sobre la dirección de origen IP, el protocolo IP (UDP / TCP), el puerto de destino (80, 21, 443, etc.), etc., si ACEPTAMOS, RECHAZAMOS o simplemente DEJAMOS un paquete IP en particular. Esto es lo que hace un cortafuegos el 80% del tiempo cuando, por ejemplo, protege un servidor web de solicitudes de red no autorizadas. El otro 20% del tiempo está manipulando paquetes de red (NAT, MANGLE).
Escenarios de cortafuegos
Hay cientos de diseños de firewall diferentes que cubren diferentes necesidades, pero 3 de ellos podrían considerarse los escenarios de firewall más típicos.
He escrito esto para: http://www.vercot.com/~jeoss/howto/JeossEasyFirewall.html
fuente