αž€αžΆαžšαž…αŸαž‰αž•αŸ’αžŸαžΆαž™αžαž˜αŸ’αžšαž„αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“ nftables 0.9.3

αž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž•αŸ’αžŸαžΆαž™ αž€αžΆαžšαž…αŸαž‰αž•αŸ’αžŸαžΆαž™αžαž˜αŸ’αžšαž„αž€αž‰αŸ’αž…αž”αŸ‹ nftables 0.9.3, Ρ€Π°Π·Π²ΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎΡΡ Π² качСствС Π·Π°ΠΌΠ΅Π½Ρ‹ iptables, ip6table, arptables ΠΈ ebtables Π·Π° счёт ΡƒΠ½ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ интСрфСйсов Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² для IPv4, IPv6, ARP ΠΈ сСтСвых мостов. Π’ ΠΏΠ°ΠΊΠ΅Ρ‚ nftables входят ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΏΠ°ΠΊΠ΅Ρ‚Π½ΠΎΠ³ΠΎ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠ΅ Π² пространствС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ядра Ρ€Π°Π±ΠΎΡ‚Ρƒ обСспСчиваСт подсистСма nf_tables, входящая Π² состав ядра Linux начиная с выпуска 3.13. НСобходимыС для Ρ€Π°Π±ΠΎΡ‚Ρ‹ выпуска nftables 0.9.3 измСнСния Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π² состав Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΉ Π²Π΅Ρ‚ΠΊΠΈ ядра Linux 5.5.

αž€αž˜αŸ’αžšαž·αžαžαžΊαžŽαŸ‚αž›αž•αŸ’αžαž›αŸ‹αžαŸ‚αž…αŸ†αžŽαž»αž…αž”αŸ’αžšαž‘αžΆαž€αŸ‹αž―αž€αžšαžΆαž‡αŸ’αž™αž“αŸƒαž–αž·αž’αžΈαž€αžΆαžšαž‘αžΌαž‘αŸ…αžŠαŸ‚αž›αž•αŸ’αžαž›αŸ‹αž˜αž»αžαž„αžΆαžšαž‡αžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž‘αžΆαž‰αž™αž€αž‘αž·αž“αŸ’αž“αž“αŸαž™αž–αžΈαž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“ αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™ αž“αž·αž„αž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž›αŸ†αž αžΌαžšαŸ” αžαž€αŸ’αž€αžœαž·αž‡αŸ’αž‡αžΆαžαŸ’αžšαž„αžαŸ’αž›αž½αž“αžœαžΆαž•αŸ’αž‘αžΆαž›αŸ‹ αž“αž·αž„αž’αŸ’αž“αž€αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž–αž·αž’αžΈαž€αžΆαžšαž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αž„αž€αŸ’αžšαž„αž‡αžΆ bytecode αž€αŸ’αž“αž»αž„αž…αž“αŸ’αž›αŸ„αŸ‡αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€ bytecode αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‘αž»αž€αž‘αŸ…αž€αŸ’αž“αž»αž„αžαžΊαžŽαŸ‚αž›αžŠαŸ„αž™αž”αŸ’αžšαžΎαž…αŸ†αžŽαž»αž…αž”αŸ’αžšαž‘αžΆαž€αŸ‹ Netlink αž“αž·αž„αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αŸ’αž“αž»αž„αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αžαž–αž·αžŸαŸαžŸαžŠαŸ‚αž›αž“αžΉαž€αžƒαžΎαž‰αžŠαž›αŸ‹ BPF (Berkeley Packet Filters)αŸ” αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž“αŸαŸ‡αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αž™αŸ‰αžΆαž„αžαŸ’αž›αžΆαŸ†αž„αž“αžΌαžœαž‘αŸ†αž αŸ†αž“αŸƒαž€αžΌαžŠαžαŸ’αžšαž„αžŠαŸ‚αž›αž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸ…αž€αž˜αŸ’αžšαž·αžαžαžΊαžŽαŸ‚αž› αž αžΎαž™αž•αŸ’αž›αžΆαžŸαŸ‹αž‘αžΈαž˜αž»αžαž„αžΆαžšαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸƒαž…αŸ’αž”αžΆαž”αŸ‹αž‰αŸ‚αž€ αž“αž·αž„αžαž€αŸ’αž€αžœαž·αž‡αŸ’αž‡αžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž–αž·αž’αžΈαž€αžΆαžšαž‘αŸ…αž€αŸ’αž“αž»αž„αž‘αŸ†αž αŸ†αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αŸ”

αž€αžΆαžšαž…αŸ’αž“αŸƒαž”αŸ’αžšαžŒαž·αžαžŸαŸ†αžαžΆαž“αŸ‹αŸ—αŸ–

  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° сопоставлСния ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. МоТно ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρ‹ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ Π΄Π°Ρ‚, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Ρ‚Π°ΠΊ ΠΈ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ срабатываниС Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ Π΄Π½ΠΈ Π½Π΅Π΄Π΅Π»ΠΈ. Π’Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° новая опция Β«-TΒ» для Π²Ρ‹Π²ΠΎΠ΄Π° ΡΠΏΠΎΡ…Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² сСкундах.

    meta time \Β»2019-12-24 16:00\Β» β€” \Β»2020-01-02 7:00\Β»
    meta hour \Β»17:00\Β» β€” \Β»19:00\Β»
    meta day \Β»Fri\Β»

  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° восстановлСния ΠΈ сохранСния ΠΌΠ΅Ρ‚ΠΎΠΊ SELinux (secmark).

    ct secmark set meta secmark
    meta secmark set ct secmark

  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° map-списков synproxy, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΡ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Π° Π½Π° бэкСнд.

    αžαžΆαžšαžΆαž„ ip foo {
    synproxy https-synproxy {
    mss 1460
    wscale 7
    timestamp sack-perm
    }

    synproxy other-synproxy {
    mss 1460
    wscale 5
    }

    chain pre {
    αž”αŸ’αžšαž—αŸαž‘ αž‘αŸ†αž–αž€αŸ‹ αžαž˜αŸ’αžšαž„ αž€αžΆαžšαž–αžΆαžš αž’αžΆαž‘αž·αž—αžΆαž– αž†αŸ…; αž‚αŸ„αž›αž“αž™αŸ„αž”αžΆαž™αž‘αž‘αž½αž›αž™αž€;
    tcp dport 8888 tcp flags syn notrack
    }

    αžšαž”αžΆαžšαžαŸ’αžŸαŸ‚αžŸαž„αŸ’αžœαžΆαž€αŸ‹ {
    αž”αŸ’αžšαž—αŸαž‘αžαž˜αŸ’αžšαž„ αžαž˜αŸ’αžšαž„αž’αžΆαž‘αž·αž—αžΆαž– αž†αŸ’αž–αŸ„αŸ‡αž‘αŸ…αž˜αž»αž; αž‚αŸ„αž›αž“αž™αŸ„αž”αžΆαž™αž‘αž‘αž½αž›αž™αž€;
    ct state invalid,untracked synproxy name ip saddr map { 192.168.1.0/24 : Β«https-synproxyΒ», 192.168.2.0/24 : Β«other-synproxyΒ» }
    }
    }

  • Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ динамичСского удалСния элСмСнтов set-Π½Π°Π±ΠΎΡ€ΠΎΠ² ΠΈΠ· ΠΏΡ€Π°Π²ΠΈΠ» ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ².

    nft add rule … delete @set5 { ip6 saddr . ip6 daddr }

  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° сопоставлСния VLAN ΠΏΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρƒ ΠΈ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρƒ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… Π² ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Ρ… интСрфСйса сСтСвого моста;

    meta ibrpvid 100
    meta ibrvproto vlan

  • ΠžΠΏΡ†ΠΈΡ Β«-tΒ» (Β«β€”terseΒ») для ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ элСмСнтов set-Π½Π°Π±ΠΎΡ€ΠΎΠ² ΠΏΡ€ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ ΠΏΡ€Π°Π²ΠΈΠ». ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Β«nft -t list rulesetΒ» Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²Π΅Π΄Π΅Π½ΠΎ:

    αžαžΆαžšαžΆαž„ ip x {
    αž€αŸ†αžŽαžαŸ‹ y {
    type ipv4_addr
    }
    }

    А ΠΏΡ€ΠΈ Β«nft list rulesetΒ»

    αžαžΆαžšαžΆαž„ ip x {
    αž€αŸ†αžŽαžαŸ‹ y {
    type ipv4_addr
    elements = { 192.168.10.2, 192.168.20.1,
    192.168.4.4, 192.168.2.34 }
    }
    }

  • Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ указания Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ устройства Π² Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ°Ρ… netdev (Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ядром 5.5) для объСдинСния Ρ‚ΠΈΠΏΠΎΠ²Ρ‹Ρ… ΠΏΡ€Π°Π²ΠΈΠ» Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ.

    add table netdev x
    add chain netdev x y { \
    type filter hook ingress devices = { eth0, eth1 } priority 0;
    }

  • Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ добавлСния описаний Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ….

    # nft describe ipv4_addr
    datatype ipv4_addr (IPv4 address) (basetype integer), 32 bits

  • Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ сборки CLI-интСрфСйса с Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ linenoise вмСсто libreadline.

    ./configure β€”with-cli=linenoise

αž”αŸ’αžšαž—αž–: opennet.ru

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