nftables ํŒจํ‚ท ํ•„ํ„ฐ 0.9.4 ๋ฆด๋ฆฌ์Šค

๊ฒŒ์‹œ ๋จ ํŒจํ‚ท ํ•„ํ„ฐ ๋ฆด๋ฆฌ์Šค nftables 0.9.4, IPv6, IPv4, ARP ๋ฐ ๋„คํŠธ์›Œํฌ ๋ธŒ๋ฆฌ์ง€์šฉ ํŒจํ‚ท ํ•„ํ„ฐ๋ง ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ฉํ•˜์—ฌ iptables, ip6table, arptables ๋ฐ ebtables์˜ ๋Œ€์ฒดํ’ˆ์œผ๋กœ ๊ฐœ๋ฐœ ์ค‘์ž…๋‹ˆ๋‹ค. nftables ํŒจํ‚ค์ง€์—๋Š” ์‚ฌ์šฉ์ž ๊ณต๊ฐ„์—์„œ ์‹คํ–‰๋˜๋Š” ํŒจํ‚ท ํ•„ํ„ฐ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ ์ปค๋„ ์ˆ˜์ค€์€ ๋ฆด๋ฆฌ์Šค 3.13 ์ดํ›„ Linux ์ปค๋„์˜ ์ผ๋ถ€์ธ nf_tables ํ•˜์œ„ ์‹œ์Šคํ…œ์—์„œ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. nftables 0.9.4 ๋ฆด๋ฆฌ์Šค๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ํ–ฅํ›„ ์ปค๋„ ๋ถ„๊ธฐ์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. Linux 5.6.

