เบˆเบฑเบ”เบžเบตเบกเบกเบฒ เบเบฒเบ™เบ›เปˆเบญเบเบ•เบปเบงเบเบญเบ‡เปเบžเบฑเบเป€เบเบฑเบ” nftables 0.9.5, เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเป€เบ›เบฑเบ™เบเบฒเบ™เบ—เบปเบ”เปเบ—เบ™เบชเปเบฒเบฅเบฑเบš iptables, ip6table, arptables เปเบฅเบฐ ebtables เป‚เบ”เบ unifying packet filtering interfaces เบชเปเบฒเบฅเบฑเบš IPv4, IPv6, ARP เปเบฅเบฐเบ‚เบปเบงเป€เบ„เบทเบญเบ‚เปˆเบฒเบ. เบŠเบธเบ” nftables เบ›เบฐเบเบญเบšเบกเบตเบญเบปเบ‡เบ›เบฐเบเบญเบšเบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡ packet เบžเบทเป‰เบ™เบ—เบตเปˆเบœเบนเป‰เปƒเบŠเป‰, เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเปƒเบ™เบฅเบฐเบ”เบฑเบš kernel เปเบกเปˆเบ™เบชเบฐเบซเบ™เบญเบ‡เปƒเบซเป‰เป‚เบ”เบเบฅเบฐเบšเบปเบšเบเปˆเบญเบ nf_tables, เป€เบŠเบดเปˆเบ‡เป€เบ›เบฑเบ™เบชเปˆเบงเบ™เบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡ Linux kernel เบ™เบฑเบšเบ•เบฑเป‰เบ‡เปเบ•เปˆเบเบฒเบ™เบ›เปˆเบญเบ 3.13. เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เปˆเบญเบ nftables 0.9.5 เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบงเบฝเบเปเบกเปˆเบ™เบฅเบงเบกเบขเบนเปˆเปƒเบ™ kernel Linux 5.7.

เปƒเบ™เบฅเบฐเบ”เบฑเบš kernel, เบžเบฝเบ‡เปเบ•เปˆเป€เบ›เบฑเบ™เบ•เบปเบงเป‚เบ•เป‰เบ•เบญเบšเปเบšเบšเป€เบญเบเบฐเบฅเบฒเบ”เบ‚เบญเบ‡เป‚เบ›เป‚เบ•เบ„เบญเบ™เบ—เบปเปˆเบงเป„เบ›เบ—เบตเปˆเบชเบฐเบซเบ™เบญเบ‡เบซเบ™เป‰เบฒเบ—เบตเปˆเบžเบทเป‰เบ™เบ–เบฒเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบฐเบเบฑเบ”เบ‚เปเป‰เบกเบนเบ™เบˆเบฒเบเปเบžเบฑเบเป€เบเบฑเบ”, เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เบ‚เบญเบ‡เบ‚เปเป‰เบกเบนเบ™, เปเบฅเบฐเบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเบเบฒเบ™เป„เบซเบผ. เบเบปเบ”เบฅเบฐเบšเบฝเบšเบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡เบ”เป‰เบงเบเบ•เบปเบ™เป€เบญเบ‡เปเบฅเบฐเบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™เบชเบฐเป€เบžเบฒเบฐเป‚เบ›เป‚เบ•เบ„เบญเบ™เป„เบ”เป‰เบ–เบทเบเบฅเบงเบšเบฅเบงเบกเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ bytecode เบŠเปˆเบญเบ‡เบœเบนเป‰เปƒเบŠเป‰, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™ bytecode เบ™เบตเป‰เบ–เบทเบเป‚เบซเบฅเบ”เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ kernel เป‚เบ”เบเปƒเบŠเป‰เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš Netlink เปเบฅเบฐเบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เปƒเบ™ kernel เปƒเบ™เป€เบ„เบทเปˆเบญเบ‡ virtual เบžเบดเป€เบชเบ”เบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบš BPF (Berkeley Packet Filters). เบงเบดเบ—เบตเบเบฒเบ™เบ™เบตเป‰เป€เบฎเบฑเบ”เปƒเบซเป‰เบกเบฑเบ™เบชเบฒเบกเบฒเบ”เบซเบผเบธเบ”เบฅเบปเบ‡เบขเปˆเบฒเบ‡เบซเบผเบงเบ‡เบซเบผเบฒเบเบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”เบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡เบ—เบตเปˆเปเบฅเปˆเบ™เบขเบนเปˆเปƒเบ™เบฅเบฐเบ”เบฑเบš kernel เปเบฅเบฐเบเป‰เบฒเบเบซเบ™เป‰เบฒเบ—เบตเปˆเบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เบญเบ‡เบเบฒเบ™เปเบเบเบเบปเบ”เบฅเบฐเบšเบฝเบšเปเบฅเบฐเป€เบซเบ”เบœเบปเบ™เบ‚เบญเบ‡เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเป‚เบ›เป‚เบ•เบ„เบญเบ™เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบžเบทเป‰เบ™เบ—เบตเปˆเบ‚เบญเบ‡เบœเบนเป‰เปƒเบŠเป‰.

