Ratelimit là một công cụ cho phép người dùng hạn chế số lượng kết nối đồng thời từ 1 IP, 1 URL của websie tại một thời điểm nhất định, trong bài này mình sẽ hướng dẫn triển khai ratelimit trên caddy server để mọi người hạn chế ddos, và flood http được một phần
Trong phần cài đặt ban đầu mình đã cài mặc định một công cụ ratelimit nếu bạn chưa xem hãy đọc tại đây
Bây giờ chúng ta cần phải cấu hình nó thì mặc định phần mềm hỗ trợ những loại query hạn chế như sau:
| path.<var> | Giá trị hạn chế tính theo patch truy cập |
| query.<var> | Giá trị hạn chế tính theo query ID GET http |
| header.<var> | Giá trị hạn chế tính theo giá trị header |
| cookie.<var> | Giá trị hạn chế tính theo cookie |
| body.<var> | Giá trị hạn chế tính theo body Post Http |
| remote.host | Giá trị hạn chế tính theo host |
| remote.port | Giá trị hạn chế tính theo Port truy cập |
| remote.ip | Giá trị hạn chế tính theo IP client |
| remote.host_prefix.<bits> | Giá trị hạn chế tính theo host range |
| remote.ip_prefix.<bits> | Giá trị hạn chế tính theo IP range |
Mặc định một cấu hình nó sẽ trông như sau trong caddy file
localhost:8080 {
route /foo {
rate_limit {query.id} 2r/m
respond 200
}
}
chúng ta có thể thay thế nó thành nhưng giá trị chúng ta mong muốn, trong ví dụ cơ bản trên thì có nghĩa là rate limit đã được cài đặt giới hạn theo query id mỗi một ID chỉ được call 2 request trong 1 phút nếu quá sẽ bị chặn
ở đây mình test khi chưa giới hạn, việc call hoàn toàn thoải mái

Giờ mình sẽ giới hạn lại

{
order coraza_waf first
}
caddy.manhtuong.net {
coraza_waf {
include /etc/caddy/waf/config.conf
include /etc/caddy/waf/whitelist.conf
include /etc/caddy/waf/coreruleset/crs-setup.conf.example
include /etc/caddy/waf/coreruleset/rules/*.conf
}
route /foo {
rate_limit {query.id} 2r/m
}
root * /home/caddy/web
php_fastcgi unix//run/php/php7.4-fpm.sock
file_server
log {
output file /home/caddy/caddy.manhtuong.net.log
}
}Lưu ý khi dùng query như mình thì nó giới hạn theo query name mỗi một query name sẽ được gọi tối đa 2 request 1 phút, bạn thay query name thì lại dùng bình thường, trong ví dụ trên id=1 thì đang bị chặn nhưng mình vào id=2 thì nó sẽ bình thường.
Bạn có thể thay thế giá trị {query.id} thành các giá trị khác trong bảng phía trên, nếu bạn muốn áp cho toàn trang thì dùng cấu hình bên dưới
{
order coraza_waf first
}
caddy.manhtuong.net {
coraza_waf {
include /etc/caddy/waf/config.conf
include /etc/caddy/waf/whitelist.conf
include /etc/caddy/waf/coreruleset/crs-setup.conf.example
include /etc/caddy/waf/coreruleset/rules/*.conf
}
route /foo {
rate_limit {query.id} 200r/s
}
root * /home/caddy/web
php_fastcgi unix//run/php/php7.4-fpm.sock
file_server
log {
output file /home/caddy/caddy.manhtuong.net.log
}
}Nếu bạn muốn giới hạn theo body var thì dùng cấu hình bên dưới, ở đây mình dùng giá trị var chính là http post parameters để làm limit rate
{
order coraza_waf first
}
caddy.manhtuong.net {
coraza_waf {
include /etc/caddy/waf/config.conf
include /etc/caddy/waf/whitelist.conf
include /etc/caddy/waf/coreruleset/crs-setup.conf.example
include /etc/caddy/waf/coreruleset/rules/*.conf
}
route /foo {
rate_limit {body.id} 200r/s
}
}
root * /home/caddy/web
php_fastcgi unix//run/php/php7.4-fpm.sock
file_server
log {
output file /home/caddy/caddy.manhtuong.net.log
}
}Các bạn lưu ý giá trị rate_limit có thể được tính là r/m (request / phút) r/s (request / giây) tùy từng web mà các bạn điều chỉnh cho phú hợp trong ví dụ của mình thì mình để nó là 200 request trong 1 giây nếu quá số lượng đó thì sẽ block trả về lỗi 429 cho user.