Docker - Traefik - Ratelimiting

Page content

docker-compose.yml

let’s limit the Requests to 10 Req / 10 Seconds.

  whoami:
    image: containous/whoami
    labels:
      - "traefik.enable=true"
      - "traefik.http.middlewares.test-ratelimit.ratelimit.average=10"
      - "traefik.http.middlewares.test-ratelimit.ratelimit.burst=0"
      - "traefik.http.middlewares.test-ratelimit.ratelimit.period=10s"
      - "traefik.http.routers.whoami.middlewares=test-ratelimit@docker"
      - "traefik.http.routers.whoami.rule=Host(`whoami.your.domain.de`)"
      - "traefik.http.routers.whoami.tls.certresolver=letsencrypt"
      - "traefik.http.routers.whoami.tls=true"

restart container

docker compose -f docker-compose.yml up -d

Test Limiting with Curl

user@docker:~$ while true; do echo $(date); curl -s https://whoami.your.domain.de |grep "Too" ; sleep 0.1; done
Wed Oct 12 18:43:57 CEST 2022
Too Many Requests
Wed Oct 12 18:43:58 CEST 2022
Too Many Requests
Wed Oct 12 18:43:58 CEST 2022
Too Many Requests

Test Limit with hey, 10 Concurrent

100 Requests, 10 Concurrent, Wait 1 Second between Poll

hey -n 100 -c 10 -q 1 https://whoami.your.domain.de
...
Status code distribution:
  [200] 10 responses
  [429] 90 responses
...

Test Limit with hey, 5 Concurrent

100 Requests, 5 Concurrent, Wait 1 Second between Poll

hey -n 100 -c 5 -q 1 https://whoami.your.domain.de
...
Status code distribution:
  [200] 20 responses
  [429] 80 responses
...

Test Limit with hey, 2 Concurrent

100 Requests, 2 Concurrent, Wait 1 Second between Poll

hey -n 100 -c 2 -q 1 https://whoami.your.domain.de
...
Status code distribution:
  [200] 50 responses
  [429] 50 responses
...

Test Limit with hey, 1 Concurrent

100 Requests, 2 Concurrent, Wait 1 Second between Poll

hey -n 100 -c 1 -q 1 https://whoami.your.domain.de
...
Status code distribution:
  [200] 100 responses
...

Aggressively Rate Limit Login Page

if you wanna protect a (wordpress) login page, you could limit the it to 5 Logins / Minute with the following lines:

- traefik.http.routers.wordpress-login.rule=Host(`wordpress.your.domain.de`) && PathPrefix(`/wp-login.php`) && Method(`POST`)
- traefik.http.middlewares.wordpress-login-ratelimit.ratelimit.average=5
- traefik.http.middlewares.wordpress-login-ratelimit.ratelimit.burst=1
- traefik.http.middlewares.wordpress-login-ratelimit.ratelimit.period=1m
- traefik.http.routers.wordpress-login.middlewares=wordpress-login-ratelimit@docker

Any Comments ?

sha256: 073e5b3bc5d70488164877c460b31e0baabdb48452f4e37b19195e0b81351b58