Cómo bloquear puntos "." en una regla de iptables?

Cómo bloquear puntos "." en una regla de iptables?

Tengo esta regla en mis iptables para bloquear dominios que terminan en .watch:

sudo iptables -A OUTPUT -j DROP -m string --string ".watch" --algo kmp

Pero el problema es que .no se pueden igualar. Entonces la línea de arriba no coincide con nada. Pero si quito el punto de .watcha watch, funciona bien.

¿Cómo puedo bloquear los puntos "." en las reglas de iptables?

Respuesta1

Sintácticamente, esto parece correcto, pero su enfoque no es adecuado para este propósito. Elparche de cuerdacoincide con una cadena en cualquier parte del paquete:

  • Estás soltando cualquier paquete que tenga watcho .watchen cualquier lugar. Es probable que esto provoque falsos positivos e incluso introduzca un nuevo vector de ataques de denegación de servicio.
  • No puede manejar tráfico cifrado. No puede bloquearla mayoría del tráfico web.
  • Aunque tiene opciones relativamente buenas para el algoritmo de coincidencia ( bmBoyer–Moore & kmpKnuth–Pratt–Morris), el uso del filtro de cadena aún puede requerir un uso intensivo de computación.

La documentación también advierte explícitamente contra esto:

Utilice este partido con precaución. Mucha gente quiere utilizar esta combinación para detener a los gusanos, junto con el objetivo DROP. Este es un gran error. Sería derrotado por cualquier método de evasión del IDS.

De manera similar, mucha gente ha estado usando esta coincidencia como un medio para detener funciones particulares en HTTP como POST o GET descartando cualquier paquete HTTP que contenga la cadena POST. Por favor, comprenda que este trabajo se realiza mejor mediante un proxy de filtrado. Además, cualquier contenido HTML con la palabra POST se eliminaría con el método anterior. Este partido ha sido diseñado para poder poner en cola paquetes interesantes en la zona de usuario para un mejor análisis, eso es todo. La eliminación de paquetes basándose en esto sería anulada por cualquier método de evasión de IDS.

Hay mejores alternativas para lo que está tratando de lograr:

  • Filtrado basado en DNS. Cualquier servidor DNS puede hacer esto. P.ej,Dnsmasqes un reenviador de DNS liviano y común: simplemente puede agregarlo address=/watch/0.0.0.0a su configuración.
  • Filtrado basado en proxy web.

Respuesta2

Los nombres DNS están codificados como etiquetas con prefijo de longitud (consulterfc 1035para obtener más detalles), por lo que debe utilizar --hex-string "|05|watch|00|"para hacer coincidir los nombres que terminan en .watch(tenga en cuenta que la longitud se escribe como 2 dígitos hexadecimales, por ejemplo, serverfault.comse codificaría como "|0b|serverfault|03|com|00|"). Tenga en cuenta que esto debe combinarse con -p udpy --destination-port 53(o 5353 si coinciden .locallas direcciones); de lo contrario, es probable que coincida con muchos otros paquetes no relacionados.

Las consultas de DNS también se pueden realizar a través de TCP, pero el filtrado de TCP es más complejo y los comentarios existentes sobre solicitudes cifradas y las sugerencias sobre el uso del filtrado a nivel de aplicación con un DNS y/o un proxy web aún se aplican.

información relacionada