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

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

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

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

  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° IPsec, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π°Ρ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ сопоставлСниС адрСсов Ρ‚ΡƒΠ½Π½Π΅Π»Π΅ΠΉ Π² привязкС ΠΊ ΠΏΠ°ΠΊΠ΅Ρ‚Ρƒ, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρƒ запроса IPsec ΠΈ Ρ‚Π΅Π³Ρƒ SPI (Security Parameter Index). НапримСр,

    … ipsec in 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). НапримСр:

    define dest = ber
    add rule ip foo bar jump $dest

  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° масок для ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСм (OS Fingerprint) Π½Π° основС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ TTL Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅. НапримСр, для ΠΏΠΎΠΌΠ΅Ρ‚ΠΊΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² Π² зависимости ΠΎΡ‚ ОБ отправитСля ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

    … meta mark set osf ttl skip name map { «Linux» : 0x1,
    «Windows» : 0x2,
    «MacOS» : 0x3,
    «unknown» : 0x0 }
    … osf ttl skip version «Linux:4.20»

  • Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ сопоставлСния ARP-адрСса отправитСля ΠΈ IPv4-адрСса Ρ†Π΅Π»Π΅Π²ΠΎΠΉ систСмы. НапримСр, для увСличСния счётчика ARP-ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ², ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹Ρ… с адрСса 192.168.2.1 ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ:

    table arp x {
    chain y {
    type filter hook input priority filter; policy accept;
    arp saddr ip 192.168.2.1 counter packets 1 bytes 46
    }
    }

  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΠ³ΠΎ проброса запросов Ρ‡Π΅Ρ€Π΅Π· прокси (tproxy). НапримСр, для пСрСнаправлСния ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΉ ΠΊ 80 ΠΏΠΎΡ€Ρ‚Ρƒ Π½Π° ΠΏΠΎΡ€Ρ‚ прокси 8080:

    table ip x {
    chain y {
    type filter hook prerouting priority -150; policy accept;
    tcp dport 80 tproxy to :8080
    }
    }

  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΏΠΎΠΌΠ΅Ρ‚ΠΊΠΈ сокСтов с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ дальнСйшСго получСния установлСнной ΠΌΠ΅Ρ‚ΠΊΠΈ Ρ‡Π΅Ρ€Π΅Π· setsockopt() Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ SO_MARK. НапримСр:

    table inet x {
    chain y {
    type filter hook prerouting priority -150; policy accept;
    tcp dport 8080 mark set socket mark
    }
    }

  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° указания тСкстовых Π½Π°ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠΉ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ² для Ρ†Π΅ΠΏΠΎΡ‡Π΅ΠΊ. НапримСр:

    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 add rule inet filter input 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 add rule inet filter input meta secmark set tcp dport map @secmapping

  • Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ указания Π·Π°ΠΊΡ€Π΅ΠΏΠ»Ρ‘Π½Π½Ρ‹Ρ… Π·Π° ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°ΠΌΠΈ ΠΏΠΎΡ€Ρ‚ΠΎΠ² Π² тСкстовом Π²ΠΈΠ΄Π΅, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π² Ρ„Π°ΠΉΠ»Π΅ /etc/services. НапримСр:

    nft add rule x y tcp dport «ssh»
    nft list ruleset -l
    table x {
    chain y {

    tcp dport «ssh»
    }
    }

  • Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ‚ΠΈΠΏΠ° сСтСвого интСрфСйса. НапримСр:

    add rule inet raw prerouting meta iifkind «vrf» accept

  • Π£Π»ΡƒΡ‡ΡˆΠ΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° динамичСского обновлСния содСрТимого Π½Π°Π±ΠΎΡ€ΠΎΠ² (sets) Ρ‡Π΅Ρ€Π΅Π· явноС ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ Ρ„Π»Π°Π³Π° «dynamic». НапримСр, для обновлСния Π½Π°Π±ΠΎΡ€Π° «s» с Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ исходного адрСса ΠΈ сбросом записи Π² случаС отсутствия ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ 30 сСкунд:

    add table x
    add set x s { type ipv4_addr; size 128; timeout 30s; flags dynamic; }
    add chain x y { type filter hook input priority 0; }
    add rule x y update @s { ip saddr }

  • Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ задания ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ условия наступлСния Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚Π°. НапримСр, для пСрСопрСдСлСния Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для ΠΏΠ°ΠΊΡ‚ΠΎΠ², ΠΏΡ€ΠΈΡˆΠ΅Π΄ΡˆΠΈΡ… Π½Π° ΠΏΠΎΡ€Ρ‚ 8888 ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ:

    table ip filter {
    ct timeout agressive-tcp {
    protocol tcp;
    l3proto ip;
    policy = {established: 100, close_wait: 4, close: 4}
    }
    chain output {

    tcp dport 8888 ct timeout set «agressive-tcp»
    }
    }

  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° NAT для сСмСйства inet:

    table 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?
    add chain filtre test
    ^^^^^^

  • Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ указания ΠΈΠΌΡ‘Π½ интСрфСйсов Π² Π½Π°Π±ΠΎΡ€Π°Ρ… (sets):

    set sc {
    type inet_service . ifname
    elements = { «ssh» . «eth0» }
    }

  • ΠžΠ±Π½ΠΎΠ²Π»Ρ‘Π½ синтаксис ΠΏΡ€Π°Π²ΠΈΠ» flowtable:

    nft add table x
    nft add flowtable x ft { hook ingress priority 0; devices = { eth0, wlan0 }; }

    nft add rule x forward ip protocol { tcp, udp } flow add @ft

  • Π£Π»ΡƒΡ‡ΡˆΠ΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° JSON.

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