ฉันมีเว็บเซิร์ฟเวอร์ (Ubuntu กับ Apache) ที่ทำงานอยู่เบื้องหลัง Cloudflareฉันต้องการบล็อกผู้ใช้โดยใช้ iptables ที่นี่ฉันต้องการใช้ส่วนขยายการจับคู่สตริงของ iptables และยกเลิกการเชื่อมต่อถ้า x-ส่งต่อ-สำหรับ จับคู่ ฉันกำลังเพิ่มกฎด้วยคำสั่งต่อไปนี้:
iptables -I INPUT -m string --string "x-forwarded-for: 216.244.66.205" --algo bm --to 65535 -j DROP
หลังจากเพิ่มกฎนี้แล้ว ไคลเอ็นต์ยังคงสามารถเข้าถึงเซิร์ฟเวอร์ได้
ฉันรู้เกี่ยวกับส่วนหัวเฉพาะของ Cloudflare สำหรับ IP ไคลเอ็นต์นั่นคือ cf-เชื่อมต่อ-ip. ถ้าฉันเพิ่มกฎด้วยคำสั่งต่อไปนี้ มันจะทำงานตามที่คาดไว้ นี่คือกฎที่ใช้ได้ดี:
iptables -I INPUT -m string --string "cf-connecting-ip: 216.244.66.205" --algo bm --to 65535 -j DROP
ทำไมฉันถึงต้องการใช้ XFF แทน cf-เชื่อมต่อ-ip:
ฉันมีตัวโหลดบาลานเซอร์แยกต่างหาก (haproxy) และบางโดเมนกำลังทำงานผ่านสิ่งนี้แทน Cloudflare นั่นคือเหตุผลที่ฉันต้องการใช้ XFF เพราะ cf-เชื่อมต่อ-ip เป็นเฉพาะสำหรับ Cloudflare และ XFF ได้รับการสนับสนุนโดยทั้งคู่
การรับส่งข้อมูลจาก Cloudflare ไปยังเว็บเซิร์ฟเวอร์คือ HTTP (พอร์ต 80) ดังนั้นข้อมูล http จึงมองเห็นได้ใน iptables
ฉันเห็นว่า Cloudflare กำลังเชื่อมต่อทั้งสองอย่างถูกต้อง cf-เชื่อมต่อ-ip และส่วนหัว XFF นี่คือผลลัพธ์ของ tcpdump ในคำขอหลายรายการ:
tcpdump -A -s 65535 'พอร์ต tcp 80' | เกรป 216.244.66.205
x-ส่งต่อสำหรับ: 216.244.66.205
cf-connecting-ip: 216.244.66.205
x-ส่งต่อสำหรับ: 216.244.66.205
cf-connecting-ip: 216.244.66.205
x-ส่งต่อสำหรับ: 216.244.66.205
cf-connecting-ip: 216.244.66.205
x-ส่งต่อสำหรับ: 216.244.66.205
cf-connecting-ip: 216.244.66.205
อย่างไรก็ตาม iptables สามารถตรวจจับ cf-เชื่อมต่อ-ip แต่ไม่ x-ส่งต่อ-สำหรับ.
ฉันทำอะไรผิดที่นี่?