![¿Cuándo rastrea el módulo conntrack de iptable los estados de los paquetes?](https://rvso.com/image/756248/%C2%BFCu%C3%A1ndo%20rastrea%20el%20m%C3%B3dulo%20conntrack%20de%20iptable%20los%20estados%20de%20los%20paquetes%3F.png)
Primero necesita almacenar estados. Con un antiguo firewall BSD que usé, supongo que se llamaba IPFW, solía poner una regla que decía "realizar un seguimiento del estado del paquete saliente", y esto se colocaba en la dirección de salida de las interfaces. Luego, otra regla en la dirección de entrada que los comparaba con los estados creados por la regla en la dirección de salida. Entonces, solía haber dos reglas: (1) para completar la tabla de estados, esto estaba en la dirección de salida, y (2) para buscar la tabla de estados, esto estaba en la dirección de entrada.
Pero con connntrack, lo veo aplicado en la cadena INPUT, como esta regla:
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
Esto me hace preguntarme, ¿qué significa realmente esa afirmación?
- ¿Está diciendo que comenzará a rastrear paquetes que coincidan con esa regla poniendo su información en la tabla de estados?
- ¿O está diciendo que ya tiene la información de los estados y que va a actuar contra los mensajes entrantes basándose en ella? (por ejemplo, ¿aceptar si pertenecían a una conexión previamente aceptada?). Pero, en este caso, ¿dónde se completó la tabla de estados? ¿Qué regla lo hace? ¿O no tiene reglas y es implícito?
Respuesta1
Presentación introductoria de Netfilter y conntrack
Primero, el esquema obligatorio sobre el flujo de paquetes en Netfilter y General Networking:
Netfilter es el marco de filtrado de paquetes que se inserta sobre el resto de la pila de red (representado por la "decisión de enrutamiento" y otras partes de la caja blanca con bordes redondeados). Netfilter proporciona enlaces y API para otros subsistemas y "clientes". Entre estas partes se encuentranconectar(el rastreador de conexiones) yiptables(onftables). La separación entre Netfilter yconectares bastante confuso. Puedes simplemente considerarconectarcomo parte integrada de Netfilter.
En el esquema que describe los distintos pasos que atraviesa un paquete, puede ver que en algún punto (entre raw/PREROUTING y mangle/PREROUTING, o entre raw/OUTPUT y mangle/OUTPUT) el paquete atraviesaconectar.
En este punto,conectarbuscará en sus propias tablas de búsqueda (una mini base de datos de búsqueda mantenida en la memoria del kernel):
- Si no se encuentran las características de este paquete (y si no se declara UNTRACKED en la tabla sin formato), se crea un nuevo conntrack bidireccional.tuplaentrada (protocolo, luego información específica de familia y protocolo: origen y puerto inicial, destino y puerto inicial, origen y puerto de respuesta, destino y puerto de respuesta (esos dos últimos suelen ser al revés, a menos que NAT o algunos protocolos extraños estén involucrados, como echo respuesta a la solicitud de eco coincidente para ICMP)) que describe el flujo y se crea con el estado NUEVO.
- si coincide (en cualquier dirección) con una entrada anterior y es compatible con el estado de este flujo, el estado del flujo podría alterarse (por ejemplo: cambiar de NUEVO a ESTABLECIDO si ese no era el caso antes).
- si por alguna razón específica el paquete no puede coincidir con un flujo existente a pesar de tener sus características (por ejemplo: un paquete TCP tardío recibido después de que las retransmisiones ya se iniciaron exitosamente, por lo que está fuera de la ventana con respecto a la secuencia y los valores SACK), el El paquete se etiquetará como INVÁLIDO.
- Hay algunos otros casos como RELACIONADO: se trata de paquetes que no forman parte del flujo en sí, sino que están relacionados con un nuevo flujo que puede asociarse con otro flujo existente (es decir, en la base de datos). Dos ejemplos son un error ICMP creado al recibir un paquete (por ejemplo: puerto UDP inalcanzable) o cuando un protocolo auxiliar especial como el módulo del kernel
nf_conntrack_ftp
, que es un complemento delconectarsubsistema, detecta que un paquete es parte del flujo de datos separado asociado con los comandos FTP PASV/EPSV o PORT/EPRT realizados en el flujo de comandos (en el puerto 21).
Abordar la pregunta
Dicho todo esto, aquí están las respuestas a sus dos puntos:
en el espacio de nombres de la red principalconectarcomienza a rastrear las conexiones tan pronto como se cargan sus módulos (incluidos los posibles submódulos específicos del protocolo relevantes). Para espacios de nombres de red no iniciales (contenedores...), esto también requiere que algún otro subsistema haga referencia a él (como OP'siptablesdel módulo conntrack o usando una vez el comando
conntrack
que se describe más adelante). Este es el valor predeterminado y un paquete debe marcarse específicamente como SIN SEGUIMIENTOanteselconectarEl subsistema lo ve para que este paquete no sea rastreado. En Linux, solo hay unos pocos casos en los que no sería necesario realizar un seguimiento, pero, por supuesto, el firewall con estado y la NAT dinámica/con estado ya no estarán disponibles (la NAT sin sistema, que incluso podría requerir el uso de UNTRACKED en primer lugar, aún puede estar disponible). hecho, pero no coniptables.tconftablespoder). Para evitarconectarmanejando algunos paquetes, este tipo deiptablesSe puede utilizar una regla (por ejemplo: puerto 80/tcp):iptables -t raw -A PREROUTING -p tcp --dport 80 -j CT --notrack iptables -t raw -A OUTPUT -p tcp --sport 80 -j CT --notrack
Cuando el paquete atraviesa el filtro/ENTRADA y alcanza esta regla:
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
EliptablesEl módulo del kernel específico
xt_conntrack
consulta elconectarsubsistema (manejado por los diversos módulos relevantes del kernelnf_conntrack*
) y pregunta sobre el estado de este paquete en su base de datos de búsqueda. Si la respuesta esRELATED
oESTABLISHED
el paquete coincide y se procede al veredicto de ACEPTAR. En realidad el resultado ya esalmacenado en cachéel paquetela primera vez que se realizó la búsqueda (generalmente porconectar) por lo que esta es una "búsqueda" barata. Por tanto, se trata de una regla genérica para manejar flujos ya aceptados anteriormente. Esos flujos pueden aceptarse inicialmente en reglas que los mencionen explícitamente-m conntrack --ctstate NEW
o simplemente en reglas que no los mencionen pero que se coloquendespuésesta regla genérica (pero tenga en cuenta el estado NO VÁLIDO, que normalmente debe eliminarse antes de hacerlo).agregando una viñeta: el manejo de paquetes entrantes y salientes es bastante simétrico entre PREROUTING y OUTPUT (incluso si no parecen simétricos):conectarinterfaces en PREROUTING así como en OUTPUT (y en algunos otros lugares, considerandoNATestá trabajando conconectar, excepto por su primer paquete en estado NUEVO atravesandoiptables's mesa nat). Esto podría ser ligeramente diferente de la descripción que escribiste sobre IPFW. Si un servidor que ejecuta aplicaciones también restringe los flujos salientes, lo más probable es que necesite este mismo servidor genérico.iptablesregla tanto en filtro/SALIDA como en filtro/ENTRADA, para permitir que pasen los paquetes de respuesta salientes del tráfico entrante ya aceptado.
Información adicional
Hay herramientas dedicadas para interactuar con elconectartablas de búsqueda del subsistema deherramientas-conntrack.
conntrack
: para consultar, eliminar o actualizar el contenido de las tablas de búsqueda manejadas porconectar.Algunos ejemplos.
Puede enumerar todas las entradas rastreadas (que pueden ser grandes sin filtro adicional) con:
conntrack -L
Si su sistema utiliza NAT (por ejemplo, un enrutador frente a una LAN privada o ejecuta máquinas virtuales y contenedores), puede usar
--any-nat
o--src-nat
para--dst-nat
mostrar solo resp. todo NAT, todo NAT de origen (enmascarado) o todo NAT de destino (normalmente para puertos reenviados):Monitoreo en tiempo real deconectareventos:
conntrack -E
conntrackd
: un demonio cuyos dos propósitos principales son (conntrack) contabilidad de flujo y estadísticas, oClúster de firewall con estado de alta disponibilidadsincronización de estados.
Respuesta2
El seguimiento de la conexión es una función separada de Netfilter y no está configurada con IPTables.
En la imagen, hay dos conntrack
pasos en la ruta de ENTRADA y uno en la ruta de SALIDA. Estos pasos asocian paquetes individuales con conexiones existentes rastreadas en la tabla de seguimiento de conexiones o crean nuevas entradas de seguimiento de conexiones en la tabla.
La funcionalidad Conntrack es un módulo del kernel de Linux y, a menudo, se incluye en el kernel en la configuración predeterminada.
La operación de Conntrack se puede ajustar ajustando net.netfilter.nf_conntrack
los valores de sysctl.
Tu segunda alternativa es lo que sucede. La información de estado es registrada por la función Conntrack y la regla IPTables simplemente consulta la tabla Conntrack para obtener información.