Tôi có một máy chủ web (Ubuntu với Apache) chạy phía sau Cloudflare.Tôi muốn chặn người dùng bằng iptables. Ở đây tôi muốn triển khai tiện ích mở rộng khớp chuỗi của iptables và hủy kết nối nếu x-chuyển tiếp-cho phù hợp. Tôi đang thêm quy tắc bằng lệnh sau:
iptables -I INPUT -m string --string "x-forwarded-for: 216.244.66.205" --algo bm --to 65535 -j DROP
Sau khi thêm quy tắc này, máy khách vẫn có thể truy cập máy chủ.
Tôi biết về tiêu đề cụ thể của Cloudflare cho IP máy khách đó là cf-kết nối-ip. Nếu tôi thêm một quy tắc bằng lệnh sau, nó sẽ hoạt động như mong đợi. Đây là quy tắc hoạt động tốt:
iptables -I INPUT -m string --string "cf-connecting-ip: 216.244.66.205" --algo bm --to 65535 -j DROP
Tại sao tôi muốn sử dụng XFF thay vì cf-kết nối-ip:
Tôi có một bộ cân bằng tải riêng (haproxy) và một số miền đang chạy qua bộ này thay vì Cloudflare. Đó là lý do tại sao tôi muốn sử dụng XFF vì cf-kết nối-ip dành riêng cho Cloudflare và XFF được hỗ trợ bởi cả hai.
Lưu lượng truy cập từ Cloudflare đến máy chủ Web là HTTP (cổng 80) nên dữ liệu http hiển thị với iptables.
Tôi có thể thấy Cloudflare đang đính kèm cả hai cf-kết nối-ip và tiêu đề XFF. Đây là đầu ra của tcpdump trong số nhiều yêu cầu:
tcpdump -A -s 65535 'cổng tcp 80' | grep 216.244.66.205
chuyển tiếp x cho: 216.244.66.205
cf-kết nối-ip: 216.244.66.205
chuyển tiếp x cho: 216.244.66.205
cf-kết nối-ip: 216.244.66.205
chuyển tiếp x cho: 216.244.66.205
cf-kết nối-ip: 216.244.66.205
chuyển tiếp x cho: 216.244.66.205
cf-kết nối-ip: 216.244.66.205
Bằng cách nào đó, iptables có thể phát hiện cf-kết nối-ip nhưng không x-chuyển tiếp-cho.
Tôi làm gì sai ở đây?