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

IPv1.0.3, IPv4, ARP ๋ฐ ๋„คํŠธ์›Œํฌ ๋ธŒ๋ฆฌ์ง€์— ๋Œ€ํ•œ ํŒจํ‚ท ํ•„ํ„ฐ๋ง ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ฉํ•˜๋Š” ํŒจํ‚ท ํ•„ํ„ฐ nftables 6 ๋ฆด๋ฆฌ์Šค๊ฐ€ ๊ฒŒ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค(iptables, ip6table, arptables ๋ฐ ebtables๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•จ). nftables 1.0.3 ๋ฆด๋ฆฌ์Šค๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ Linux 5.18 ์ปค๋„์— ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

nftables ํŒจํ‚ค์ง€์—๋Š” ์‚ฌ์šฉ์ž ๊ณต๊ฐ„์—์„œ ์‹คํ–‰๋˜๋Š” ํŒจํ‚ท ํ•„ํ„ฐ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ, ์ปค๋„ ์ˆ˜์ค€ ์ž‘์—…์€ ๋ฆด๋ฆฌ์Šค 3.13๋ถ€ํ„ฐ Linux ์ปค๋„์˜ ์ผ๋ถ€์˜€๋˜ nf_tables ํ•˜์œ„ ์‹œ์Šคํ…œ์—์„œ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ์ปค๋„ ์ˆ˜์ค€์€ ํŒจํ‚ท์—์„œ ๋ฐ์ดํ„ฐ ์ถ”์ถœ, ๋ฐ์ดํ„ฐ ์ž‘์—… ์ˆ˜ํ–‰ ๋ฐ ํ๋ฆ„ ์ œ์–ด๋ฅผ ์œ„ํ•œ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ํ”„๋กœํ† ์ฝœ ๋…๋ฆฝ์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

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

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

  • ์„ธํŠธ ๋ชฉ๋ก์€ ์ด์ œ ๋งˆ์Šคํฌ๋กœ ์ผ์น˜ํ•˜๋Š” ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค ์ด๋ฆ„์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด "*" ๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์ •๋ฉ๋‹ˆ๋‹ค. table inet testifsets { set simple_wild { type ifname flags ๊ฐ„๊ฒฉ ์š”์†Œ = { "abcdef*", "othername", "ppp0" } } chain v4icmp { ์œ ํ˜• ํ•„ํ„ฐ ํ›„ํฌ ์ž…๋ ฅ ์šฐ์„ ์ˆœ์œ„ 0; ์ •์ฑ… ๋™์˜; iifname @simple_wild ์นด์šดํ„ฐ ํŒจํ‚ท 0๋ฐ”์ดํŠธ 0 iifname { โ€œabcdef*โ€, โ€œeth0โ€ } ์นด์šดํ„ฐ ํŒจํ‚ท 0๋ฐ”์ดํŠธ 0 } }
  • ์ž‘์—… ์ค‘ ๊ต์ฐจํ•˜๋Š” ์„ธํŠธ ๋ชฉ๋ก ์š”์†Œ์˜ ์ž๋™ ๋ณ‘ํ•ฉ์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ „์—๋Š” '์ž๋™ ๋ณ‘ํ•ฉ' ์˜ต์…˜์„ ์„ค์ •ํ•˜๋ฉด ๊ทœ์น™์„ ์„ ์–ธํ•˜๋Š” ๋‹จ๊ณ„์—์„œ ๋ณ‘ํ•ฉ์ด ์ด๋ฃจ์–ด์กŒ์œผ๋‚˜, ์ด์ œ๋Š” ์ž‘์—… ์ค‘ ์ƒˆ๋กœ์šด ์š”์†Œ๊ฐ€ ์ ์ง„์ ์œผ๋กœ ์ถ”๊ฐ€๋˜๋Š” ๊ฒฝ์šฐ์—๋„ ๋ณ‘ํ•ฉ์ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์„ ์–ธ ๋‹จ๊ณ„์—์„œ ๋ชฉ๋ก ์„ธํŠธ y { ํ”Œ๋ž˜๊ทธ ๊ฐ„๊ฒฉ ์ž๋™ ๋ณ‘ํ•ฉ ์š”์†Œ = { 1.2.3.0, 1.2.3.255, 1.2.3.0/24, 3.3.3.3, 4.4.4.4, 4.4.4.4-4.4.4.8 , 3.3.3.4 , 3.3.3.5 } } ๋Š” ์š”์†Œ = { 1.2.3.0/24, 3.3.3.3-3.3.3.5, 4.4.4.4-4.4.4.8 } ๋กœ ๋ณ€ํ™˜๋˜๊ณ  ์ƒˆ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด # nft add ์š”์†Œ ip xy { 1.2.3.0 -1.2.4.255, 3.3.3.6 }์€ ์š”์†Œ = { 1.2.3.0-1.2.4.255, 3.3.3.3-3.3.3.6, 4.4.4.4-4.4.4.8 }์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

    ๊ธฐ์กด ๋ฒ”์œ„ ํ•ญ๋ชฉ์— ์†ํ•˜๋Š” ๋ชฉ๋ก์—์„œ ๊ฐœ๋ณ„ ํ•ญ๋ชฉ์„ ์ œ๊ฑฐํ•˜๋ฉด ๋ฒ”์œ„๊ฐ€ ๋‹จ์ถ•๋˜๊ฑฐ๋‚˜ ๋ถ„ํ• ๋ฉ๋‹ˆ๋‹ค.

  • ๋‹ค์ค‘ ์ฃผ์†Œ ๋ณ€ํ™˜(NAT) ๊ทœ์น™์„ ๋งต ๋ชฉ๋ก์œผ๋กœ ๊ฒฐํ•ฉํ•˜๊ธฐ ์œ„ํ•œ ์ง€์›์ด "-o/โ€”optimize" ์˜ต์…˜์ด ์ง€์ •๋œ ๊ฒฝ์šฐ ํ˜ธ์ถœ๋˜๋Š” ๊ทœ์น™ ์ตœ์ ํ™” ํ”„๋กœ๊ทธ๋žจ์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, # cat ruleset.nft ํ…Œ์ด๋ธ” ip x { chain y { type nat Hook postrouting Priority srcnat; ์ •์ฑ… ํ•˜๋ฝ; ip saddr 1.1.1.1 tcp dport 8000 snat์—์„œ 4.4.4.4:80 ip saddr 2.2.2.2 tcp dport 8001 snat์—์„œ 5.5.5.5:90 } }

    "nft -o -c -f ruleset.nft"๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋ณ„๋„์˜ "ip saddr" ๊ทœ์น™์ด ๋งต ๋ชฉ๋ก์œผ๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค( snat ์—์„œ ip saddr ). TCP dport ๋งต { 1.1.1.1 . 8000: 4.4.4.4. 80, 2.2.2.2. 8001: 5.5.5.5. 90}

    ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์›์‹œ ํ‘œํ˜„์‹์„ ๋งต ๋ชฉ๋ก์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. # cat ruleset.nft table ip x { [โ€ฆ 47 63x160,128e0e goto nat_dns_this_0 udp ๊ธธ์ด 373135363130333131303735353203-62 @th,78 160,128x0e0e goto nat_dns_saturn_31393032383939353831343037320 udp ๊ธธ์ด 5301-62 @th,78 160,128x0e0 31363436323733373931323934300 5301e goto nat_dns_saturn_62 udp ๊ธธ์ด 78-160,128 @th,0 0x32393535373539353636383732310e5302e goto nat_dns_saturn_62 drop } }

    ์ตœ์ ํ™” ํ›„ ์šฐ๋ฆฌ๋Š” ์ง€๋„ ๋ชฉ๋ก(udp length)์„ ์–ป์Šต๋‹ˆ๋‹ค. @th,160,128 vmap { 47-63 . 0x0e373135363130333131303735353203 : goto nat_dns_dnstc, 62-78 . 0x0e31393032383939353831343037320e : goto nat_dns_this_5301, 62-78 . 0x0e31363436323733373931323934300e : goto nat_dns_saturn_5301, 62-78 . 0x0e32393535373539353636383732310e : goto nat_dns_saturn_5302, 62-78 . 0x0e38353439353637323038363633390e : nat_dns_saturn_5303์œผ๋กœ ์ด๋™ }

  • ์—ฐ๊ฒฐ ์ž‘์—…์— ์›์‹œ ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ: #nft add rule xy ip saddr. @ih,32,32 { 1.1.1.1 . 0x14, 2.2.2.2 . 0x1e } ๋˜๋Š” ํ…Œ์ด๋ธ” x { set y { typeof ip saddr . @ih,32,32 ์š”์†Œ = { 1.1.1.1 . 0x14 } } }
  • ์—ฐ๊ฒฐ ์ž‘์—…์—์„œ ์ •์ˆ˜ ํ—ค๋” ํ•„๋“œ ์ง€์ •์— ๋Œ€ํ•œ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค: table inet t { map m1 { typeof udp length . @ih,32,32: ํŒ์ • ํ”Œ๋ž˜๊ทธ ๊ฐ„๊ฒฉ ์š”์†Œ = { 20-80 . 0x14 : ์ˆ˜๋ฝ, 1-10 . 0xa : drop } } chain c { ์œ ํ˜• ํ•„ํ„ฐ ํ›„ํฌ ์ž…๋ ฅ ์šฐ์„ ์ˆœ์œ„ 0; ์ •์ฑ… ํ•˜๋ฝ; UDP ๊ธธ์ด. @ih,32,32 vmap @m1 } }
  • TCP ์˜ต์…˜ ์žฌ์„ค์ •์— ๋Œ€ํ•œ ์ง€์› ์ถ”๊ฐ€(Linux ์ปค๋„ 5.18+์—์„œ๋งŒ ์ž‘๋™): tcp flags syn Reset tcp option sack-perm
  • ์ฒด์ธ ์ถœ๋ ฅ ๋ช…๋ น("nft list chain xy")์˜ ์‹คํ–‰์ด ๊ฐ€์†ํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : opennet.ru

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