์ปค๋„ ์ˆ˜์ค€์—์„œ๋Š” ํŒจํ‚ท์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•˜๊ณ  ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ ํ๋ฆ„์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์ผ๋ฐ˜ ํ”„๋กœํ† ์ฝœ ๋…๋ฆฝ์  ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ํ•„ํ„ฐ๋ง ๊ทœ์น™ ์ž์ฒด์™€ ํ”„๋กœํ† ์ฝœ๋ณ„ ํ•ธ๋“ค๋Ÿฌ๋Š” ์‚ฌ์šฉ์ž ๊ณต๊ฐ„ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผ๋œ ํ›„ ์ด ๋ฐ”์ดํŠธ์ฝ”๋“œ๊ฐ€ Netlink ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปค๋„์— ๋กœ๋“œ๋˜๊ณ  BPF(Berkeley Packet Filters)์™€ ์œ ์‚ฌํ•œ ํŠน์ˆ˜ ๊ฐ€์ƒ ๋จธ์‹ ์˜ ์ปค๋„์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ์ปค๋„ ์ˆ˜์ค€์—์„œ ์‹คํ–‰๋˜๋Š” ํ•„ํ„ฐ๋ง ์ฝ”๋“œ์˜ ํฌ๊ธฐ๋ฅผ ํฌ๊ฒŒ ์ค„์ด๊ณ  ๊ตฌ๋ฌธ ๋ถ„์„ ๊ทœ์น™์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ๊ณผ ํ”„๋กœํ† ์ฝœ ์ž‘์—… ๋…ผ๋ฆฌ๋ฅผ ์‚ฌ์šฉ์ž ๊ณต๊ฐ„์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์š” ํ˜์‹ :

  • ์กฐ์ธ์˜ ๋ฒ”์œ„ ์ง€์›(์—ฐ๊ฒฐ, ์ผ์น˜๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๋Š” ์ฃผ์†Œ ๋ฐ ํฌํŠธ์˜ ํŠน์ • ๋ฐ”์ธ๋”ฉ). ์˜ˆ๋ฅผ ๋“ค์–ด ์š”์†Œ๊ฐ€ ์ฒจ๋ถ€ ํŒŒ์ผ์ธ "ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ" ์ง‘ํ•ฉ์˜ ๊ฒฝ์šฐ "๊ฐ„๊ฒฉ" ํ”Œ๋ž˜๊ทธ๋ฅผ ์ง€์ •ํ•˜๋ฉด ์ง‘ํ•ฉ์ด ์ฒจ๋ถ€ ํŒŒ์ผ์˜ ๋ฒ”์œ„๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค(์ฒจ๋ถ€ ํŒŒ์ผ "ipv4_addr . ipv4_addr . inet_service"์˜ ๊ฒฝ์šฐ ์ด์ „์—๋Š” ์ •ํ™•ํ•œ "192.168.10.35"๊ณผ ๊ฐ™์ด ์ผ์น˜ํ•˜๋ฉฐ ์ด์ œ "192.68.11.123-80-192.168.10.35" ์ฃผ์†Œ ๊ทธ๋ฃน์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ํ…Œ์ด๋ธ” IP ํ‘ธ {
    ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ ์„ค์ • {
    ipv4_addr ์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. ipv4_addr . inet_service
    ํ”Œ๋ž˜๊ทธ ๊ฐ„๊ฒฉ
    ์š”์†Œ = { 192.168.10.35-192.168.10.40 . 192.68.11.123-192.168.11.125 . 80}
    }

    ์ฒด์ธ ๋ฐ” {
    ์œ ํ˜• ํ•„ํ„ฐ ํ›„ํฌ ์‚ฌ์ „ ๋ผ์šฐํŒ… ์šฐ์„ ์ˆœ์œ„ ํ•„ํ„ฐ; ์ •์ฑ… ์‚ญ์ œ;
    ์•„์ดํ”ผ ์‚ฌ๋“œ๋ฅด. ์•„์ดํ”ผ ์•„๋น . tcp dport@whitelist ์ˆ˜๋ฝ
    }
    }

  • ์ง‘ํ•ฉ ๋ฐ ๋งต ๋ชฉ๋ก์—์„œ ๋งคํ•‘ํ•  ๋•Œ ์š”์†Œ์˜ ํ˜•์‹์„ ๊ฒฐ์ •ํ•˜๋Š” "typeof" ์ง€์‹œ๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค

    ํ…Œ์ด๋ธ” IP ํ‘ธ {
    ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ ์„ค์ • {
    ์œ ํ˜•์˜ ip saddr
    ์š”์†Œ = {192.168.10.35, 192.168.10.101, 192.168.10.135}
    }

    ์ฒด์ธ ๋ฐ” {
    ์œ ํ˜• ํ•„ํ„ฐ ํ›„ํฌ ์‚ฌ์ „ ๋ผ์šฐํŒ… ์šฐ์„ ์ˆœ์œ„ ํ•„ํ„ฐ; ์ •์ฑ… ์‚ญ์ œ;
    ip daddr @whitelist ์ˆ˜๋ฝ
    }
    }

    ํ…Œ์ด๋ธ” IP ํ‘ธ {
    ์ง€๋„ addr2mark {
    typeof ip saddr : ๋ฉ”ํƒ€ ๋งˆํฌ
    ์š”์†Œ = { 192.168.10.35 : 0x00000001, 192.168.10.135 : 0x00000002 }
    }
    }

  • NAT ๋ฐ”์ธ๋”ฉ์—์„œ ์ฒจ๋ถ€ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋งต ๋ชฉ๋ก ๋˜๋Š” ๋ช…๋ช…๋œ ์ง‘ํ•ฉ์„ ๊ธฐ๋ฐ˜์œผ๋กœ NAT ๋ณ€ํ™˜์„ ์ •์˜ํ•  ๋•Œ ์ฃผ์†Œ์™€ ํฌํŠธ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    nft ์ถ”๊ฐ€ ๊ทœ์น™ ip nat pre dnat ip addr . ํฌํŠธ to ip saddr map {1.1.1.1: 2.2.2.2. ์„œ๋ฅธ }

    nft add map ip nat ๋ชฉ์ ์ง€ { type ipv4_addr . inet_service : ipv4_addr . inet_service\\; }
    nft ์ถ”๊ฐ€ ๊ทœ์น™ ip nat pre dnat ip addr . ip saddr๋กœ ํฌํŠธ. tcp dport ๋งต @destinations

  • ๋„คํŠธ์›Œํฌ ์นด๋“œ ์–ด๊นจ์—์„œ ์ผ๋ถ€ ํ•„ํ„ฐ๋ง ์ž‘์—…์„ ์ œ๊ฑฐํ•˜์—ฌ ํ•˜๋“œ์›จ์–ด ๊ฐ€์†์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์†์€ ethtool ์œ ํ‹ธ๋ฆฌํ‹ฐ("ethtool -K eth0 hw-tc-offload on")๋ฅผ ํ†ตํ•ด ํ™œ์„ฑํ™”๋œ ํ›„ "offload" ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”์ธ ์ฒด์ธ์˜ nftables์—์„œ ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค. Linux 5.6 ์ปค๋„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ˆ˜์‹ , ์‚ญ์ œ, ๋ณต์ œ(dup) ๋ฐ ์ „๋‹ฌ(fwd) ํŒจํ‚ท๊ณผ ํ•จ๊ป˜ ํ—ค๋” ํ•„๋“œ ์ผ์น˜ ๋ฐ ์ˆ˜์‹  ์ธํ„ฐํŽ˜์ด์Šค ๊ฒ€์‚ฌ๋ฅผ ์œ„ํ•ด ํ•˜๋“œ์›จ์–ด ๊ฐ€์†์ด ์ง€์›๋ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์—์„œ ์ฃผ์†Œ 192.168.30.20์—์„œ ์˜ค๋Š” ํŒจํ‚ท์„ ์‚ญ์ œํ•˜๋Š” ์ž‘์—…์€ ํŒจํ‚ท์„ ์ปค๋„๋กœ ์ „๋‹ฌํ•˜์ง€ ์•Š๊ณ  ๋„คํŠธ์›Œํฌ ์นด๋“œ ์ˆ˜์ค€์—์„œ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

    # ๊ณ ์–‘์ด ํŒŒ์ผ.nft
    ํ…Œ์ด๋ธ” netdev x {
    ์ฒด์ธ y {
    ์œ ํ˜• ํ•„ํ„ฐ ํ›„ํฌ ์ง„์ž… ์žฅ์น˜ eth0 ์šฐ์„  ์ˆœ์œ„ 10; ํ”Œ๋ž˜๊ทธ ์˜คํ”„๋กœ๋“œ;
    ip saddr 192.168.30.20 ๋“œ๋กญ
    }
    }
    # nft -f ํŒŒ์ผ.nft

  • ๊ทœ์น™์˜ ์˜ค๋ฅ˜ ์œ„์น˜์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๊ฐœ์„ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

    # nft ์‚ญ์ œ ๊ทœ์น™ ip yz ํ•ธ๋“ค 7
    ์˜ค๋ฅ˜: ๊ทœ์น™์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค: ํ•ด๋‹น ํŒŒ์ผ ๋˜๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
    ์‚ญ์ œ ๊ทœ์น™ ip yz ํ•ธ๋“ค 7
    ^

    # nft ์‚ญ์ œ ๊ทœ์น™ ip xx ํ•ธ๋“ค 7
    ์˜ค๋ฅ˜: ๊ทœ์น™์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค: ํ•ด๋‹น ํŒŒ์ผ ๋˜๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
    ์‚ญ์ œ ๊ทœ์น™ ip xx ํ•ธ๋“ค 7
    ^

    # nft ์‚ญ์ œ ํ…Œ์ด๋ธ” twst
    ์˜ค๋ฅ˜: ํ•ด๋‹น ํŒŒ์ผ์ด๋‚˜ ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐ€์กฑ IP์—์„œ 'ํ…Œ์ŠคํŠธ' ํ…Œ์ด๋ธ”์„ ์˜๋ฏธํ–ˆ์Šต๋‹ˆ๊นŒ?
    ํ…Œ์ด๋ธ” ํŠธ์œ„์ŠคํŠธ ์‚ญ์ œ
    ^^^^

    ์ฒซ ๋ฒˆ์งธ ์˜ˆ๋Š” ํ…Œ์ด๋ธ” 'y'๊ฐ€ ์‹œ์Šคํ…œ์— ์กด์žฌํ•˜์ง€ ์•Š์Œ์„ ๋ณด์—ฌ์ฃผ๊ณ , ๋‘ ๋ฒˆ์งธ๋Š” '7' ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋ˆ„๋ฝ๋˜์—ˆ์Œ์„ ๋ณด์—ฌ์ฃผ๋ฉฐ, ์„ธ ๋ฒˆ์งธ๋Š” ํ…Œ์ด๋ธ” ์ด๋ฆ„์„ ์ž…๋ ฅํ•  ๋•Œ ์˜คํƒ€ ํžŒํŠธ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

  • "meta sdif" ๋˜๋Š” "meta sdifname"์„ ์ง€์ •ํ•˜์—ฌ ์Šฌ๋ ˆ์ด๋ธŒ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

    โ€ฆ ๋ฉ”ํƒ€ sdifname vrf1 โ€ฆ

  • ์˜ค๋ฅธ์ชฝ ๋˜๋Š” ์™ผ์ชฝ ์ด๋™ ์ž‘์—…์— ๋Œ€ํ•œ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ธฐ์กด ํŒจํ‚ท ๋ ˆ์ด๋ธ”์„ ์™ผ์ชฝ์œผ๋กœ 1๋น„ํŠธ ์ด๋™ํ•˜๊ณ  ํ•˜์œ„ ๋น„ํŠธ๋ฅผ 1๋กœ ์„ค์ •ํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•˜์‹ญ์‹œ์˜ค.

    โ€ฆ ๋ฉ”ํƒ€ ๋งˆํฌ ์„ธํŠธ ๋ฉ”ํƒ€ ๋งˆํฌ lshift 1 ๋˜๋Š” 0x1 โ€ฆ

  • ํ™•์žฅ๋œ ๋ฒ„์ „ ์ •๋ณด๋ฅผ ํ‘œ์‹œํ•˜๋Š” "-V" ์˜ต์…˜์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

    #nft -V
    nftables v0.9.4(Jive at Five)
    cli:readline
    json:์˜ˆ
    minigmp:์•„๋‹ˆ์˜ค
    libxtables: ์˜ˆ

  • ๋ช…๋ น์ค„ ์˜ต์…˜์€ ์ด์ œ ๋ช…๋ น ์ „์— ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด "nft -a list ruleset"๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•˜๋ฉฐ "nft list ruleset -a"๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

    ์ถœ์ฒ˜ : opennet.ru

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€