GNU/Linux >> Tutoriales Linux >  >> Linux

Iptables:hacer coincidir el tráfico saliente con conntrack y propietario. Funciona con gotas extrañas.

Para acortar una larga historia, ese ACK se envió cuando el socket no pertenecía a nadie. En lugar de permitir paquetes que pertenecen a un socket que pertenece al usuario x , permitir paquetes que pertenezcan a una conexión iniciada por un socket del usuario x .

La historia más larga.

Para entender el problema, ayuda entender cómo wget y las solicitudes HTTP funcionan en general.

En

wget http://cachefly.cachefly.net/10mb.test

wget establece una conexión TCP a cachefly.cachefly.net , y una vez establecido envía una solicitud en el protocolo HTTP que dice:"Por favor envíeme el contenido de /10mb.test (GET /10mb.test HTTP/1.1 ) y, por cierto, ¿podría por favor no cerrar la conexión una vez que haya terminado (Connection: Keep-alive ). La razón por la que lo hace es porque en caso de que el servidor responda con una redirección para una URL en la misma dirección IP, puede reutilizar la conexión.

Ahora el servidor puede responder con "aquí vienen los datos que solicitó, tenga cuidado, tiene un tamaño de 10 MB (Content-Length: 10485760 ), y sí OK, dejaré la conexión abierta". O si no sabe el tamaño de los datos, "Aquí están los datos, lo siento, no puedo dejar la conexión abierta, pero le diré cuando pueda dejar de descargar los datos cerrando mi extremo de la conexión".

En la URL anterior, estamos en el primer caso.

Entonces, tan pronto como wget ha obtenido los encabezados de la respuesta, sabe que su trabajo está hecho una vez que ha descargado 10 MB de datos.

Básicamente, qué wget lo que hace es leer los datos hasta que se hayan recibido 10 MB y salir. Pero en ese punto, hay más por hacer. ¿Qué pasa con el servidor? Se le ha dicho que deje la conexión abierta.

Antes de salir, wget cierra (close llamada al sistema) el descriptor de archivo para el socket. Sobre, el close , el sistema termina de reconocer los datos enviados por el servidor y envía un FIN decir:"No enviaré más datos". En ese momento close devuelve y wget salidas Ya no hay un socket asociado a la conexión TCP (al menos no uno propiedad de ningún usuario). Sin embargo, aún no está terminado. Al recibir ese FIN , el servidor HTTP ve fin de archivo al leer la siguiente solicitud del cliente. En HTTP, eso significa "no más solicitudes, cerraré mi final". Entonces también envía su FIN, para decir:"Yo tampoco enviaré nada, esa conexión se va a perder".

Al recibir ese FIN, el cliente envía un "ACK". Pero, en ese momento, wget se ha ido hace mucho tiempo, por lo que ACK no es de ningún usuario. Es por eso que está bloqueado por su firewall. Debido a que el servidor no recibe el ACK, enviará el FIN una y otra vez hasta que se dé por vencido y verá más ACK caídos. Eso también significa que al eliminar esos ACK, está utilizando innecesariamente los recursos del servidor (que necesita mantener un socket en el estado LAST-ACK) durante bastante tiempo.

El comportamiento habría sido diferente si el cliente no hubiera solicitado "Keep-alive" o el servidor no hubiera respondido con "Keep-alive".

Como ya se mencionó, si está utilizando el rastreador de conexión, lo que quiere hacer es dejar pasar todos los paquetes en los estados ESTABLECIDO y RELACIONADO y solo preocuparse por NEW paquetes.

Si permite NEW paquetes del usuario x pero no paquetes del usuario y , luego otros paquetes para conexiones establecidas por el usuario x pasará, y porque no se pueden establecer conexiones por parte del usuario y (ya que estamos bloqueando el NEW paquetes que establecerían la conexión), no habrá ningún paquete para el usuario y conexiones pasando.


Esto permite la salida del puerto 80 solo para la cuenta "cuenta de usuario"

— bueno, al menos las reglas que has mostrado no implican esto, en realidad.

También hay un espacio para consejos:no verifique el usuario en flujos ESTABLECIDOS, solo haga esa verificación en NUEVO. Tampoco veo el punto de verificar el puerto de origen cuando se verifica el ESTABLECIDO entrante, ¿cuál es la diferencia en qué puerto era? Ya está en estado ESTABLECIDO desde el punto de vista de conntrack. El cortafuegos debe ser lo más simple posible pero eficiente, por lo que el enfoque de la navaja de afeitar de Occam es la mejor opción.


Linux
  1. Monitoreo de actividad y estado de usuario en Linux con GNU acct

  2. 8 mejores prácticas con sudo en Linux:qué hacer y qué no hacer con sudo

  3. ¿Crear un punto de acceso inalámbrico y compartir la conexión a Internet con Nmcli?

  4. IPTables de Linux:ejemplos de reglas entrantes y salientes (SSH y HTTP)

  5. Variables de entorno de usuario con "su" y "sudo" en Linux

Cómo cambiar el propietario del archivo/grupo con el comando chown en Linux

CentOS / RHEL:Cómo bloquear puertos entrantes y salientes usando iptables

¿Cuál es la diferencia entre el estado de iptables y ctstate?

Reenviar el tráfico http a otra dirección IP con iptables

Preservar los permisos de archivos y carpetas con rsync

¿Cómo puedo usar comodines de estilo ms-dos con ls y mv?