เบ™เบฐเบงเบฑเบ”เบ•เบฐเบเปเบฒเบ•เบปเป‰เบ™เบ•เป:

  • เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เปเบžเบฑเบเป€เบเบฑเบ”เปเบฅเบฐเบ•เบปเบงเบ™เบฑเบšเบเบฒเบ™เบˆเบฐเบฅเบฒเบˆเบญเบ™เบ—เบตเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบเบฑเบšเบญเบปเบ‡เบ›เบฐเบเบญเบšเบ—เบตเปˆเบเปเบฒเบ™เบปเบ”เป„เบงเป‰เป„เบ”เป‰เบ–เบทเบเป€เบžเบตเปˆเบกเป€เบ‚เบปเป‰เบฒเปƒเบ™เบŠเบธเบ”. เป€เบ„เบทเปˆเบญเบ‡เบ™เบฑเบšเบ–เบทเบเป€เบ›เบตเบ”เปƒเบŠเป‰เบ‡เบฒเบ™เป‚เบ”เบเปƒเบŠเป‰เบ„เปเบฒ "counter":

    เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ ip x {
    เบ•เบฑเป‰เบ‡ y {
    เบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡ ip saddr
    เบงเบฝเบเบ‡เบฒเบ™เบ•เป‰เบฒเบ™เบเบฒเบ™
    เบญเบปเบ‡เบ›เบฐเบเบญเบš = { 192.168.10.35, 192.168.10.101, 192.168.10.135 }
    }

    เป‚เบชเป‰ z {
    type filter hook output filter เบšเบนเบฅเบดเบกเบฐเบชเบดเบ”; เบ™เบฐเป‚เบเบšเบฒเบเบเบญเบกเบฎเบฑเบš;
    ip daddr @y
    }
    }

  • เป€เบžเบทเปˆเบญเบเปเบฒเบ™เบปเบ”เบ„เปˆเบฒเป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™เบ‚เบญเบ‡ counters, เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเบปเบเบ•เบปเบงเบขเปˆเบฒเบ‡, เป€เบžเบทเปˆเบญเบŸเบทเป‰เบ™เบŸเบน counters เบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒเบซเบผเบฑเบ‡เบˆเบฒเบ restart, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ™เปเบฒเปƒเบŠเป‰เบ„เปเบฒเบชเบฑเปˆเบ‡ "nft -f":

    # cat ruleset.nft
    เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ ip x {
    เบ•เบฑเป‰เบ‡ y {
    เบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡ ip saddr
    เบงเบฝเบเบ‡เบฒเบ™เบ•เป‰เบฒเบ™เบเบฒเบ™
    เบญเบปเบ‡เบ›เบฐเบเบญเบš = { 192.168.10.35 counter packets 1 bytes 84, 192.168.10.101 \
    counter p 192.168.10.135 counter packets 0 bytes 0 }
    }

    เป‚เบชเป‰ z {
    type filter hook output filter เบšเบนเบฅเบดเบกเบฐเบชเบดเบ”; เบ™เบฐเป‚เบเบšเบฒเบเบเบญเบกเบฎเบฑเบš;
    ip daddr @y
    }
    }
    # nft -f ruleset.nft
    #nft เบเบปเบ”เบฅเบฐเบšเบฝเบšเบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆ
    เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ ip x {
    เบ•เบฑเป‰เบ‡ y {
    เบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡ ip saddr
    เบงเบฝเบเบ‡เบฒเบ™เบ•เป‰เบฒเบ™เบเบฒเบ™
    เบญเบปเบ‡เบ›เบฐเบเบญเบš = { 192.168.10.35 counter packets 1 bytes 84, 192.168.10.101 \
    counter p 192.168.10.135 counter packets 0 bytes 0 }
    }

    เป‚เบชเป‰ z {
    type filter hook output filter เบšเบนเบฅเบดเบกเบฐเบชเบดเบ”; เบ™เบฐเป‚เบเบšเบฒเบเบเบญเบกเบฎเบฑเบš;
    ip daddr @y
    }
    }

  • เบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบ”เป‰เบฒเบ™ counter เบเบฑเบ‡เป„เบ”เป‰เบ–เบทเบเป€เบžเบตเปˆเบกเป€เบ‚เบปเป‰เบฒเปƒเบ™ flowtable:

    เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ ip foo {
    เปเบ–เบš flowtable {
    hook ingress เบšเบนเบฅเบดเบกเบฐเบชเบดเบ” -100
    เบญเบธเบ›เบฐเบเบญเบ™ = {eth0, eth1 }
    เบงเบฝเบเบ‡เบฒเบ™เบ•เป‰เบฒเบ™เบเบฒเบ™
    }

    เบ•เปˆเบญเบ‡เป‚เบชเป‰เบ•เปเปˆเบซเบ™เป‰เบฒ {
    type filter hook forward filter เบšเบนเบฅเบดเบกเบฐเบชเบดเบ”;
    flow add @bar counter
    }
    }

    เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบšเบดเปˆเบ‡เบฅเบฒเบเบŠเบทเปˆเบ•เบปเบงเบ™เบฑเบšเป‚เบ”เบเปƒเบŠเป‰เบ„เปเบฒเบชเบฑเปˆเบ‡ "conntrack -L":

    tcp 6 src=192.168.10.2 dst=10.0.1.2 sport=47278 dport=5201 เปเบžเบฑเบเป€เบเบฑเบ”=9 bytes=608 \
    src=10.0.1.2 dst=10.0.1.1 sport=5201 dport=47278 เปเบžเบฑเบเป€เบเบฑเบ”=8 bytes=428 [OFFLOAD] mark=0 \
    sectx=null use=2 tcp 6 src=192.168.10.2 dst=10.0.1.2 sport=47280 dport=5201 \
    packets=1005763 bytes=44075714753 src=10.0.1.2 dst=10.0.1.1 sport=5201 dport=47280 \
    packets=967505 bytes=50310268 [OFFLOAD] mark=0 secctx=null เปƒเบŠเป‰=2

  • เปƒเบ™เบŠเบธเบ”เบชเปเบฒเบฅเบฑเบš concatenation (concatenation, bundles เบ—เบตเปˆเปเบ™เปˆเบ™เบญเบ™เบ‚เบญเบ‡เบ—เบตเปˆเบขเบนเปˆเปเบฅเบฐเบžเบญเบ”เบ—เบตเปˆเบ‡เปˆเบฒเบเบเบฒเบ™เบ›เบฝเบšเบ—เบฝเบš), เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเปƒเบŠเป‰เบ„เปเบฒเบชเบฑเปˆเบ‡ "typeof", เป€เบŠเบดเปˆเบ‡เบเปเบฒเบ™เบปเบ”เบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡เบ‚เปเป‰เบกเบนเบ™เบ‚เบญเบ‡เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ‚เบญเบ‡เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ‚เบญเบ‡เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ‚เบญเบ‡เบŠเบธเบ”:

    เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ ip foo {
    เบ•เบฑเป‰เบ‡เบšเบฑเบ™เบŠเบตเบ‚เบฒเบง {
    เบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡ ip saddr . tcp dport
    เบญเบปเบ‡เบ›เบฐเบเบญเบš = { 192.168.10.35 . 80, 192.168.10.101. 80}
    }

    เปเบ–เบšเป‚เบชเป‰ {
    type filter hook prerouting priority filter; เบ™เบฐเป‚เบเบšเบฒเบเบซเบผเบธเบ”เบฅเบปเบ‡;
    ip เบžเปเปˆ. tcp dport @whitelist เบเบญเบกเบฎเบฑเบš
    }
    }

  • เบ›เบฐโ€‹เป€เบžเบ”โ€‹เบ‚เบญเบ‡โ€‹เบ„เปเบฒโ€‹เบชเบฑเปˆเบ‡โ€‹เปƒเบ™โ€‹เบ›เบฑเบ”โ€‹เบˆเบธโ€‹เบšเบฑเบ™โ€‹เบเบฑเบ‡โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹เบเบฑเบšโ€‹เบเบฒเบ™โ€‹เป€เบ‚เบปเป‰เบฒโ€‹เบฎเปˆเบงเบกโ€‹เปƒเบ™โ€‹เบฅเบฒเบโ€‹เบเบฒเบ™โ€‹เปเบœเบ™โ€‹เบ—เบตเปˆโ€‹:

    เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ ip foo {
    เปเบœเบ™เบ—เบตเปˆ addr2mark {
    เบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡ ip saddr . tcp dport: เป€เบ„เบทเปˆเบญเบ‡เบซเบกเบฒเบ meta
    เบญเบปเบ‡เบ›เบฐเบเบญเบš = { 192.168.10.35 . 80 : 0x00000001 ,
    192.168.10.135. 80 : 0x00000002 }
    }

    เปเบ–เบšเป‚เบชเป‰ {
    type filter hook prerouting priority filter; เบ™เบฐเป‚เบเบšเบฒเบเบซเบผเบธเบ”เบฅเบปเบ‡;
    meta mark set ip daddr . tcp dport เปเบœเบ™เบ—เบตเปˆ @addr2mark เบเบญเบกเบฎเบฑเบš
    }
    }

  • เป€เบžเบตเปˆเบกโ€‹เบเบฒเบ™โ€‹เบชเบฐโ€‹เบซเบ™เบฑเบšโ€‹เบชเบฐโ€‹เบซเบ™เบนเบ™โ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เป€เบ‚เบปเป‰เบฒโ€‹เบฎเปˆเบงเบกโ€‹เป„เบฅโ€‹เบเบฐโ€‹เปƒเบ™โ€‹เบŠเบธเบ”โ€‹เบšเปเปˆโ€‹เบฅเบฐโ€‹เบšเบธโ€‹เบŠเบทเปˆ (เบšเปเปˆโ€‹เบกเบตโ€‹เบŠเบทเปˆโ€‹)โ€‹:

    # nft เป€เบžเบตเปˆเบกเบเบปเบ”เบฅเบฐเบšเบฝเบš inet filter input ip daddr . tcp dport\
    { 10.0.0.0/8 . 10-23, 192.168.1.1-192.168.3.8. 80-443 } เบเบญเบกเบฎเบฑเบš

  • เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เปƒเบ™เบเบฒเบ™เบเบปเบเป€เบฅเบตเบเปเบžเบฑเบเป€เบเบฑเบ”เบ—เบตเปˆเบกเบตเบ—เบธเบ‡ 802.1q (VLAN) เป€เบกเบทเปˆเบญเบ›เบฐเบกเบงเบ™เบœเบปเบ™เบ‚เบปเบงเป€เบ„เบทเบญเบ‚เปˆเบฒเบเบ–เบทเบเบชเบฐเปœเบญเบ‡เปƒเบซเป‰:

    # nft เป€เบžเบตเปˆเบกเบเบปเบ”เบฅเบฐเบšเบฝเบšเบ‚เบปเบง foo bar ether เบ›เบฐเป€เบžเบ” vlan เบ›เบฐเบ•เบดเป€เบชเบ”เบ”เป‰เบงเบเบเบฒเบ™เบ›เบฑเบš tcp

  • เป€เบžเบตเปˆเบกเบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบˆเบฑเบšเบ„เบนเปˆเป‚เบ”เบ TCP session identifier (conntrack ID). เป€เบžเบทเปˆเบญเบเปเบฒเบ™เบปเบ” conntrack ID, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ™เปเบฒเปƒเบŠเป‰เบ—เบฒเบ‡เป€เบฅเบทเบญเบ "--output id":

    # conntrack -L โ€”output id
    udp 17 18 src=192.168.2.118 dst=192.168.2.1 sport=36424 dport=53 เบŠเบธเบ”=2 \
    bytes=122 src=192.168.2.1 dst=192.168.2.118 sport=53 dport=36424 เปเบžเบฑเบเป€เบเบฑเบ”=2 bytes=320 \
    [เบฎเบฑเบšเบ›เบฐเบเบฑเบ™] mark=0 use=1 id=2779986232

    # nft เป€เบžเบตเปˆเบกเบเบปเบ”เบฅเบฐเบšเบฝเบš foo bar ct id 2779986232 counter

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: opennet.ru

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™