Tengo un servidor web ejecutándose con Apache en Ubuntu detrás de Cloudflare. Quiero bloquear a un usuario usando las iptables del servidor web. Aquí quiero implementar la función de coincidencia de cadenas de iptables y eliminar la conexión. Aquí está mi regla que no funciona:
iptables -I INPUT -m string --string "x-forwarded-for: 216.244.66.205" --algo bm --to 65535 -j DROPDespués de agregar esta regla, el cliente aún puede acceder al servidor.
Conozco el encabezado específico de Cloudflare para la IP del cliente que es cf-connecting-ip . Puedo bloquear al cliente con esto. Aquí está la regla que funciona bien:
iptables -I INPUT -m string --string "cf-connecting-ip: 216.244.66.205" --algo bm --to 65535 -j DROPEl tráfico de Cloudflare al servidor web es HTTP (puerto 80).
Tengo un balanceador de carga (haproxy) y algunos de los dominios se ejecutan a través de esto en lugar de Cloudflare. Es por eso que quiero usar XFF porque cf-connecting-ip es específico de Cloudflare y XFF es compatible con ambos.
Puedo ver que Cloudflare está adjuntando correctamente los encabezados cf-connecting-ip y XFF. Aquí está la salida de tcpdump entre múltiples solicitudes:
tcpdump -A -s 65535 'tcp port 80' | grep 216.244.66.205x-forwarded-for: 216.244.66.205 cf-connecting-ip: 216.244.66.205 x-forwarded-for: 216.244.66.205 cf-connecting-ip: 216.244.66.205 x-forwarded-for: 216.244.66.205 cf-connecting-ip: 216.244.66.205 x-forwarded-for: 216.244.66.205 cf-connecting-ip: 216.244.66.205
De alguna manera, las iptables pueden detectar la cadena cf-connecting-ip pero no x-forwarded-for .
Cualquier ayuda sería apreciada.
Los encabezados HTTP están en la capa de aplicación, mientras que IPTables funciona más abajo en la pila TCP/IP. Los datos en los que desea filtrar no son visibles para IPTables.
Para los sitios web detrás de Cloudflare, debe configurar IPTables para permitir solo el paso de las direcciones IP de Cloudflare y usar el Firewall de Cloudflare para bloquear las direcciones IP del cliente.