Instale NGINX e Fail2ban
$ sudo apt install nginx fail2ban
2. Crie uma configuração simples do nginx que usa como proxy sua API
$ sudo nano / etc / nginx / sites-enabled / default
deletar tudo. copie cole este aqui
server {
listen 80;
listen [::]:80;
server_name _;
location /api_proxy/ {
proxy_pass http://localhost:9090/api/v1/;
proxy_buffering off;
}
}
Onde localhost: 9090 / api / v1 / é seu servidor local, node, go, java, qualquer que seja
Teste se tudo funciona chamando http: // server_ip / api_proxy /
Agora que resolvemos isso, a próxima etapa é configurá-lo
Configure o nginx com limitação de taxa
Limitação de taxa, que pode ser usada efetivamente para limitar a quantidade de solicitações que um usuário pode fazer em um determinado período de tempo.
A limitação de taxa pode ser usada para fins de segurança e pode ajudar muito a proteger nosso site contra ataques DDoS, limitando a taxa de solicitação de entrada a um valor típico para usuários reais e (com registro) identificar os URLs alvo. Agora que temos o registro, podemos criar um filtro em fail2ban, mas vamos testar a limitação de taxa primeiro.
Atualize a configuração do nginx para
limit_req_zone $request_uri zone=by_uri:10m rate=1r/s;
server {
listen 80;
listen [::]:80;
server_name _;
location /api_proxy/ {
limit_req zone=by_uri burst=5;
proxy_pass http://localhost:9090/api/v1/;
proxy_buffering off;
}
}
Teste se tudo funciona chamando http: // server_ip / api_proxy / e aperte o botão REFRESH o mais rápido possível. Você deve ter o serviço indisponível de vez em quando
Configurar fail2ban
crie um novo arquivo de filtro
nano/etc/fail2ban/filter.d/nginx-req-limit.conf
com o seguinte conteúdo:
# Fail2Ban configuration file
#
# supports: ngx_http_limit_req_module module
[Definition]
failregex = limiting requests, excess:.* by zone.*client: <HOST>
# Option: ignoreregex
# Notes.: regex to ignore. If this regex matches, the line is ignored.
# Values: TEXT #
ignoreregex =
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
e adicione o seguinte no final
[nginx-req-limit]
enabled = true
filter = nginx-req-limit
action = iptables-multiport[name=ReqLimit, port=”http,https”, protocol=tcp]
logpath = /var/log/nginx/*error.log
findtime = 600
bantime = 20
maxretry = 10
restart fail2ban $sudo service fail2ban restart
Experimente alguns testes e verifique
fail2ban-client status nginx-req-limit
Depois disso, você pode aumentar o tempo de banimento para algo como: 7200 e aumentar o número de solicitações por segundo no nginx para 10 / s (ou qualquer valor que seja adequado para você)
Parabéns! Agora, esses hackers não vão derrubar sua API.
Você economizou $ 20 por mês para o Cloudflare 🙂