Выпуск ΠΏΠ°ΠΊΠ΅Ρ‚Π½ΠΎΠ³ΠΎ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π° nftables 0.9.2

Бостоялся Ρ€Π΅Π»ΠΈΠ· ΠΏΠ°ΠΊΠ΅Ρ‚Π½ΠΎΠ³ΠΎ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π° nftables 0.9.2, Ρ€Π°Π·Π²ΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎΡΡ Π² качСствС Π·Π°ΠΌΠ΅Π½Ρ‹ iptables, ip6table, arptables ΠΈ ebtables Π·Π° счёт ΡƒΠ½ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ интСрфСйсов Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² для IPv4, IPv6, ARP ΠΈ сСтСвых мостов. Π’ ΠΏΠ°ΠΊΠ΅Ρ‚ nftables входят ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΏΠ°ΠΊΠ΅Ρ‚Π½ΠΎΠ³ΠΎ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠ΅ Π² пространствС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ядра Ρ€Π°Π±ΠΎΡ‚Ρƒ обСспСчиваСт подсистСма nf_tables, входящая Π² состав ядра Linux начиная с выпуска 3.13. НСобходимыС для Ρ€Π°Π±ΠΎΡ‚Ρ‹ выпуска nftables 0.9.2 измСнСния Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² состав ядра Linux 5.3.

На ΡƒΡ€ΠΎΠ²Π½Π΅ ядра прСдоставляСтся лишь ΠΎΠ±Ρ‰ΠΈΠΉ интСрфСйс, Π½Π΅ зависящий ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ извлСчСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ², выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈ управлСния ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ. НСпосрСдствСнно Π»ΠΎΠ³ΠΈΠΊΠ° Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ ΠΈ спСцифичныС для ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠ² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄ Π² пространствС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, послС Ρ‡Π΅Π³ΠΎ Π΄Π°Π½Π½Ρ‹ΠΉ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄ загруТаСтся Π² ядро ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ интСрфСйса Netlink ΠΈ выполняСтся Π² ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ машинС, Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°ΡŽΡ‰Π΅ΠΉ BPF (Berkeley Packet Filters). ΠŸΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ позволяСт Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π° Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅Π³ΠΎ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ядра ΠΈ вынСсти всС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π°Π·Π±ΠΎΡ€Π° ΠΏΡ€Π°Π²ΠΈΠ» ΠΈ Π»ΠΎΠ³ΠΈΠΊΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°ΠΌΠΈ Π² пространство ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ Π½ΠΎΠ²ΡˆΠ΅ΡΡ‚Π²Π°:

  • Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½ΠΎΠΌΠ΅Ρ€Π° ΠΏΠΎΡ€Ρ‚Π° ΠΈΠ· Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° ΠΏΠ°ΠΊΠ΅Ρ‚Π° транспортного уровня нСзависимо ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° 4 уровня:

    add rule x y ip protocol { tcp, udp } th dport 53

  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° восстановлСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΆΠΈΠ·Π½ΠΈ Π½Π°Π±ΠΎΡ€Π° элСмСнтов:

    add element ip x y { 1.1.1.1 timeout 30s expires 15s }

  • Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΏΡ†ΠΈΠΉ (lsrr, rr, ssrr ΠΈ ra) ΠΈΠ· ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² IPv4:

    add rule x y ip option rr exists drop

    Для ΠΎΠΏΡ†ΠΈΠΉ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΏΠΎΠ»Π΅ΠΉ type, ptr, length ΠΈ addr:

    add rule x y ip option rr type 1 drop

  • Π’ выраТСниях Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ допустимо ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ сСтСвых прСфиксов ΠΈ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠ² адрСсов:

    iifname ens3 snat to 10.0.0.0/28
    iifname ens3 snat to 10.0.0.1-10.0.0.15

  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° использования ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² опрСдСлСниях Ρ†Π΅ΠΏΠΎΡ‡Π΅ΠΊ:

    define default_policy = accept
    add chain ip foo bar { type filter hook input priority filter; policy $default_policy }

  • Π£ΠΊΠ°Π·Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π° Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ ΠΊΠ°ΠΊ Π² числовом, Ρ‚Π°ΠΊΠΈ символьном Π²ΠΈΠ΄Π΅:

    define prio = filter
    define prionum = 10
    define prioffset = «filter — 150»

    add table ip foo
    add chain ip foo bar { type filter hook input priority $prio; }
    add chain ip foo ber { type filter hook input priority $prionum; }
    add chain ip foo bor { type filter hook input priority $prioffset; }

  • Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° модуля synproxy. НапримСр, для размСщСния TCP-ΠΏΠΎΡ€Ρ‚Π° 8888 ΠΏΠΎΠ΄ Π·Π°Ρ‰ΠΈΡ‚ΠΎΠΉ synproxy ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°Π±ΠΎΡ€ ΠΏΡ€Π°Π²ΠΈΠ»:

    table ip x {
    chain y {
    type filter hook prerouting priority raw; policy accept;
    tcp dport 8888 tcp flags syn notrack
    }

    chain z {
    type filter hook forward priority filter; policy accept;
    tcp dport 8888 ct state invalid,untracked synproxy mss 1460 \\
    wscale 7 timestamp sack-perm ct state invalid drop
    }
    }

  • Для опрСдСлСния Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ conntrack связанных с Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ соСдинСниСм ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹Ρ… Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… соСдинСний, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π² Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΡ… установки Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… соСдинСний ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°Ρ… ΠΈ сцСнариях, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ Ρ‡Π΅Ρ€Π΅Π· ΡˆΡ‚Π°Ρ‚Π½Ρ‹Π΅ Π½Π°Π±ΠΎΡ€Ρ‹ ΠΏΡ€Π°Π²ΠΈΠ». НапримСр, для опрСдСлСния ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹Ρ… послС соСдинСний ΠΊ TCP ΠΏΠΎΡ€Ρ‚Ρƒ 8888 ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… соСдинСний ΠΊ ΠΏΠΎΡ€Ρ‚Ρƒ 5432 ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π°:

    table x {
    ct expectation myexpect {
    protocol tcp
    dport 5432
    timeout 1h
    size 12
    l3proto ip
    }

    chain input {
    type filter hook input priority 0;
    ct state new tcp dport 8888 ct expectation set myexpect
    ct state established,related counter accept
    }
    }

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru