Estou usando o firewalld com o back-end do iptables. Eu adicionei regras "diretas" para limitação de conexão ssh:
sudo firewall-cmd --add-port=22/tcp
sudo firewall-cmd --direct --add-rule ipv4 filter INPUT_direct 0 \
-p tcp --dport 22 \
-m state --state NEW \
-m recent --name ssh --set \
-m comment --comment "limit ssh connections per ip"
sudo firewall-cmd --direct --add-rule ipv4 filter INPUT_direct 1 \
-p tcp --dport 22 \
-m state --state NEW \
-m recent --name ssh --update --seconds 61 --hitcount 4 --rttl \
-j REJECT --reject-with tcp-reset \
-m comment --comment "limit ssh connections per ip"
# ...similarly for ipv6
Também quero registrar rejeições e descartes, então corri
$ sudo firewall-cmd --set-log-denied all
Isso funciona principalmente - quando eu verifico, sudo journalctl --since today --identifier kernel
vejo essas conexões ... mas não aquelas rejeitadas por minhas regras diretas.
No repositório, isso foi confirmado como comportamento esperado e devo adicionar mais regras diretas para registrar minhas regras diretas:
Você deve usar a extensão de log iptables, por exemplo -j LOG. ... Infelizmente, você precisará de duas regras diretas, pois o iptables não suporta -j LOG -j ACCEPT.
Como faço isso?
Descobri isso. Deve-se adicionar outra regra, idêntica à regra REJECT ou DROP, mas que salta para o destino LOG "não finalizador" .
Para ver os logs dessas conexões: