nftables packet filter 0.9.1 release

Μετά από ένα χρόνο ανάπτυξης παρουσιάζονται απελευθέρωση φίλτρου πακέτου nftables 0.9.1, развивающегося в качестве замены iptables, ip6table, arptables и ebtables за счёт унификации интерфейсов фильтрации пакетов для IPv4, IPv6, ARP и сетевых мостов. В пакет nftables входят компоненты пакетного фильтра, работающие в пространстве пользователя, в то время как на уровне ядра работу обеспечивает подсистема nf_tables, входящая в состав ядра Linux начиная с выпуска 3.13.

На уровне ядра предоставляется лишь общий интерфейс, не зависящий от конкретного протокола и предоставляющий базовые функции извлечения данных из пакетов, выполнения операций с данными и управления потоком.
Η ίδια η λογική του φιλτραρίσματος και οι ειδικοί χειριστές πρωτοκόλλου μεταγλωττίζονται σε bytecode στο χώρο χρήστη, μετά τον οποίο αυτός ο bytecode φορτώνεται στον πυρήνα χρησιμοποιώντας τη διεπαφή Netlink και εκτελείται σε μια ειδική εικονική μηχανή που θυμίζει BPF (Berkeley Packet Filters). Αυτή η προσέγγιση σάς επιτρέπει να μειώσετε σημαντικά το μέγεθος του κώδικα φιλτραρίσματος που εκτελείται σε επίπεδο πυρήνα και να μετακινήσετε όλες τις λειτουργίες των κανόνων ανάλυσης και της λογικής για την εργασία με πρωτόκολλα στο χώρο χρήστη.

Βασικές καινοτομίες:

  • Υποστήριξη IPsec, που επιτρέπει την αντιστοίχιση διευθύνσεων σήραγγας με βάση το πακέτο, το αναγνωριστικό αιτήματος IPsec και την ετικέτα SPI (Security Parameter Index). Για παράδειγμα,

    ... ipsec σε 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 type membership-query counter drop

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

    ορίζω dest = ber
    προσθήκη κανόνα ip foo bar jump $dest

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

    ... σύνολο σήμανσης meta osf ttl παράλειψη χάρτη ονόματος { "Linux" : 0x1,
    "Windows": 0x2,
    "MacOS": 0x3,
    «unknown» : 0x0 }
    ... osf ttl παράλειψη έκδοσης "Linux:4.20"

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

    table arp x {
    αλυσίδα y {
    Τύπος φίλτρο προτεραιότητας εισόδου άγκιστρου φίλτρου. πολιτική αποδοχή?
    arp saddr ip 192.168.2.1 πακέτα μετρητή 1 byte 46
    }
    }

  • Υποστήριξη για διαφανή προώθηση αιτημάτων μέσω διακομιστή μεσολάβησης (tproxy). Για παράδειγμα, για να ανακατευθύνετε τις κλήσεις στη θύρα 80 στη θύρα διακομιστή μεσολάβησης 8080:

    πίνακας ip x {
    αλυσίδα y {
    type filter hook prerouting priority -150; policy accept;
    tcp dport 80 tproxy to :8080
    }
    }

  • Υποστήριξη για σήμανση υποδοχών με δυνατότητα περαιτέρω απόκτησης του σήματος συνόλου μέσω setsockopt() σε λειτουργία SO_MARK. Για παράδειγμα:

    table inet x {
    αλυσίδα y {
    type filter hook prerouting priority -150; policy accept;
    tcp dport 8080 mark set σημάδι υποδοχής
    }
    }

  • Υποστήριξη για τον καθορισμό ονομάτων κειμένου προτεραιότητας για αλυσίδες. Για παράδειγμα:

    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 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 προσθήκη κανόνα inet φίλτρο εισόδου 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 προσθήκη κανόνα inet φίλτρο εισαγωγής meta secmark set tcp dport map @secmapping

  • Δυνατότητα καθορισμού θυρών που έχουν εκχωρηθεί σε πρωτόκολλα σε μορφή κειμένου, όπως ορίζονται στο αρχείο /etc/services. Για παράδειγμα:

    nft προσθήκη κανόνα xy tcp dport "ssh"
    Σύνολο κανόνων λίστας nft -l
    πίνακας x {
    αλυσίδα y {
    ...
    tcp dport «ssh»
    }
    }

  • Δυνατότητα ελέγχου του τύπου διεπαφής δικτύου. Για παράδειγμα:

    add rule inet raw prerouting meta iifkind «vrf» accept

  • Βελτιωμένη υποστήριξη για δυναμική ενημέρωση των περιεχομένων των συνόλων ορίζοντας ρητά τη σημαία "δυναμική". Για παράδειγμα, για να ενημερώσετε το σύνολο "s" για να προσθέσετε τη διεύθυνση πηγής και να επαναφέρετε την καταχώρηση εάν δεν υπάρχουν πακέτα για 30 δευτερόλεπτα:

    add table x
    add set xs { type ipv4_addr; μέγεθος 128; timeout 30s? σημαίες δυναμική? }
    add chain x y { type filter hook input priority 0; }
    προσθήκη κανόνα xy ενημέρωση @s { ip saddr }

  • Δυνατότητα ορισμού ξεχωριστής συνθήκης χρονικού ορίου. Για παράδειγμα, για να παρακάμψετε το προεπιλεγμένο χρονικό όριο για τα πακέτα που φτάνουν στη θύρα 8888, μπορείτε να καθορίσετε:

    table ip filter {
    ct timeout aggressive-tcp {
    protocol tcp;
    l3proto ip;
    policy = {established: 100, close_wait: 4, close: 4}
    }
    έξοδος αλυσίδας {
    ...
    tcp dport 8888 ct σύνολο χρονικού ορίου "aggressive-tcp"
    }
    }

  • Υποστήριξη NAT για οικογένεια inet:

    πίνακας inet nat {
    ...
    ip6 daddr dead::2::1 dnat to dead:2::99
    }

  • Βελτιωμένη αναφορά τυπογραφικών σφαλμάτων:

    nft add chain filtre test

    Error: No such file or directory; did you mean table «filter» in family ip?
    δοκιμή φίλτρου προσθήκης αλυσίδας
    ^^^^^^^

  • Δυνατότητα καθορισμού ονομάτων διεπαφής σε σύνολα:

    set sc {
    πληκτρολογήστε inet_service. ifname
    στοιχεία = { "ssh" . "eth0" }
    }

  • Ενημερωμένη σύνταξη κανόνων πίνακα ροής:

    nft προσθέστε τον πίνακα x
    nft add flowtable x ft { hook ingress priority 0; συσκευές = { eth0, wlan0 }; }
    ...
    nft προσθήκη κανόνα x προωθητικό πρωτόκολλο IP { tcp, udp } ροή προσθήκη @ft

  • Улучшена поддержка JSON.

Πηγή: opennet.ru

Προσθέστε ένα σχόλιο