Saudações,
Recentemente ao verificar os logs de um servidor web, eu notei uma quantidade excessiva de erros 403 e 404.
Na verdade o erro 403 até que não tinha muito. Era um forbidden aqui e ali; algo esperado.
Já o erro 404... rapaz... parece que os robôs estavam no modo gera url aleatoriamente e testa!
Ignorando IP no Fail2ban com base da geolocalização
Acessando o servidor, eu abri o arquivo jail.local e editei a seção apache-40x...
#vim jail.local
...
[apache-40x]
enabled = true
port = http,https
filter = apache-40x
logpath = /var/log/apache2/other_vhosts_access.log
maxretry = 3
bantime = 300
ignorecache = key="<ip>", max-count=50, max-time=10m
ignorecommand = if echo "<ip>" | grep -qE '^([0-9a-fA-F:]{2,}|::1)$'; then geoiplookup6 "<ip>"; else geoiplookup "<ip>"; fi | egrep "BR|Brazil" && exit 0 || exit 1
...
Salvei o arquivo e reiniciei o Fail2ban. Acessei o site do cliente e ao testar um endereço inexistente os logs do Failban exibiu um "... INFO [apache-40x] Found 1xx.xxx.xxx.xx7 ...".
Oxi... não esperava isto! Deveria ser outra mensagem. Isto indica que o comandop geoiplookup (pacote geoip-bin) consultou meu IP mas não retornou informações relacionadas ao Brasil.
De fato, executando o comando geoiplookup 1xx.xxx.xxx.xx7 o resultado trazia informações referente a Costa Rica.
Fiz um apt update, um apt upgrade e rodei o geoiplookup mas a mensagem sobre meu IP não mudava. Este servidor roda o Ubuntu 22.04 LTS e o pacote que precisa ser atualizado é o geoip-database. Mas infelizmente não há atualização disponível para o geoip-database.
Bem, hora de colocar a "mão na massa" e atualizar a base de geolocalização manualmente.
Eu acessei o site do mantenedor das bases de dados em mailfud.org/geoip-legacy, e depois baixei o arquivo GeoIP.dat.gz e o GeoIPv6.dat.gz...
It's enough to download these once a week. Unpack to /usr/share/GeoIP or equivalent directory.
Depois descompactei o conteúdo dos arquivos no diretório /usr/share/GeoIP...
A essa altura eu acredito que você já deve ter pensado: vou colocar um script na agenda do sistema para baixar com o wget ou curl, e descompactar com gunzip os arquivos. #FicaADica 😀
Agora ao executar o comando geoiplookup 1xx.xxx.xxx.xx7 obtenho exatamente a saída que espero...
Retornando o teste com o Fail2ban, ao tentar acessar uma pagina inexistente no site do cliente, o log mostra a mensagem: "... INFO [apache-40x] Ignore 1xx.xxx.xxx.xx7 by command ...".
Show! Esta era a mensagem que esperava.
Agora o servidor do cliente reduziu a carga pois não tem que ficar dando tantas respostas 404.
Talvez você esteva se perguntando sobre a diretiva ignorecommand. Ela funciona assim:
- O IP casa com o filtro apache-40x.
- A seção apache-40x é processada e o ignorecommand executa o comando 'if echo "<ip>" ... exit 0 || exit 1'.
- O IP não será bloqueado se o comando for executado com sucesso (exit code 0).
Nesta situação eu use o ignorecache e o ignorecommand apenas para um filtro. Mas você também pode usar globalmente se desejar. Assim todos os filtros irão ignorar os IPs de um ou mais países; sua configuração é quem dita as regras.
Paz a todos!



