Lançamento do filtro de pacotes nftables 0.9.5

Publicado lançamento do filtro de pacotes nftables 0.9.5, que está se desenvolvendo como uma substituição ao iptables, ip6tables, arptables e ebtables, por meio da unificação das interfaces de filtragem de pacotes para IPv4, IPv6, ARP e pontes de rede. O pacote nftables inclui componentes do filtro de pacotes que operam no espaço do usuário, enquanto a função no nível do kernel é garantida pela subsistema nf_tables, incluído no núcleo do Linux desde a versão 3.13. As alterações necessárias para o funcionamento da versão nftables 0.9.5 estão incluídas no núcleo Linux 5.7.

No nível do kernel, é fornecida apenas uma interface genérica, independente do protocolo específico e que oferece funções básicas de extração de dados de pacotes, execução de operações de dados e controle de fluxo. As regras de filtragem e os manipuladores específicos de protocolo são compilados em bytecode no espaço do usuário, após o que esse bytecode é carregado no kernel por meio da interface Netlink e executado no kernel em uma máquina virtual especial, semelhante ao BPF (Berkeley Packet Filters). Essa abordagem permite reduzir significativamente o tamanho do código de filtragem que opera no nível do kernel e transferir todas as funções de análise de regras e lógica de manipulação de protocolos para o espaço do usuário.

Principais novidades:

  • Os conjuntos adicionaram suporte para contadores de pacotes e tráfego, vinculados a elementos do conjunto. Os contadores são ativados usando a palavra-chave "counter":

    table ip x {
    set y {
    typeof ip saddr
    counter
    elements = { 192.168.10.35, 192.168.10.101, 192.168.10.135 }
    }

    chain z {
    type filter hook output priority filter; policy accept;
    ip daddr @y
    }
    }

  • Para definir valores iniciais para os contadores, por exemplo, para restaurar contadores anteriores após uma reinicialização, pode-se usar o comando "nft -f":

    # cat ruleset.nft
    table ip x {
    set y {
    typeof ip saddr
    counter
    elements = { 192.168.10.35 counter packets 1 bytes 84, 192.168.10.101 \
    counter p 192.168.10.135 counter packets 0 bytes 0 }
    }

    chain z {
    type filter hook output priority filter; policy accept;
    ip daddr @y
    }
    }
    # nft -f ruleset.nft
    # nft list ruleset
    table ip x {
    set y {
    typeof ip saddr
    counter
    elements = { 192.168.10.35 counter packets 1 bytes 84, 192.168.10.101 \
    counter p 192.168.10.135 counter packets 0 bytes 0 }
    }

    chain z {
    type filter hook output priority filter; policy accept;
    ip daddr @y
    }
    }

  • O suporte a contadores também foi adicionado ao flowtable:

    table ip foo {
    flowtable bar {
    hook ingress priority -100
    devices = { eth0, eth1 }
    counter
    }

    chain forward {
    type filter hook forward priority filter;
    flow add @bar counter
    }
    }

    Para visualizar a lista de contadores, pode-se usar o comando "conntrack -L":

    tcp 6 src=192.168.10.2 dst=10.0.1.2 sport=47278 dport=5201 packets=9 bytes=608 \
    src=10.0.1.2 dst=10.0.1.1 sport=5201 dport=47278 packets=8 bytes=428 [OFFLOAD] mark=0 \
    secctx=null use=2 tcp 6 src=192.168.10.2 dst=10.0.1.2 sport=47280 dport=5201 \
    packets=1005763 bytes=44075714753 src=10.0.1.2 dst=10.0.1.1 sport=5201 dport=47280 \
    packets=967505 bytes=50310268 [OFFLOAD] mark=0 secctx=null use=2

  • Nos conjuntos de conexões (concatenation, certos vínculos de endereços e portas que facilitam a correspondência) foi possível utilizar a diretiva "typeof", que determina o tipo de dados dos elementos das partes dos conjuntos:

    table ip foo {
    set whitelist {
    typeof ip saddr . tcp dport
    elements = { 192.168.10.35 . 80, 192.168.10.101 . 80 }
    }

    chain bar {
    type filter hook prerouting priority filter; policy drop;
    ip daddr . tcp dport @whitelist accept
    }
    }

  • A diretiva typeof agora também é aplicável a conexões em listas map:

    table ip foo {
    map addr2mark {
    typeof ip saddr . tcp dport : meta mark
    elements = { 192.168.10.35 . 80 : 0x00000001,
    192.168.10.135 . 80 : 0x00000002 }
    }

    chain bar {
    type filter hook prerouting priority filter; policy drop;
    meta mark set ip daddr . tcp dport map @addr2mark accept
    }
    }

  • Adicionada suporte a conexões com intervalos em conjuntos anônimos (não nomeados):

    # nft add rule inet filter input ip daddr . tcp dport \
    { 10.0.0.0/8 . 10-23, 192.168.1.1-192.168.3.8 . 80-443 } accept

  • Implementada a possibilidade de descartar pacotes com flags 802.1q (VLAN) ao processar pontes de rede:

    # nft add rule bridge foo bar ether type vlan reject with tcp reset

  • Adicionada suporte à correspondência pelo identificador de sessão TCP (conntrack ID). Para determinar o conntrack ID, pode-se usar a opção "—output id":

    # conntrack -L —output id
    udp 17 18 src=192.168.2.118 dst=192.168.2.1 sport=36424 dport=53 packets=2 \
    bytes=122 src=192.168.2.1 dst=192.168.2.118 sport=53 dport=36424 packets=2 bytes=320 \
    [ASSURED] mark=0 use=1 id=2779986232

    # nft add rule foo bar ct id 2779986232 counter

Fonte: opennet.ru

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster