ืžื”ื“ื•ืจืช ืžืกื ืŸ ืžื ื•ืช nftables 0.9.1

ืœืื—ืจ ืฉื ื” ืฉืœ ืคื™ืชื•ื— ื”ืฆื™ื’ ืฉื—ืจื•ืจ ืžืกื ืŸ ืžื ื•ืช nftables 0.9.1, ืžืชืคืชื— ื›ืชื—ืœื™ืฃ ืœ-iptables, ip6table, arptables ื•-ebtables ืขืœ ื™ื“ื™ ืื™ื—ื•ื“ ืžืžืฉืงื™ ืกื™ื ื•ืŸ ืžื ื•ืช ืขื‘ื•ืจ IPv4, IPv6, ARP ื•ื’ืฉืจื™ ืจืฉืช. ื—ื‘ื™ืœืช nftables ื›ื•ืœืœืช ืจื›ื™ื‘ื™ ืžืกื ืŸ ืžื ื•ืช ื”ืคื•ืขืœื™ื ื‘ื—ืœืœ ื”ืžืฉืชืžืฉ, ื‘ืขื•ื“ ืฉื”ืขื‘ื•ื“ื” ื‘ืจืžืช ื”ืœื™ื‘ื” ืžืกื•ืคืงืช ืขืœ ื™ื“ื™ ืชืช-ื”ืžืขืจื›ืช nf_tables, ืฉื”ื™ื™ืชื” ื—ืœืง ืžืœื™ื‘ืช ืœื™ื ื•ืงืก ืžืื– ื’ืจืกื” 3.13.

ืจืžืช ื”ืงืจื ืœ ืžืกืคืงืช ืจืง ืžืžืฉืง ื’ื ืจื™ ื‘ืœืชื™ ืชืœื•ื™ ื‘ืคืจื•ื˜ื•ืงื•ืœ ื”ืžืกืคืง ืคื•ื ืงืฆื™ื•ืช ื‘ืกื™ืกื™ื•ืช ืœื—ื™ืœื•ืฅ ื ืชื•ื ื™ื ืžืžื ื•ืช, ื‘ื™ืฆื•ืข ืคืขื•ืœื•ืช ื ืชื•ื ื™ื ื•ื‘ืงืจืช ื–ืจื™ืžื”.
ืœื•ื’ื™ืงื™ืช ื”ืกื™ื ื•ืŸ ืขืฆืžื” ื•ื”ืžื˜ืคืœื™ื ื”ืกืคืฆื™ืคื™ื™ื ืœืคืจื•ื˜ื•ืงื•ืœ ืžื•ืจื›ื‘ื™ื ืœืชื•ืš bytecode ื‘ืžืจื—ื‘ ื”ืžืฉืชืžืฉ, ื•ืœืื—ืจ ืžื›ืŸ ืงื•ื“ ื‘ื™ืช ื–ื” ื ื˜ืขืŸ ืœืชื•ืš ื”ืœื™ื‘ื” ื‘ืืžืฆืขื•ืช ืžืžืฉืง Netlink ื•ืžื‘ื•ืฆืข ื‘ืžื›ื•ื ื” ื•ื™ืจื˜ื•ืืœื™ืช ืžื™ื•ื—ื“ืช ื”ืžื–ื›ื™ืจื” ืืช BPF (Berkeley Packet Filters). ื’ื™ืฉื” ื–ื• ืžืืคืฉืจืช ืœื”ืงื˜ื™ืŸ ืžืฉืžืขื•ืชื™ืช ืืช ื’ื•ื“ืœ ืงื•ื“ ื”ืกื™ื ื•ืŸ ื”ืคื•ืขืœ ื‘ืจืžืช ื”ืงืจื ืœ ื•ืœื”ืขื‘ื™ืจ ืืช ื›ืœ ื”ืคื•ื ืงืฆื™ื•ืช ืฉืœ ื—ื•ืงื™ ื ื™ืชื•ื— ื•ื”ื™ื’ื™ื•ืŸ ืœืขื‘ื•ื“ื” ืขื ืคืจื•ื˜ื•ืงื•ืœื™ื ืœืžืจื—ื‘ ื”ืžืฉืชืžืฉ.

