Limitação de taxa de haproxia, conn_rate, conn_cur

4

Tentei atingir a limitação de taxa em haproxy 1.5-18 com o seguinte:

frontend
stick-table type ip size 100k expire 30s store conn_rate(3s)   #connection rate
stick-table type ip size 1m expire 10s store gpc0,http_req_rate(10s) #http req rate
stick-table type ip size 100k expire 30s store conn_cur        #concurrent connections
    tcp-request connection track-sc1 src
    tcp-request connection reject if { sc1_conn_rate ge 20 }
    tcp-request connection reject if { src_get_gpc0(front) gt 50 }
    tcp-request connection reject if { sc1_conn_cur ge 50 }

backend
acl abuse src_http_req_rate(front) ge 10
    acl flag_abuser src_inc_gpc0(front)
    tcp-request content reject if abuse flag_abuser

Isso funcionaria porque o http_req_rate iria chutar e banir o agressor. Mas se eu remover as regras http_req_rate e deixar apenas estas

frontend
stick-table type ip size 100k expire 30s store conn_rate(3s)   #connection rate
stick-table type ip size 100k expire 30s store conn_cur        #concurrent connections
    tcp-request connection track-sc1 src
    tcp-request connection reject if { sc1_conn_rate ge 50 }
    tcp-request connection reject if { sc1_conn_cur ge 50 }

então um abusador não é banido, mas simplesmente não tem permissão para iniciar mais de 50 conexões. Ao observar a fila do Apache, o "abusador" não manterá mais de 50 conexões ocupadas.

Embora isso seja bom, porque um IP não seria o máximo de MaxClients , também não é melhor porque 5 IPs seriam - 5 * 50 = 250, considerando MaxClients 250.

O comportamento pretendido não deveria ser o banimento de todas conexões novas e estabelecidas dos IPs abusivos?

- por favor, não me aponte para o artigo de excelência, os exemplos deles nem estão corretos. Eles exemplificaram src_conn_cur e src_conn_rate , quando deveriam ter usado sc1_* (porque os anteriores não funcionam).

    
por w00t 18.11.2013 / 16:33

1 resposta

2

se o seu haproxy está ativo na internet (ou seja, tem IP público, não está atrás do firewall, etc) .... você pode avaliar o limite mais abaixo usando o iptables ...

iptables -I INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --set

iptables -I INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --update --seconds 60 --hitcount 10 -j DROP

para que o daemon haproxy não receba o tráfego, o que significa mais eficiência e menos carga. isso só funcionaria se o haproxy tivesse ip público (não por trás do amazon elb, por exemplo)

    
por 05.12.2013 / 23:06

Tags