2017-01-04 3 views
0

Ich versuche jetzt ein Szenario mit haproxy zu lösen. Das Szenario, wie untenHAproxy ACL. Blockiere die gesamte Verbindung zu Haproxy Standardmäßig erlaube ich nur Specific IP

  • blockieren alle IP standardmäßig
  • Erlauben Sie nur Verbindung von einer bestimmten IP-Adresse
  • Wenn alle Verbindungen von einem whilelist IP kommen, wenn sollte ablehnen, wenn sie mehr als 10 gleichzeitige Verbindungen überschreiten 30 Sek.

Ich möchte dies tun, um die Anzahl der API-Aufrufe in meinem Server zu reduzieren. Könnte mir bitte jemand dabei helfen?

Dank

+0

Sie werden einen Versuch in diesem und uns machen müssen zeigen, wo Sie stecken bleiben. HAProxy-Konfigurationsdateien können eine gewisse "Programmierung" beinhalten, aber ich vermute, dass Sie [Serverfehler] (http://serverfault.com) für einen geeigneteren Ort als Stack Overflow für HAProxy-Fragen finden. –

Antwort

2

Die ersten beiden Dinge sind einfach, einfach nur die weiße Liste IP

acl whitelist src 10.12.12.23 
use_backend SOMESERVER if whitelist 

Die dritte erlauben - Drosselung - erfordert sind stick-tables (es verwenden viele Datentyp - Zähler anschl, sess, http, Preise ...) als Ratenzähler:

#     max entries    count request in 60s periods 
stick-table type ip size 200k expire 100s store http_req_rate(60s) 

nächstes haben Sie die Tabelle zu füllen, durch tracking each request zB. von IP

tcp-request content track-sc0 src 
# more info at http://cbonte.github.io/haproxy-dconv/1.5/configuration.html#4.2-tcp-request%20connection 

und schließlich die acl:

# is there more than 5req/1min from IP 
acl http_rate_abuse sc0_http_req_rate gt 5 

# update use_backend condition 
use_backend SOMESERVER if whitelisted !http_rate_abuse 

Zum Beispiel einige Arbeitskonfigurationsdatei mit benutzerdefinierten Fehler:

global 
    log /dev/log local1 debug 

defaults 
    log  global 
    mode http 
    option httplog 
    retries 3 
    option redispatch 
    maxconn 2000 
    contimeout  5000 
    clitimeout  50000 
    srvtimeout  50000 

frontend http 
    bind *:8181 

    stick-table type ip size 200k expire 100s store http_req_rate(60s) 
    tcp-request content track-sc0 src 

    acl whitelist src 127.0.0.1 
    acl http_rate_abuse sc0_http_req_rate gt 5 
    use_backend error401 if !whitelist 
    use_backend error429 if http_rate_abuse 
    use_backend realone 

backend realone 
    server local stackoverflow.com:80 

# too many requests 
backend error429 
    mode http 
    errorfile 503 /etc/haproxy/errors/429.http 

# unauthenticated 
backend error401 
    mode http 
    errorfile 503 /etc/haproxy/errors/401.http 

Hinweis: Die Fehlerbehandlung ist ein bisschen schwierig. Da die obigen Fehlerbackends keine Servereinträge enthalten, wird haproxy HTTP 503, errorfile abfangen und verschiedene Fehler (mit unterschiedlichen Codes) senden.

Beispiel /etc/haproxy/errors/401.http Inhalt:

HTTP/1.0 401 Unauthenticated 
Cache-Control: no-cache 
Connection: close 
Content-Type: text/html 

<html><body><h1>401 Unauthenticated</h1> 
</body></html> 

Beispiel /etc/haproxy/errors/429.http Inhalt:

HTTP/1.0 429 Too many requests 
Cache-Control: no-cache 
Connection: close 
Content-Type: text/html 

<html><body><h1>429 Too many requests</h1> 
</body></html>