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 στο spi 1-65536

    Είναι επίσης δυνατό να ελέγξετε εάν μια διαδρομή διέρχεται από μια σήραγγα IPsec. Για παράδειγμα, για να αποκλείσετε την κυκλοφορία όχι μέσω IPSec:

    … έξοδος φίλτρου rt ipsec λείπει πτώση

  • Υποστήριξη για το IGMP (Internet Group Management Protocol). Για παράδειγμα, μπορείτε να χρησιμοποιήσετε έναν κανόνα για να απορρίψετε εισερχόμενα αιτήματα ιδιότητας μέλους ομάδας IGMP

    nft προσθήκη κανόνα netdev foo bar igmp τύπου ιδιότητα μέλους-ερώτημα απόθεση μετρητή

  • Δυνατότητα χρήσης μεταβλητών για τον ορισμό αλυσίδων μετάβασης (άλμα / goto). Για παράδειγμα:

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

  • Υποστήριξη για μάσκες για αναγνώριση λειτουργικών συστημάτων (OS Fingerprint) με βάση τις τιμές TTL στην κεφαλίδα. Για παράδειγμα, για να επισημάνετε πακέτα με βάση το λειτουργικό σύστημα αποστολέα, μπορείτε να χρησιμοποιήσετε την εντολή:

    ... σύνολο σήμανσης meta 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 byte 46
    }
    }

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

    πίνακας ip x {
    αλυσίδα y {
    Προτεραιότητα προδρομολόγησης γάντζου φίλτρου τύπου -150; πολιτική αποδοχή?
    tcp dport 80 tproxy σε :8080
    }
    }

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

    πίνακας inet x {
    αλυσίδα y {
    Προτεραιότητα προδρομολόγησης γάντζου φίλτρου τύπου -150; πολιτική αποδοχή?
    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 προσθήκη 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 προσθήκη στοιχείου 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"
    }
    }

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

    προσθήκη κανόνα inet raw prerouting meta iifkind "vrf" δέχεται

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

    προσθέστε τον πίνακα x
    add set xs { type ipv4_addr; μέγεθος 128; timeout 30s? σημαίες δυναμική? }
    add chain xy { type filter hook input priority 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:

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

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

    nft δοκιμή φίλτρου προσθήκης αλυσίδας

    Σφάλμα: Δεν υπάρχει τέτοιο αρχείο ή κατάλογος. μήπως εννοούσες "φίλτρο" πίνακα στην οικογενειακή 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

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