Am un server web (Ubuntu cu Apache) care rulează în spatele Cloudflare.Vreau să blochez un utilizator folosind iptables. Aici vreau să implementez extensia de potrivire a șirurilor a iptables și să renunț la conexiunea dacă x-redirecţionat-pentru potrivite. Adaug regula cu următoarea comandă:
iptables -I INPUT -m string --string "x-forwarded-for: 216.244.66.205" --algo bm --to 65535 -j DROP
După adăugarea acestei reguli, clientul este încă capabil să lovească serverul.
Știu despre antetul specific Cloudflare pentru IP-ul clientului, adică cf-conectare-ip. Dacă adaug o regulă cu următoarea comandă, funcționează conform așteptărilor. Iată regula care funcționează bine:
iptables -I INPUT -m string --string "cf-connecting-ip: 216.244.66.205" --algo bm --to 65535 -j DROP
De ce vreau să folosesc XFF în loc de cf-conectare-ip:
Am un echilibrator de încărcare separat (haproxy) și unele dintre domenii rulează prin aceasta în loc de Cloudflare. De aceea vreau să folosesc XFF pentru că cf-conectare-ip este specific Cloudflare și XFF este acceptat de ambele.
Traficul de la Cloudflare la serverul Web este HTTP (portul 80), astfel încât datele http sunt vizibile pentru iptables.
Văd că Cloudflare le atașează corect pe ambele cf-conectare-ip și antete XFF. Iată rezultatul tcpdump printre cereri multiple:
tcpdump -A -s 65535 'tcp port 80' | grep 216.244.66.205
x-redirecționat-pentru: 216.244.66.205
cf-connecting-ip: 216.244.66.205
x-redirecționat-pentru: 216.244.66.205
cf-connecting-ip: 216.244.66.205
x-redirecționat-pentru: 216.244.66.205
cf-connecting-ip: 216.244.66.205
x-redirecționat-pentru: 216.244.66.205
cf-connecting-ip: 216.244.66.205
Într-un fel, iptables sunt capabili să detecteze cf-conectare-ip dar nu x-redirecţionat-pentru.
Ce greșesc aici?