Como você define um limite de conexão máximo com nftables?

3

Eu estou olhando para limitar o número de conexões simultâneas para um determinado serviço em execução em um servidor Linux. Meu entendimento é que isso pode ser feito em iptables usando o módulo connlimit . Por exemplo, se eu quisesse limitar as conexões simultâneas ao meu servidor SSH (e supondo que a política padrão fosse rejeitada), isso deve permitir 10 conexões simultâneas, com o 11º sendo rejeitado (gravado da memória):

iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-upto 10 -j ACCEPT

A coisa está nos novos servidores que estou construindo Eu quero implementar o firewall usando nftables . Embora eu possa encontrar connlimit mencionado na página man, ele simplesmente indica consider native interface. Refer to Meters . Tendo pesquisado sobre Meters, embora pareça incrível para limitar a taxa, não consigo encontrar nada que sugira que eu possa fazer o equivalente de connlimit .

Então, dado que eu quero usar nftables , como criar uma regra que corresponda apenas a X conexões simultâneas?

    
por PeterM 05.10.2018 / 06:48

1 resposta

1

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 em ct count n + 1 (é por isso que acima há ct count 11 em vez de ct count 10 ) e --connlimit-above n em ct count over n + 1 . Eu não sei se é intencional.

  • Como de costume, counter é opcional e é usado para obter um contador com nft list ruleset para saber quantas vezes a regra foi acionada.

  • A substituição de todas as ocorrências de ip por ip6 obterá o equivalente para IPv6. Agora, o mais interessante é usar inet 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.

    
por 14.11.2018 / 00:54