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.