nftables пакет филтер 0.9.1 ослободување

По една година развој презентирани ослободување на пакет филтер nftables 0.9.1, развивајќи се како замена за iptables, ip6table, arptables и ebtables со обединување на интерфејси за филтрирање пакети за IPv4, IPv6, ARP и мрежни мостови. Пакетот nftables вклучува компоненти за филтер за пакети кои работат во корисничкиот простор, додека работата на ниво на јадрото е обезбедена од потсистемот nf_tables, кој е дел од кернелот Линукс од објавувањето 3.13.

Нивото на јадрото обезбедува само генерички интерфејс независен од протокол кој обезбедува основни функции за извлекување податоци од пакети, извршување на операции со податоци и контрола на протокот.
Самата логика на филтрирање и ракувачите специфични за протоколот се компајлираат во бајтекод во корисничкиот простор, по што овој бајтекод се вчитува во кернелот со помош на интерфејсот Netlink и се извршува во специјална виртуелна машина која потсетува на BPF (Berkeley Packet Filters). Овој пристап ви овозможува значително да ја намалите големината на кодот за филтрирање што работи на ниво на јадрото и да ги преместите сите функции на правилата за парсирање и логиката за работа со протоколи во корисничкиот простор.

Главните иновации:

  • Поддршка за IPsec, овозможувајќи совпаѓање на адреси на тунел врз основа на пакет, ID на барање IPsec и ознака SPI (индекс на безбедносни параметри). На пример,

    ... ipsec во ip saddr 192.168.1.0/24
    ... ipsec во spi 1-65536

    Исто така, можно е да се провери дали рутата минува низ IPsec тунел. На пример, да го блокирате сообраќајот не преку IPSec:

    … излезот на филтерот rt ipsec недостасува пад

  • Поддршка за IGMP (Internet Group Management Protocol). На пример, можете да користите правило за да ги отфрлите дојдовните барања за членство во групата IGMP

    nft додадете правило netdev foo bar igmp тип членство-query counter drop

  • Можност за користење на променливи за дефинирање на транзициски синџири (скок / гото). На пример:

    дефинирај дест = бер
    додадете правило ip foo бар скок $dest

  • Поддршка за маски за идентификување на оперативните системи (ОС отпечаток од прст) врз основа на вредностите на TTL во заглавието. На пример, за означување на пакети врз основа на оперативниот систем на испраќачот, можете да ја користите командата:

    ... сет на мета ознаки osf ttl прескокнете ја мапата на името { "Linux" : 0x1
    „Windows“: 0x2,
    „MacOS“: 0x3,
    "непознат" : 0x0 }
    ... osf ttl прескокнете ја верзијата "Linux: 4.20"

  • Способност да се совпадне со ARP адресата на испраќачот и IPv4 адресата на целниот систем. На пример, за да го зголемите бројачот на ARP пакети испратени од адресата 192.168.2.1, можете да го користите следново правило:

    табела arp x {
    синџир y {
    тип филтер кука за влез приоритетен филтер; политика прифати;
    arp saddr ip 192.168.2.1 бројачки пакети 1 бајти 46
    }
    }

  • Поддршка за транспарентно проследување на барања преку прокси (tproxy). На пример, за да ги пренасочите повиците до портата 80 до портата за прокси 8080:

    табела ip x {
    синџир y {
    тип приоритет на предрутирање на куката за филтер -150; политика прифати;
    tcp dport 80 tпрокси до :8080
    }
    }

  • Поддршка за означување сокети со можност за дополнително добивање на ознаката за поставување преку setsockopt() во режимот SO_MARK. На пример:

    табела inet x {
    синџир y {
    тип приоритет на предрутирање на куката за филтер -150; политика прифати;
    tcp dport 8080 ознака за сокет ознака
    }
    }

  • Поддршка за одредување приоритетни текстуални имиња за синџири. На пример:

    nft add chain ip x raw { type filter hook prerouting priority raw; }
    nft add chain ip x filter { type filter hook prerouting priority filter; }
    nft додадете синџир ip x filter_later { тип филтер кука за приоритетен филтер за прерутирање + 10; }

  • Поддршка за ознаки SELinux (Secmark). На пример, за да ја дефинирате ознаката „sshtag“ во контекст на SELinux, можете да извршите:

    nft додадете secmark inet filter sshtag „system_u:object_r:ssh_server_packet_t:s0“

    И тогаш користете ја оваа ознака во правилата:

    nft додадете правило inet филтер влез tcp dport 22 мета секмарк сет „sshtag“

    nft додадете карта inet филтер секмапирање { тип inet_service : secmark; }
    nft додадете елемент inet filter secmapping { 22 : "sshtag" }
    nft додадете правило inet филтер влез мета secmark set tcp dport map @secmapping

  • Способност да се специфицираат порти доделени на протоколи во текстуална форма, како што се дефинирани во датотеката /etc/services. На пример:

    nft додадете правило xy tcp dport „ssh“
    nft листа правила -l
    табела x {
    синџир y {
    ...
    tcp dport "ssh"
    }
    }

  • Способност да се провери типот на мрежниот интерфејс. На пример:

    додадете правило inet raw prerouting meta iifkind "vrf" прифати

  • Подобрена поддршка за динамичко ажурирање на содржината на множествата со експлицитно специфицирање на „динамичкото“ знаменце. На пример, за ажурирање поставете „s“ за додавање на изворната адреса и ресетирање на записот ако нема пакети 30 секунди:

    додадете табела x
    додај сет xs { тип ipv4_addr; големина 128; тајмаут 30-ти; динамични знамиња; }
    додадете синџир xy { тип филтер кука влез приоритет 0; }
    додај правило xy ажурирање @s { ip saddr }

  • Способност да се постави посебен услов за истек на време. На пример, за да го отфрлите стандардниот истек на време за пакетите што пристигнуваат на портата 8888, можете да наведете:

    филтер за IP на табелата {
    ct timeout aggressive-tcp {
    протокол tcp;
    l3proto ip;
    политика = {воспоставено: 100, затвори_чекај: 4, затвори: 4}
    }
    синџир излез {
    ...
    tcp dport 8888 ct тајмут сет „aggressive-tcp“
    }
    }

  • NAT поддршка за инет семејство:

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

  • Подобрено известување за печатна грешка:

    nft тест за филтер за додавање синџир

    Грешка: Нема таква датотека или директориум; дали мислеше на табела „филтер“ во фамилијарната ип?
    тест за филтер за додавање синџир
    ^^^^^^

  • Способност да се специфицираат имиња на интерфејси во множества:

    постави sc {
    напишете inet_service. ако име
    елементи = { "ssh" . "eth0"}
    }

  • Ажурирана синтакса на правилата на табелата за текови:

    nft додадете табела x
    nft add flowtable x ft {приоритет за влез на кука 0; уреди = { eth0, wlan0 }; }
    ...
    nft додадете правило x напред ip протокол { tcp, udp } flow add @ft

  • Подобрена поддршка за JSON.

Извор: opennet.ru

Додадете коментар