Выпуск пакетнага фільтра nftables 0.9.1

Пасля года распрацоўкі прадстаўлены рэліз пакетнага фільтра nftables 0.9.1, Які развіваецца ў якасці замены iptables, ip6table, arptables і ebtables за кошт уніфікацыі інтэрфейсаў фільтрацыі пакетаў для IPv4, IPv6, ARP і сеткавых мастоў. У пакет nftables уваходзяць кампаненты пакетнага фільтра, якія працуюць у прасторы карыстача, у той час як на ўзроўні ядра працу забяспечвае падсістэма nf_tables, уваходная ў склад ядра Linux пачынальна з выпуску 3.13.

На ўзроўні ядра падаецца толькі агульны інтэрфейс, які не залежыць ад канкрэтнага пратакола і які прадстаўляе базавыя функцыі вымання дадзеных з пакетаў, выкананні аперацый з дадзенымі і кіраванні струменем.
Непасрэдна логіка фільтрацыі і спецыфічныя для пратаколаў апрацоўшчыкі кампілююцца ў байткод у прасторы карыстача, пасля чаго дадзены байткод загружаецца ў ядро ​​пры дапамозе інтэрфейсу Netlink і выконваецца ў адмысловай віртуальнай машыне, якая нагадвае BPF (Berkeley Packet Filters). Падобны падыход дазваляе значна скараціць памер кода фільтрацыі, які працуе на ўзроўні ядра і вынесці ўсе функцыі разбору правіл і логікі працы з пратаколамі ў прастору карыстача.

Асноўныя навіны:

  • Падтрымка IPsec, якая дазваляе выконваць супастаўленне адрасоў тунэляў у прывязцы да пакета, ідэнтыфікатару запыту IPsec і тэгу SPI (Security Parameter Index). Напрыклад,

    … ipsec in ip saddr 192.168.1.0/24
    … ipsec in spi 1-65536

    Таксама магчыма праверка праходжання маршруту праз тунэль IPsec. Напрыклад, для блакавання трафіку не праз IPSec:

    … filter output rt ipsec missing drop

  • Падтрымка пратакола IGMP (Internet Group Management Protocol). Напрыклад, для адкідвання ўваходных IGMP-запытаў прыналежнасці да групы можна выкарыстоўваць правіла

    nft add rule netdev foo bar igmp typ membership-query counter drop

  • Магчымасць выкарыстання зменных для вызначэння ланцужкоў пераходу (jump/goto). Напрыклад:

    define dest = ber
    add rule ip foo bar jump $dest

  • Падтрымка масак для ідэнтыфікацыі аперацыйных сістэм (OS Fingerprint) на аснове значэнняў TTL у загалоўку. Напрыклад, для пазнакі пакетаў у залежнасці ад АС адпраўніка можна выкарыстоўваць каманду:

    … meta mark set osf ttl skip name map { "Linux": 0x1,
    "Windows": 0x2,
    MacOS : 0x3,
    "unknown" : 0x0 }
    … osf ttl skip version "Linux:4.20"

  • Магчымасць супастаўлення ARP-адрасы адпраўніка і IPv4-адрасы мэтавай сістэмы. Напрыклад, для павелічэння лічыльніка ARP-пакетаў, адпраўленых з адраса 192.168.2.1 можна выкарыстоўваць правіла:

    table arp x {
    chain y {
    type filter hook input priority filter; policy accept;
    arp saddr ip 192.168.2.1 counter packets 1 bytes 46
    }
    }

  • Падтрымка празрыстага пракіду запытаў праз проксі (tproxy). Напрыклад, для перанакіравання зваротаў да 80 порта на порт проксі 8080:

    table ip x {
    chain y {
    type filter hook prerouting priority -150; policy accept;
    tcp dport 80 tproxy to :8080
    }
    }

  • Падтрымка пазнакі сокетаў з магчымасцю далейшага атрымання ўсталяванай пазнакі праз setsockopt() у рэжыме SO_MARK. Напрыклад:

    table inet x {
    chain y {
    type filter hook prerouting priority -150; policy accept;
    tcp dport 8080 mark set socket mark
    }
    }

  • Падтрымка ўказання тэкставых найменняў прыярытэтаў для ланцужкоў. Напрыклад:

    nft add chain ip x raw { filter hook typ prerouting priority raw; }
    nft add chain ip x filter { type filter hook prerouting priority filter; }
    nft add chain ip x filter_later { type filter hook prerouting priority filter + 10; }

  • Падтрымка пазнак SELinux (Secmark). Напрыклад, для вызначэння пазнакі "sshtag" у прывязцы да кантэксту SELinux можна запусціць:

    nft add secmark inet filter sshtag "system_u:object_r:ssh_server_packet_t:s0"

    А затым выкарыстоўваць гэтую пазнаку ў правілах:

    nft add rule inet filter input tcp dport 22 meta secmark set "sshtag"

    nft add map inet filter secmapping { type inet_service : secmark; }
    nft add element inet filter secmapping { 22 : "sshtag" }
    nft add rule inet filter input meta secmark set tcp dport map @secmapping

  • Магчымасць указання замацаваных за пратаколамі партоў у тэкставым выглядзе, як яны вызначаны ў файле /etc/services. Напрыклад:

    nft add rule xy tcp dport "ssh"
    nft list ruleset -l
    table x {
    chain y {
    ...
    tcp dport "ssh"
    }
    }

  • Магчымасць праверкі тыпу сеткавага інтэрфейсу. Напрыклад:

    add rule inet raw prerouting meta iifkind "vrf" accept

  • Палепшана падтрымка дынамічнага абнаўлення змесціва набораў (sets) праз відавочнае ўказанне сцяга "dynamic". Напрыклад, для абнаўлення набору "s" з даданнем зыходнага адраса і скідам запісу ў выпадку адсутнасці пакетаў на працягу 30 секунд:

    add table x
    add set xs { type ipv4_addr; size 128; timeout 30s; flags dynamic; }
    add chain xy { type filter hook input priority 0; }
    add rule xy update @s { ip saddr }

  • Магчымасць задання асобнай умовы наступлення таймаўту. Напрыклад, для пераазначэння таймаўту па змаўчанні для пактаў, якія прыйшлі на порт 8888 можна паказаць:

    table ip filter {
    ct timeout agressive-tcp {
    protocol tcp;
    l3proto ip;
    policy = {established: 100, close_wait: 4, close: 4}
    }
    выхад ланцужка {
    ...
    tcp dport 8888 ct timeout set "agressive-tcp"
    }
    }

  • Падтрымка NAT для сямейства inet:

    табліца inet nat {
    ...
    ip6 daddr dead::2::1 dnat to dead:2::99
    }

  • Палепшаныя сродкі вываду інфармацыі пра памылкі з-за памылак друку:

    nft add chain filtre test

    Error: Няма such file або directory; did you mean table 'filter' in family ip?
    add chain filtre test
    ^^^^^^

  • Магчымасць указання імёнаў інтэрфейсаў у наборах (sets):

    set sc {
    type inet_service. ifname
    elements = {«ssh». "eth0"}
    }

  • Абноўлены сінтаксіс правілаў flowtable:

    nft add table x
    nft add flowtable x ft {hook ingress priority 0; devices = { eth0, wlan0 }; }
    ...
    nft add шлях x forward ip protocol {tcp, udp} flow add @ft

  • Палепшана падтрымка JSON.

Крыніца: opennet.ru

Дадаць каментар