Existe uma nova extensão nft_connlimit que foi adicionada desde o kernel do Linux 4.18, fornecendo uma ct count
expressão.
Para este caso, as regras equivalentes (do zero) seriam:
nft flush ruleset
nft add table ip filter
nft add chain ip filter input '{ type filter hook input priority 0; }'
nft add rule ip filter input tcp dport 22 ct count 11 counter accept
# nft add rule ip filter input tcp dport 22 counter reject with tcp reset
Algumas observações:
-
A partir de tentativa e erro, com nftables 0.9.0 / kernel 4.19.1, o connlimit
--connlimit-upto
n do iptables tem que ser traduzido emct count
n + 1 (é por isso que acima háct count 11
em vez dect count 10
) e--connlimit-above
n emct count over
n + 1 . Eu não sei se é intencional. -
Como de costume,
counter
é opcional e é usado para obter um contador comnft list ruleset
para saber quantas vezes a regra foi acionada. -
A substituição de todas as ocorrências de
ip
porip6
obterá o equivalente para IPv6. Agora, o mais interessante é usarinet
para obter uma contagem combinada de conexões SSH IPv4 e IPv6 juntas, já que elas são consideradas juntas pela conntrack. -
Eu bati meu sistema host executando o kernel 4.19.1 duas vezes enquanto brincava com esse recurso em um container para fazer essa resposta; Aconteceu ambas as vezes ao matar todos os processos ssh que baixariam para zero a contagem de conexões. O recurso pode não ser completamente estável.
UPDATE : limite por rede em vez de apenas por IP, equivalente a iptables ' --connlimit-mask
Relendo escassa documentação do patch inicial na lista de discussão netfilter-devel , ct count
não está limitado a ser usado apenas como autônomo (ou seria limitado ao exemplo acima). Ele pode ser usado em uma meter
expressão / lista para qualquer uso mais complexo.
Se alguém quiser rejeitar conexões à porta 2222 (onde algum processo está escutando) acima de 2 contagens de conexão por qualquer IP de origem aleatório / 24 de rede, esta regra deve ser usada (a partir do nft 0.9.0 / kernel 4.19.2) :
nft add rule ip filter input tcp dport 2222 meter test-2222-count-meter '{ ip saddr & 255.255.255.0 ct count over 3 }' counter reject with tcp reset
Isso criará uma lista metro chamada test-2222-count-meter
que adicionará dinamicamente os dados "map" relevantes (para cada rede diferente / 24 que tenha correspondido a uma conexão). Não tenho certeza se os dados obsoletos (isto é, / 24 redes que não possuem mais nenhuma conexão) são removidos através da coleta de lixo ou não do kernel 4.19.2.
O conteúdo do medidor pode ser listado (ele não mostrará a contagem atingida, apenas os "mapas" adicionados dinamicamente quando novas redes forem vistas). Por exemplo, depois de algumas conexões de 10.0.3.1
, 10.0.3.66
, 10.0.4.5
e 172.31.4.5
:
# nft list meter ip filter test-2222-count-meter
table ip filter {
meter test-2222-count-meter {
type ipv4_addr
size 65535
elements = { 10.0.3.0 : ct count over 3 , 10.0.4.0 : ct count over 3 , 172.31.4.0 : ct count over 3 }
}
}
Mais uma vez, a partir do kernel 4.19.2, o uso deste recurso (juntamente com namespaces de rede?) não parece estável ainda, todo o kernel pode travar facilmente.