ื—ื™ื“ื•ืฉื™ื ืขื™ืงืจื™ื™ื:

  • ืชืžื™ื›ื” ื‘-IPsec, ื”ืžืืคืฉืจืช ื”ืชืืžื” ืฉืœ ื›ืชื•ื‘ื•ืช ืžื ื”ืจื” ืขืœ ืกืžืš ืžื ื”, ืžื–ื”ื” ื‘ืงืฉืช IPsec ื•ืชื’ SPI (ืื™ื ื“ืงืก ืคืจืžื˜ืจ ืื‘ื˜ื—ื”). ืœื“ื•ื’ืžื”,

    ... ipsec ื‘-ip saddr 192.168.1.0/24
    ... ipsec ื‘-spi 1-65536

    ื›ืžื• ื›ืŸ, ื ื™ืชืŸ ืœื‘ื“ื•ืง ื”ืื ืžืกืœื•ืœ ืขื•ื‘ืจ ื‘ืžื ื”ืจืช IPsec. ืœื“ื•ื’ืžื”, ื›ื“ื™ ืœื—ืกื•ื ืชืขื‘ื•ืจื” ืฉืœื ื‘ืืžืฆืขื•ืช IPSec:

    ... ืคืœื˜ ืžืกื ืŸ rt ipsec ื—ืกืจ ื™ืจื™ื“ื”

  • ืชืžื™ื›ื” ื‘-IGMP (Internet Group Management Protocol). ืœื“ื•ื’ืžื”, ืืชื” ื™ื›ื•ืœ ืœื”ืฉืชืžืฉ ื‘ื›ืœืœ ื›ื“ื™ ืœืžื—ื•ืง ื‘ืงืฉื•ืช ื ื›ื ืกื•ืช ืœื—ื‘ืจื•ืช ื‘ืงื‘ื•ืฆืช IGMP

    nft add rule netdev foo bar ืกื•ื’ igmp membership-query counter drop

  • ืืคืฉืจื•ืช ืฉื™ืžื•ืฉ ื‘ืžืฉืชื ื™ื ืœื”ื’ื“ืจืช ืฉืจืฉืจืื•ืช ืžืขื‘ืจ (ืงืคื™ืฆื”/ื’ื•ื˜ื•). ืœื“ื•ื’ืžื”:

    ืœื”ื’ื“ื™ืจ dest = ber
    ื”ื•ืกืฃ ื›ืœืœ ip foo bar jump $dest

  • ืชืžื™ื›ื” ื‘ืžืกื›ื•ืช ืœื–ื™ื”ื•ื™ ืžืขืจื›ื•ืช ื”ืคืขืœื” (ื˜ื‘ื™ืขืช ืืฆื‘ืข ืฉืœ ืžืขืจื›ืช ื”ื”ืคืขืœื”) ื‘ื”ืชื‘ืกืก ืขืœ ืขืจื›ื™ TTL ื‘ื›ื•ืชืจืช. ืœื“ื•ื’ืžื”, ื›ื“ื™ ืœืกืžืŸ ืžื ื•ืช ื”ืžื‘ื•ืกืกื•ืช ืขืœ ืžืขืจื›ืช ื”ื”ืคืขืœื” ืฉืœ ื”ืฉื•ืœื—, ืืชื” ื™ื›ื•ืœ ืœื”ืฉืชืžืฉ ื‘ืคืงื•ื“ื”:

    ... meta mark set osf ttl ื“ืœื’ ืฉื ืžืคืช { "Linux" : 0x1,
    "ื—ืœื•ื ื•ืช": 0x2,
    "MacOS": 0x3,
    "ืœื ื™ื“ื•ืข" : 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 ื‘ืชื™ื 46
    }
    }

  • ืชืžื™ื›ื” ื‘ื”ืขื‘ืจืช ื‘ืงืฉื•ืช ืฉืงื•ืฃ ื‘ืืžืฆืขื•ืช ืคืจื•ืงืกื™ (tproxy). ืœื“ื•ื’ืžื”, ื›ื“ื™ ืœื”ืคื ื•ืช ืฉื™ื—ื•ืช ืœื™ืฆื™ืื” 80 ืœื™ืฆื™ืืช proxy 8080:

    ื˜ื‘ืœื” ip x {
    ืฉืจืฉืจืช y {
    ืกื•ื’ ืžืกื ืŸ ืขื“ื™ืคื•ืช ื ื™ืชื•ื‘ ืžืจืืฉ -150; ืงื‘ืœืช ืžื“ื™ื ื™ื•ืช;
    tcp dport 80 tproxy ืœ:8080
    }
    }

  • ืชืžื™ื›ื” ื‘ืกื™ืžื•ืŸ ืฉืงืขื™ื ืขื ื™ื›ื•ืœืช ืœื”ืฉื™ื’ ืขื•ื“ ืืช ืกื™ืžืŸ ื”ืกื˜ ื‘ืืžืฆืขื•ืช setsockopt() ื‘ืžืฆื‘ SO_MARK. ืœื“ื•ื’ืžื”:

    ื˜ื‘ืœื” inet x {
    ืฉืจืฉืจืช y {
    ืกื•ื’ ืžืกื ืŸ ืขื“ื™ืคื•ืช ื ื™ืชื•ื‘ ืžืจืืฉ -150; ืงื‘ืœืช ืžื“ื™ื ื™ื•ืช;
    tcp dport 8080 ืกื™ืžืŸ ืกื˜ ืฉืงืข ืกื™ืžืŸ
    }
    }

  • ืชืžื™ื›ื” ื‘ืฆื™ื•ืŸ ืฉืžื•ืช ื˜ืงืกื˜ ืขื“ื™ืคื•ืช ืขื‘ื•ืจ ืจืฉืชื•ืช. ืœื“ื•ื’ืžื”:

    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 ื”ื•ืกืฃ ืžืคื” inet filter secmapping { ืกื•ื’ 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 xy tcp dport "ssh"
    ืขืจื›ืช ื—ื•ืงื™ื ืจืฉื™ืžืช nft -l
    ื˜ื‘ืœื” x {
    ืฉืจืฉืจืช y {
    ...
    tcp dport "ssh"
    }
    }

  • ื™ื›ื•ืœืช ืœื‘ื“ื•ืง ืืช ืกื•ื’ ืžืžืฉืง ื”ืจืฉืช. ืœื“ื•ื’ืžื”:

    ื”ื•ืกืฃ ื›ืœืœ inet raw prerouting meta iifkind "vrf" accept

  • ืชืžื™ื›ื” ืžืฉื•ืคืจืช ืœืขื“ื›ื•ืŸ ื“ื™ื ืžื™ ืฉืœ ืชื•ื›ืŸ ื”ืกื˜ ืขืœ ื™ื“ื™ ืฆื™ื•ืŸ ืžืคื•ืจืฉ ืฉืœ ื”ื“ื’ืœ "ื“ื™ื ืžื™". ืœื“ื•ื’ืžื”, ื›ื“ื™ ืœืขื“ื›ืŸ ืืช ืกื˜ "s" ื›ื“ื™ ืœื”ื•ืกื™ืฃ ืืช ื›ืชื•ื‘ืช ื”ืžืงื•ืจ ื•ืœืืคืก ืืช ื”ืขืจืš ืื ืื™ืŸ ืžื ื•ืช ื‘ืžืฉืš 30 ืฉื ื™ื•ืช:

    ื”ื•ืกืฃ ื˜ื‘ืœื” x
    ื”ื•ืกืฃ set xs { ืกื•ื’ ipv4_addr; ืžื™ื“ื” 128; ืคืกืง ื–ืžืŸ ื‘ืฉื ื•ืช ื”-30; ื“ื’ืœื™ื ื“ื™ื ืžื™ื™ื; }
    ื”ื•ืกืฃ ืฉืจืฉืจืช xy { ืกื•ื’ ืžืกื ืŸ ื”ื•ืง ืขื“ื™ืคื•ืช ืงืœื˜ 0; }
    ื”ื•ืกืฃ ื›ืœืœ xy update @s { ip saddr }

  • ื™ื›ื•ืœืช ืœื”ื’ื“ื™ืจ ืชื ืื™ ืคืกืง ื–ืžืŸ ื ืคืจื“. ืœื“ื•ื’ืžื”, ื›ื“ื™ ืœืขืงื•ืฃ ืืช ืคืกืง ื”ื–ืžืŸ ื”ืžื•ื’ื“ืจ ื›ื‘ืจื™ืจืช ืžื—ื“ืœ ืขื‘ื•ืจ ืžื ื•ืช ื”ืžื’ื™ืขื•ืช ื‘ื™ืฆื™ืื” 8888, ืืชื” ื™ื›ื•ืœ ืœืฆื™ื™ืŸ:

    ืžืกื ืŸ IP ืฉืœ ื˜ื‘ืœื” {
    ct timeout aggressive-tcp {
    ืคืจื•ื˜ื•ืงื•ืœ tcp;
    l3proto ip;
    ืžื“ื™ื ื™ื•ืช = {ืงื‘ื•ืข: 100, close_wait: 4, ืกื’ื•ืจ: 4}
    }
    ืคืœื˜ ืฉืจืฉืจืช {
    ...
    tcp dport 8888 ct timeout set "aggressive-tcp"
    }
    }

  • ืชืžื™ื›ืช NAT ืœืžืฉืคื—ืช inet:

    table 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 add rule x forward ip protocol { tcp, udp } flow add @ft

  • ืชืžื™ื›ืช JSON ืžืฉื•ืคืจืช.

ืžืงื•ืจ: OpenNet.ru

ื”ื•ืกืคืช ืชื’ื•ื‘ื”