Se você chegou até aqui, é por ter se cansado de assistir script kiddie tentando brute force em seu servidor com sshd rodando e isso poluindo os logs dele.
A boa noticia é que o NetBSD possuí pré-instalado uma solução para ajudar lidar com essa situação que é mais conveniente que o famoso fail2ban: o blocklistd.
O blocklistd é um daemon que tem apenas uma função na vida: monitorar o número de tentativas falhas de conexão com outro serviço rodando no sistema. Após um certo número de falhas, ele bloqueia a conexão com o serviço antes da requisição chegar até ele por um tempo, por exemplo, 6 horas.
Configurar o npf (firewall)
O primeiro passo é configurar o firewall do NetBSD caso ele já não esteja:
NBSDCore# cp /usr/share/examples/blocklist/npf.conf /etc/npf.conf
NBSDCore# ifconfig npflog0 create
NBSDCore# echo create > /etc/ifconfig.npflog0
Edite o arquivo /etc/npf.conf apontando a variável $ext_if no começo do arquivo para sua interface de rede que esteja sendo utilizada para conexão com a internet.
Agora verifique quais módulos necessários estão carregados pelo kernel:
NBSDCore# modstat | egrep "npf|jit"
if_npflog driver builtin - 0 - -
npf misc builtin - 4 - bpf
npf_alg_icmp misc builtin - 0 - npf
npf_ext_log misc builtin - 0 - npf
npf_ext_normalize misc builtin - 0 - npf
npf_ext_rndblock misc builtin - 0 - npf
O normal é o npf, responsável pelo firewall no NetBSD, já estar carregado. Nesse caso se torna necessário apenas a carga do bpfjit e dizer ao sistema para carregar no boot do sistema ao reiniciar, junto de alguns ajustes no sysctl:
NBSDCore# modload bpfjit
NBSDCore# echo bpfjit >> /etc/modules
NBSDCore# echo modules=yes >> /etc/rc.conf
NBSDCore# sysctl -w net.bpf.jit=1
net.bpf.jit: 0 -> 1
NBSDCore# sysctl -w net.bpf.maxbufsize=4194304
net.bpf.maxbufsize: 1048576 -> 4194304
NBSDCore# echo net.bpf.jit=1 >> /etc/sysctl.conf
NBSDCore# echo net.bpf.maxbufsize=4194304 >> /etc/sysctl.conf
Configurar o blocklistd
Vamos começar também copiando o arquivo de configuração de exemplo fornecido pelo sistema
NBSDCore# cp /usr/share/examples/blocklist/blocklistd.conf /etc/blocklistd.conf
Edite o arquivo /etc/blocklistd.conf para adicionar ou retirar serviços que devem ser monitorados. A sintaxe é simples, onde [local] é a lista de bloqueio e o [remote] é a lista de permitidos sempre.
# Blocklist rule
# adr/mask:port type proto owner name nfail disable
[local]
ssh stream * * * 3 6h
ftp stream * * * 3 6h
domain * * named * 3 12h
#6161 stream tcp6 christos * 2 10m
* * * * * 3 60
# adr/mask:port type proto owner name nfail disable
[remote]
#129.168.0.0/16 * * * = * *
#[2001:db8::]/32:ssh * * * = * *
#6161 = = = =/24 = =
#* stream tcp * = = =
Após isso, inicie os serviços e adicione eles na inicialização do sistema:
NBSDCore# service npfd onestart
Starting npfd...
NBSDCore# service npf onestart
Enabling NPF /etc/npf.conf
NBSDCore# service blocklistd onestart
Starting blocklistd.
NBSDCore# echo npf=yes >> /etc/rc.conf
NBSDCore# echo npfd=yes >> /etc/rc.conf
NBSDCore# echo blocklistd=yes >> /etc/rc.conf
NBSDCore# echo blocklistd_flags=-r >> /etc/rc.conf
Se tudo ocorreu corretamente, a regra do blocklistd já deve estar disponível no firewall:
NBSDCore# npfctl show
# filtering: inactive
# config: loaded
group "external" on eth0 { # id="1"
ruleset "blocklistd" # id="2"
pass final all # id="3"
}
group default { # id="4"
pass final all # id="5"
}
Reinicie cada um dos serviços que foram adicionados no /etc/blocklistd.conf e então ordene o firewall para começar processar suas regras caso ele esteja inativo:
NBSDCore# service sshd restart
Stopping sshd.
Starting sshd.
NBSDCore# npfctl start
Caso seu servidor já esteja recebendo tentativas de conexão, seu blocklist já deve ter começado criar uma lista de bloqueados:
NBSDCore# blocklistctl dump -a
address/ma:port id nfail last access
193.32.162.94/32:22 2/3 2024/06/28 03:42:07
85.209.11.27/32:22 2/3 2024/06/28 03:48:57
92.118.39.133/32:22 1 4/3 2024/06/28 03:47:42
E com isso, seus logs ficarão muito mais limpos. Tirar o sshd de sua porta padrão também ajuda, pois essa forma de ataque é automatizada usualmente.