nftables เจชเฉˆเจ•เฉ‡เจŸ เจซเจฟเจฒเจŸเจฐ 0.9.5 เจฐเฉ€เจฒเฉ€เจœเจผ

เจชเฉเจฐเจ•เจพเจธเจผเจฟเจค เจชเฉˆเจ•เฉ‡เจŸ เจซเจฟเจฒเจŸเจฐ เจฐเฉ€เจฒเฉ€เจœเจผ nftables 0.9.5, ั€ะฐะทะฒะธะฒะฐัŽั‰ะตะณะพัั ะฒ ะบะฐั‡ะตัั‚ะฒะต ะทะฐะผะตะฝั‹ iptables, ip6table, arptables ะธ ebtables ะทะฐ ัั‡ั‘ั‚ ัƒะฝะธั„ะธะบะฐั†ะธะธ ะธะฝั‚ะตั€ั„ะตะนัะพะฒ ั„ะธะปัŒั‚ั€ะฐั†ะธะธ ะฟะฐะบะตั‚ะพะฒ ะดะปั IPv4, IPv6, ARP ะธ ัะตั‚ะตะฒั‹ั… ะผะพัั‚ะพะฒ. ะ’ ะฟะฐะบะตั‚ nftables ะฒั…ะพะดัั‚ ะบะพะผะฟะพะฝะตะฝั‚ั‹ ะฟะฐะบะตั‚ะฝะพะณะพ ั„ะธะปัŒั‚ั€ะฐ, ั€ะฐะฑะพั‚ะฐัŽั‰ะธะต ะฒ ะฟั€ะพัั‚ั€ะฐะฝัั‚ะฒะต ะฟะพะปัŒะทะพะฒะฐั‚ะตะปั, ะฒ ั‚ะพ ะฒั€ะตะผั ะบะฐะบ ะฝะฐ ัƒั€ะพะฒะฝะต ัะดั€ะฐ ั€ะฐะฑะพั‚ัƒ ะพะฑะตัะฟะตั‡ะธะฒะฐะตั‚ ะฟะพะดัะธัั‚ะตะผะฐ nf_tables, ะฒั…ะพะดัั‰ะฐั ะฒ ัะพัั‚ะฐะฒ ัะดั€ะฐ Linux ะฝะฐั‡ะธะฝะฐั ั ะฒั‹ะฟัƒัะบะฐ 3.13. ะะตะพะฑั…ะพะดะธะผั‹ะต ะดะปั ั€ะฐะฑะพั‚ั‹ ะฒั‹ะฟัƒัะบะฐ nftables 0.9.5 ะธะทะผะตะฝะตะฝะธั ะฒะบะปัŽั‡ะตะฝั‹ ะฒ ัะพัั‚ะฐะฒ ัะดั€ะฐ เจฒเฉ€เจจเจฟเจ•เจธ 5.7.

เจ•เจฐเจจเจฒ เจชเฉฑเจงเจฐ เจธเจฟเจฐเจซเจผ เจ‡เฉฑเจ• เจ†เจฎ เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ-เจธเฉเจคเฉฐเจคเจฐ เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจฆเจพ เจนเฉˆ เจœเฉ‹ เจชเฉˆเจ•เฉ‡เจŸเจพเจ‚ เจคเฉ‹เจ‚ เจกเฉ‡เจŸเจพ เจ•เฉฑเจขเจฃ, เจกเฉ‡เจŸเจพ เจ“เจชเจฐเฉ‡เจธเจผเจจ เจ•เจฐเจจ, เจ…เจคเฉ‡ เจชเฉเจฐเจตเจพเจน เจจเจฟเจฏเฉฐเจคเจฐเจฃ เจฒเจˆ เจฌเฉเจจเจฟเจ†เจฆเฉ€ เจซเฉฐเจ•เจธเจผเจจ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจซเจฟเจฒเจŸเจฐเจฟเฉฐเจ— เจจเจฟเจฏเจฎ เจ…เจคเฉ‡ เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ-เจตเจฟเจธเจผเฉ‡เจธเจผ เจนเฉˆเจ‚เจกเจฒเจฐ เจฏเฉ‚เจœเจผเจฐ เจธเจชเฉ‡เจธ เจตเจฟเฉฑเจš เจฌเจพเจˆเจŸเจ•เฉ‹เจก เจตเจฟเฉฑเจš เจ•เฉฐเจชเจพเจ‡เจฒ เจ•เฉ€เจคเฉ‡ เจœเจพเจ‚เจฆเฉ‡ เจนเจจ, เจœเจฟเจธ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจ‡เจธ เจฌเจพเจˆเจŸเจ•เฉ‹เจก เจจเฉ‚เฉฐ เจจเฉˆเฉฑเจŸเจฒเจฟเฉฐเจ• เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ•เจฐเจจเจฒ เจตเจฟเฉฑเจš เจฒเฉ‹เจก เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ BPF (เจฌเจฐเจ•เจฒเฉ‡ เจชเฉˆเจ•เฉ‡เจŸ เจซเจฟเจฒเจŸเจฐ) เจฆเฉ€ เจฏเจพเจฆ เจฆเจฟเจตเจพเจ‰เจ‚เจฆเฉ€ เจ‡เฉฑเจ• เจตเจฟเจธเจผเฉ‡เจธเจผ เจตเจฐเจšเฉเจ…เจฒ เจฎเจธเจผเฉ€เจจ เจตเจฟเฉฑเจš เจ•เจฐเจจเจฒ เจตเจฟเฉฑเจš เจšเจฒเจพเจ‡เจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค เจ‡เจน เจชเจนเฉเฉฐเจš เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ•เจฐเจจเจฒ เจชเฉฑเจงเจฐ 'เจคเฉ‡ เจšเฉฑเจฒ เจฐเจนเฉ‡ เจซเจฟเจฒเจŸเจฐเจฟเฉฐเจ— เจ•เฉ‹เจก เจฆเฉ‡ เจ†เจ•เจพเจฐ เจจเฉ‚เฉฐ เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจจ เจคเฉŒเจฐ 'เจคเฉ‡ เจ˜เจŸเจพเจ‰เจฃ เจ…เจคเฉ‡ เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจ เจฒเจˆ เจชเจพเจฐเจธเจฟเฉฐเจ— เจจเจฟเจฏเจฎเจพเจ‚ เจ…เจคเฉ‡ เจคเจฐเจ• เจฆเฉ‡ เจธเจพเจฐเฉ‡ เจซเฉฐเจ•เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจธเจชเฉ‡เจธ เจตเจฟเฉฑเจš เจฒเจฟเจœเจพเจฃ เจฆเฉ€ เจ†เจ—เจฟเจ† เจฆเจฟเฉฐเจฆเฉ€ เจนเฉˆเฅค

เจฎเฉเฉฑเจ– เจจเจตเฉ€เจจเจคเจพเจตเจพเจ‚:

  • ะ’ ะฝะฐะฑะพั€ั‹ ะดะพะฑะฐะฒะปะตะฝะฐ ะฟะพะดะดะตั€ะถะบะฐ ัั‡ั‘ั‚ั‡ะธะบะพะฒ ะฟะฐะบะตั‚ะพะฒ ะธ ั‚ั€ะฐั„ะธะบะฐ, ะฟั€ะธะฒัะทะฐะฝะฝั‹ั… ะบ ัะปะตะผะตะฝั‚ะฐะผ ะฝะฐะฑะพั€ะฐ. ะกั‡ั‘ั‚ั‡ะธะบะธ ะฒะบะปัŽั‡ะฐัŽั‚ัั ะฟั€ะธ ะฟะพะผะพั‰ะธ ะบะปัŽั‡ะตะฒะพะณะพ ัะปะพะฒะฐ ยซcounterยป:

    เจธเจพเจฐเจฃเฉ€ ip x {
    set y {
    เจ†เจˆเจชเฉ€ เจธเจฆเจฐ เจฆเฉ€ เจ•เจฟเจธเจฎ
    เจตเจฟเจฐเฉ‹เจงเฉ€
    เจคเฉฑเจค = {192.168.10.35, 192.168.10.101, 192.168.10.135 }
    }

    เจšเฉ‡เจจ z {
    type filter hook output priority filter; policy accept;
    ip daddr @y
    }
    }

  • ะ”ะปั ัƒัั‚ะฐะฝะพะฒะบะธ ะฝะฐั‡ะฐะปัŒะฝั‹ั… ะทะฝะฐั‡ะตะฝะธะน ัั‡ั‘ั‚ั‡ะธะบะพะฒ, ะฝะฐะฟั€ะธะผะตั€, ะดะปั ะฒะพััั‚ะฐะฝะพะฒะปะตะฝะธั ะฟั€ะพัˆะปั‹ั… ัั‡ั‘ั‚ั‡ะธะบะพะฒ ะฟะพัะปะต ะฟะตั€ะตะทะฐะฟัƒัะบะฐ, ะฝะฐะฑะพั€ะฐ ะผะพะถะฝะพ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ ะบะพะผะฐะฝะดัƒ ยซnft -fยป:

    # cat ruleset.nft
    เจธเจพเจฐเจฃเฉ€ ip x {
    set y {
    เจ†เจˆเจชเฉ€ เจธเจฆเจฐ เจฆเฉ€ เจ•เจฟเจธเจฎ
    เจตเจฟเจฐเฉ‹เจงเฉ€
    elements = { 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 priority filter; policy accept;
    ip daddr @y
    }
    }
    # nft -f ruleset.nft
    # nft list ruleset
    เจธเจพเจฐเจฃเฉ€ ip x {
    set y {
    เจ†เจˆเจชเฉ€ เจธเจฆเจฐ เจฆเฉ€ เจ•เจฟเจธเจฎ
    เจตเจฟเจฐเฉ‹เจงเฉ€
    elements = { 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 priority filter; policy accept;
    ip daddr @y
    }
    }

  • ะŸะพะดะดะตั€ะถะบะฐ ัั‡ั‘ั‚ั‡ะธะบะพะฒ ั‚ะฐะบะถะต ะดะพะฑะฐะฒะปะตะฝะฐ ะฒะพ flowtable:

    เจธเจพเจฐเจฃเฉ€ ip foo {
    flowtable bar {
    hook ingress priority -100
    devices = { eth0, eth1 }
    เจตเจฟเจฐเฉ‹เจงเฉ€
    }

    เจšเฉ‡เจจ เจ…เฉฑเจ—เฉ‡ {
    type filter hook forward priority filter;
    flow add @bar counter
    }
    }

    ะŸะพัะผะพั‚ั€ะตั‚ัŒ ัะฟะธัะพะบ ัั‡ั‘ั‚ั‡ะธะบะพะฒ ะผะพะถะฝะพ ะบะพะผะฐะฝะดะฝะพะน ยซconntrack -Lยป:

    tcp 6 src=192.168.10.2 dst=10.0.1.2 sport=47278 dport=5201 packets=9 bytes=608 \
    src=10.0.1.2 dst=10.0.1.1 sport=5201 dport=47278 packets=8 bytes=428 [OFFLOAD] mark=0 \
    secctx=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 use=2

  • ะ’ ะฝะฐะฑะพั€ะฐั… ะดะปั ะฟั€ะธัะพะตะดะธะฝะตะฝะธะน (concatenation, ะพะฟั€ะตะดะตะปั‘ะฝะฝั‹ะต ัะฒัะทะบะธ ะฐะดั€ะตัะพะฒ ะธ ะฟะพั€ั‚ะพะฒ, ัƒะฟั€ะพั‰ะฐัŽั‰ะธะต ัะพะฟะพัั‚ะฐะฒะปะตะฝะธะต) ะพะฑะตัะฟะตั‡ะตะฝะฐ ะฒะพะทะผะพะถะฝะพัั‚ัŒ ะธัะฟะพะปัŒะทะพะฒะฐะฝะธั ะดะธั€ะตะบั‚ะธะฒั‹ ยซtypeofยป, ะพะฟั€ะตะดะตะปััŽั‰ะตะน ั‚ะธะฟ ะดะฐะฝะฝั‹ั… ัะปะตะผะตะฝั‚ะพะฒ ะดะปั ัะพัั‚ะฐะฒะฝั‹ั… ั‡ะฐัั‚ะตะน ัะปะตะผะตะฝั‚ะพะฒ ะฝะฐะฑะพั€ะฐ:

    เจธเจพเจฐเจฃเฉ€ ip foo {
    เจตเจพเจˆเจŸเจฒเจฟเจธเจŸ เจธเฉˆเฉฑเจŸ เจ•เจฐเฉ‹ {
    typeof ip saddr . tcp dport
    elements = { 192.168.10.35 . 80, 192.168.10.101 . 80 }
    }

    เจšเฉ‡เจจ เจฌเจพเจฐ {
    เจŸเจพเจˆเจช เจซเจฟเจฒเจŸเจฐ เจนเฉเฉฑเจ• เจชเฉเจฐเฉ€เจฐเฉ‚เจŸเจฟเฉฐเจ— เจคเจฐเจœเฉ€เจน เจซเจฟเจฒเจŸเจฐ; เจจเฉ€เจคเฉ€ เจ˜เจŸเจฃเจพ;
    ip daddr . tcp dport @whitelist accept
    }
    }

  • ะ”ะธั€ะตะบั‚ะธะฒะฐ typeof ั‚ะตะฟะตั€ัŒ ั‚ะฐะบะถะต ะฟั€ะธะผะตะฝะธะผะฐ ะดะปั ะฟั€ะธัะพะตะดะธะฝะตะฝะธะน ะฒ map-ัะฟะธัะบะฐั…:

    เจธเจพเจฐเจฃเฉ€ ip foo {
    เจจเจ•เจธเจผเจพ addr2mark {
    typeof ip saddr . tcp dport : meta mark
    elements = { 192.168.10.35 . 80 : 0x00000001,
    192.168.10.135 . 80 : 0x00000002 }
    }

    เจšเฉ‡เจจ เจฌเจพเจฐ {
    เจŸเจพเจˆเจช เจซเจฟเจฒเจŸเจฐ เจนเฉเฉฑเจ• เจชเฉเจฐเฉ€เจฐเฉ‚เจŸเจฟเฉฐเจ— เจคเจฐเจœเฉ€เจน เจซเจฟเจฒเจŸเจฐ; เจจเฉ€เจคเฉ€ เจ˜เจŸเจฃเจพ;
    meta mark set ip daddr . tcp dport map @addr2mark accept
    }
    }

  • ะ”ะพะฑะฐะฒะปะตะฝะฐ ะฟะพะดะดะตั€ะถะบะฐ ะฟั€ะธัะพะตะดะธะฝะตะฝะธะน ั ะดะธะฐะฟะฐะทะพะฝะฐะผะธ ะฒ ะฐะฝะพะฝะธะผะฝั‹ั… (ะฝะตะธะผะตะฝะพะฒะฐะฝะฝั‹ั…) ะฝะฐะฑะพั€ะฐั…:

    # nft add rule inet filter input ip daddr . tcp dport \
    { 10.0.0.0/8 . 10-23, 192.168.1.1-192.168.3.8 . 80-443 } accept

  • ะŸั€ะตะดะพัั‚ะฐะฒะปะตะฝะฐ ะฒะพะทะผะพะถะฝะพัั‚ัŒ ะพั‚ะฑั€ะฐัั‹ะฒะฐะฝะธั ะฟะฐะบะตั‚ะพะฒ ั ั„ะปะฐะณะฐะผะธ 802.1q (VLAN) ะฟั€ะธ ะพะฑั€ะฐะฑะพั‚ะบะต ัะตั‚ะตะฒั‹ั… ะผะพัั‚ะพะฒ:

    # nft add rule bridge foo bar ether type vlan reject with tcp reset

  • ะ”ะพะฑะฐะฒะปะตะฝะฐ ะฟะพะดะดะตั€ะถะบะฐ ัะพะฟะพัั‚ะฐะฒะปะตะฝะธั ะฟะพ ะธะดะตะฝั‚ะธั„ะธะบะฐั‚ะพั€ัƒ TCP-ัะตะฐะฝัะฐ (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 packets=2 \
    bytes=122 src=192.168.2.1 dst=192.168.2.118 sport=53 dport=36424 packets=2 bytes=320 \
    [ASSURED] mark=0 use=1 id=2779986232

    # nft add rule foo bar ct id 2779986232 counter

เจธเจฐเฉ‹เจค: opennet.ru

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