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

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

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

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

  • ์„ธํŠธ ์š”์†Œ์™€ ๊ด€๋ จ๋œ ํŒจํ‚ท ๋ฐ ํŠธ๋ž˜ํ”ฝ ์นด์šดํ„ฐ์— ๋Œ€ํ•œ ์ง€์›์ด ์„ธํŠธ์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์นด์šดํ„ฐ๋Š” "counter" ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.

    ํ…Œ์ด๋ธ” IP x {
    ์„ธํŠธ y {
    ์œ ํ˜•์˜ ip saddr
    ์นด์šดํ„ฐ
    ์š”์†Œ = {192.168.10.35, 192.168.10.101, 192.168.10.135}
    }

    ์ฒด์ธ z {
    ์œ ํ˜• ํ•„ํ„ฐ ํ›„ํฌ ์ถœ๋ ฅ ์šฐ์„  ์ˆœ์œ„ ํ•„ํ„ฐ; ์ •์ฑ… ๋™์˜;
    IP ์•„๋น  @y
    }
    }

  • ์˜ˆ๋ฅผ ๋“ค์–ด, ์žฌ์‹œ์ž‘ ํ›„ ์ด์ „ ์นด์šดํ„ฐ๋ฅผ ๋ณต์›ํ•˜๊ธฐ ์œ„ํ•ด ์นด์šดํ„ฐ์˜ ์ดˆ๊ธฐ ๊ฐ’์„ ์„ค์ •ํ•˜๋ ค๋ฉด "nft -f" ๋ช…๋ น์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    # ๊ณ ์–‘์ด ๊ทœ์น™ ์„ธํŠธ.nft
    ํ…Œ์ด๋ธ” IP x {
    ์„ธํŠธ y {
    ์œ ํ˜•์˜ ip saddr
    ์นด์šดํ„ฐ
    ์š”์†Œ = { 192.168.10.35 ์นด์šดํ„ฐ ํŒจํ‚ท 1๋ฐ”์ดํŠธ 84, 192.168.10.101 \
    ์นด์šดํ„ฐ p 192.168.10.135 ์นด์šดํ„ฐ ํŒจํ‚ท 0๋ฐ”์ดํŠธ 0 }
    }

    ์ฒด์ธ z {
    ์œ ํ˜• ํ•„ํ„ฐ ํ›„ํฌ ์ถœ๋ ฅ ์šฐ์„  ์ˆœ์œ„ ํ•„ํ„ฐ; ์ •์ฑ… ๋™์˜;
    IP ์•„๋น  @y
    }
    }
    # nft -f ๊ทœ์น™ ์„ธํŠธ.nft
    #nft ๋ชฉ๋ก ๊ทœ์น™ ์„ธํŠธ
    ํ…Œ์ด๋ธ” IP x {
    ์„ธํŠธ y {
    ์œ ํ˜•์˜ ip saddr
    ์นด์šดํ„ฐ
    ์š”์†Œ = { 192.168.10.35 ์นด์šดํ„ฐ ํŒจํ‚ท 1๋ฐ”์ดํŠธ 84, 192.168.10.101 \
    ์นด์šดํ„ฐ p 192.168.10.135 ์นด์šดํ„ฐ ํŒจํ‚ท 0๋ฐ”์ดํŠธ 0 }
    }

    ์ฒด์ธ z {
    ์œ ํ˜• ํ•„ํ„ฐ ํ›„ํฌ ์ถœ๋ ฅ ์šฐ์„  ์ˆœ์œ„ ํ•„ํ„ฐ; ์ •์ฑ… ๋™์˜;
    IP ์•„๋น  @y
    }
    }

  • ์นด์šดํ„ฐ ์ง€์›๋„ flowtable์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

    ํ…Œ์ด๋ธ” IP ํ‘ธ {
    ํ”Œ๋กœ์šฐํ…Œ์ด๋ธ” ๋ฐ” {
    ํ›„ํฌ ์ˆ˜์‹  ์šฐ์„ ์ˆœ์œ„ -100
    ์žฅ์น˜ = { eth0, eth1 }
    ์นด์šดํ„ฐ
    }

    ์ฒด์ธ ํฌ์›Œ๋“œ {
    ์œ ํ˜• ํ•„ํ„ฐ ํ›„ํฌ ์ˆœ๋ฐฉํ–ฅ ์šฐ์„  ์ˆœ์œ„ ํ•„ํ„ฐ;
    ํ๋ฆ„ ์ถ”๊ฐ€ @bar ์นด์šดํ„ฐ
    }
    }

    "conntrack -L" ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์นด์šดํ„ฐ ๋ชฉ๋ก์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    tcp 6 src=192.168.10.2 dst=10.0.1.2 sport=47278 dport=5201 ํŒจํ‚ท=9๋ฐ”์ดํŠธ=608 \
    src=10.0.1.2 dst=10.0.1.1 sport=5201 dport=47278 packets=8 bytes=428 [OFFLOAD] mark=0 \
    secctx=null ์‚ฌ์šฉ=2 tcp 6 src=192.168.10.2 dst=10.0.1.2 sport=47280 dport=5201 \
    ํŒจํ‚ท=1005763๋ฐ”์ดํŠธ=44075714753 src=10.0.1.2 dst=10.0.1.1 ์Šคํฌ์ธ =5201 dport=47280 \
    ํŒจํ‚ท=967505๋ฐ”์ดํŠธ=50310268 [OFFLOAD] ํ‘œ์‹œ=0 secctx=null ์‚ฌ์šฉ=2

  • ์—ฐ๊ฒฐ ์„ธํŠธ(์—ฐ๊ฒฐ, ๋น„๊ต๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๋Š” ํŠน์ • ์ฃผ์†Œ ๋ฐ ํฌํŠธ ๋ฒˆ๋“ค)์—์„œ๋Š” ์„ธํŠธ ์š”์†Œ์˜ ๊ตฌ์„ฑ ๋ถ€๋ถ„์— ๋Œ€ํ•œ ์š”์†Œ์˜ ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ๊ฒฐ์ •ํ•˜๋Š” "typeof" ์ง€์‹œ์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ํ…Œ์ด๋ธ” IP ํ‘ธ {
    ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ ์„ค์ • {
    ์œ ํ˜•์€ ip saddr์ž…๋‹ˆ๋‹ค. TCP ํฌํŠธ
    ์š”์†Œ = { 192.168.10.35 . 80, 192.168.10.101. 80}
    }

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

  • typeof ์ง€์‹œ๋ฌธ์€ ์ด์ œ ๋งต ๋ชฉ๋ก์˜ ์กฐ์ธ์—๋„ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

    ํ…Œ์ด๋ธ” IP ํ‘ธ {
    ์ง€๋„ addr2mark {
    ์œ ํ˜•์€ ip saddr์ž…๋‹ˆ๋‹ค. tcp dport : ๋ฉ”ํƒ€ ๋งˆํฌ
    ์š”์†Œ = { 192.168.10.35 . 80 : 0x00000001,
    192.168.10.135. 80 : 0x00000002 }
    }

    ์ฒด์ธ ๋ฐ” {
    ์œ ํ˜• ํ•„ํ„ฐ ํ›„ํฌ ์‚ฌ์ „ ๋ผ์šฐํŒ… ์šฐ์„ ์ˆœ์œ„ ํ•„ํ„ฐ; ์ •์ฑ… ์‚ญ์ œ;
    ๋ฉ”ํƒ€ ๋งˆํฌ๋Š” ip Daddr๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. tcp dport ๋งต @addr2mark ์ˆ˜๋ฝ
    }
    }

  • ์ต๋ช…(์ด๋ฆ„ ์—†์Œ) ์ง‘ํ•ฉ์˜ ๋ฒ”์œ„ ์กฐ์ธ์— ๋Œ€ํ•œ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

    # nft ์ถ”๊ฐ€ ๊ทœ์น™ inet ํ•„ํ„ฐ ์ž…๋ ฅ ip Daddr. TCP ํฌํŠธ\
    { 10.0.0.0/8 . 10-23, 192.168.1.1-192.168.3.8. 80-443 } ์ˆ˜๋ฝ

  • ๋„คํŠธ์›Œํฌ ๋ธŒ๋ฆฌ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ 802.1q(VLAN) ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ๋Š” ํŒจํ‚ท์„ ์‚ญ์ œํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

    # nft ์ถ”๊ฐ€ ๊ทœ์น™ ๋ธŒ๋ฆฌ์ง€ foo bar ์—ํ…Œ๋ฅด ์œ ํ˜• vlan ๊ฑฐ๋ถ€(tcp ์žฌ์„ค์ • ํฌํ•จ)

  • TCP ์„ธ์…˜ ์‹๋ณ„์ž(conntrack ID)๋ณ„ ์ผ์น˜์— ๋Œ€ํ•œ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. conntrack ID๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด "--output id" ์˜ต์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    # conntrack -L โ€”์ถœ๋ ฅ ID
    UDP 17 18 src=192.168.2.118 dst=192.168.2.1 ์Šคํฌ์ธ =36424 dport=53 ํŒจํ‚ท=2 \
    bytes=122 src=192.168.2.1 dst=192.168.2.118 sport=53 dport=36424 packets=2 bytes=320 \
    [๋ณด์ฆ๋จ] mark=0 ์‚ฌ์šฉ=1 id=2779986232

    # nft ์ถ”๊ฐ€ ๊ทœ์น™ foo bar ct id 2779986232 ์นด์šดํ„ฐ

์ถœ์ฒ˜ : opennet.ru

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