Я пытаюсь настроить HaProxy с правилами защиты от DDoS (ограничение скорости). Однако я думаю, что HaProxy теперь ограничивает скорость IP-адресов CloudFlare вместо Visitor / Real IP. (примечание: мой сайт в порядке, потому что я исправил это в PHP-коде своего сайта) Как я могу это исправить?
Мой /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local0 notice
maxconn 10000
user haproxy
group haproxy
defaults
log global
mode http
option httplog
option dontlognull
retries 3
option redispatch
timeout http-request 10s
timeout connect 5000
timeout client 30s
timesout server 5000
frontend domain
bind *:80
stick-table type ip size 1m expire 10s store gpc0,http_req_rate(10s)
tcp-request connection track-sc1 src
tcp-request connection reject if { src_get_gpc0 gt 0 }
default_backend nginx
backend nginx
mode http
stats enable
stats uri /HIDDEN
stats realm Strictly\ Private
stats auth USER:PASSWORD
balance roundrobin
option httpclose
option httpchk HEAD / HTTP/1.1\r\nHost:domainhidden.eu
acl abuse src_http_req_rate(domain) ge 100
acl flag_abuser src_inc_gpc0(domain)
tcp-request content reject if abuse flag_abuser
server web1 iphere1:80 check
server web2 iphere2:80 check
server web3 iphere3:80 check
Я изменил домен, пользователя и пароль в конфигурации, потому что в противном случае люди могли бы получить статистику моего сайта: P (domainhidden.eu, USER: PASSWORD и 'iphere')
Вы должны занести их IP в белый список из своего предела скорости =).
https://www.cloudflare.com/ips
Итак, ваш ACL будет примерно таким (не уверен, что он полностью прав):
acl rate_whitelist src -f /path/to/whitelist-ips
acl abuse src_http_req_rate(domain) ge 100
acl flag_abuser src_inc_gpc0(domain)
tcp-request content reject if abuse flag_abuser !rate_whitelist
а потом твой whitelist-ips
файл будет списком IP (думаю, не уверен, правильный ли формат):
199.27.128.0/21
173.245.48.0/20
103.21.244.0/22
103.22.200.0/22
103.31.4.0/22
141.101.64.0/18
108.162.192.0/18
190.93.240.0/20
188.114.96.0/20
197.234.240.0/22
198.41.128.0/17
162.158.0.0/15
104.16.0.0/12
Cloudflare ставит исходный IP-адрес в CF-Connecting-IP
Заголовок HTTP. Таким образом, чтобы отличить злоумышленника, проходящего через сервер CF, от других людей, проходящих через тот же сервер, это значение заголовка можно использовать в качестве ключа.
Вот конфигурация, которая помогла мне против того, чтобы кто-то перебрал URL-адреса на моем сайте.
frontend www-https
# ...
# front-end config details skipped
# ...
default_backend www-backend
# Use General Purpose Couter 0 in SC0 as a global abuse counter
stick-table type string len 40 size 1m expire 300s store gpc0
# wait for at most 5 seconds for HTTP headers
tcp-request inspect-delay 5s
# use CF-Connecting-IP header as identifier
tcp-request content track-sc0 hdr(CF-Connecting-IP)
tcp-request content reject if { sc0_get_gpc0 gt 0 }
backend www-backend
# ...
# back-end config details skipped
# ...
# prevent new requests for 300 seconds from someone who got more than 10 HTTP errors in 60 seconds
stick-table type string len 40 size 1m expire 300s store http_err_rate(60s)
acl abuse sc1_http_err_rate ge 10
# tell front-end to reject future requests for this address
# (replace www-https with your front-end name)
acl flag_abuser sc0_inc_gpc0(www-https) gt 0
# wait for at most 5 seconds for HTTP headers
tcp-request inspect-delay 5s
# use CF-Connecting-IP header as identifier
tcp-request content track-sc1 hdr(CF-Connecting-IP)
tcp-request content reject if abuse flag_abuser
Если вы хотите видеть заголовки HTTP в журналах, добавьте capture
директива следующим образом:
option httplog
capture request header cf-connecting-ip len 100
capture request header x-forwarded-for len 100
log stdout format raw daemon