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

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

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

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

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

  • "*" ๋งˆ์Šคํฌ ์š”์†Œ์— ๋Œ€ํ•œ ์ง€์›์ด ์„ธํŠธ ๋ชฉ๋ก์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์„ธํŠธ์— ์ •์˜๋œ ๋‹ค๋ฅธ ์š”์†Œ์— ์†ํ•˜์ง€ ์•Š๋Š” ๋ชจ๋“  ํŒจํ‚ค์ง€์— ๋Œ€ํ•ด ํŠธ๋ฆฌ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. table x { map blocklist { type ipv4_addr : verdict ํ”Œ๋ž˜๊ทธ ๊ฐ„๊ฒฉ ์š”์†Œ = { 192.168.0.0/16 : accept, 10.0.0.0/8 : accept, * : drop } } chain y { type filter Hook ํ”„๋ฆฌ๋ผ์šฐํŒ… ์šฐ์„ ์ˆœ์œ„ 0; ์ •์ฑ… ๋™์˜; IP Saddr vmap @blocklist } }
  • "--define" ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ช…๋ น์ค„์—์„œ ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. # cat test.nft table netdev x { chain y { ์œ ํ˜• ํ•„ํ„ฐ ํ›„ํฌ ์ˆ˜์‹  ์žฅ์น˜ = $dev ์šฐ์„  ์ˆœ์œ„ 0; ์ •์ฑ… ํ•˜๋ฝ; } } # nft โ€”define dev="{ eth0, eth1 }" -f test.nft
  • ๋งต ๋ชฉ๋ก์—์„œ๋Š” ์ƒ์ˆ˜(์ƒํƒœ ์ €์žฅ) ํ‘œํ˜„์‹์˜ ์‚ฌ์šฉ์ด ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. table inet filter { map portmap { type inet_service : verdict counter elements = { 22 counter packets 0 bytes 0 : jump ssh_input, * counter packets 0 bytes 0 : drop } } chain ssh_input { } chain wan_input { tcp dport vmap @portmap } ์ฒด์ธ ์‚ฌ์ „ ๋ผ์šฐํŒ… { ์œ ํ˜• ํ•„ํ„ฐ ํ›„ํฌ ์‚ฌ์ „ ๋ผ์šฐํŒ… ์šฐ์„ ์ˆœ์œ„ ์›์‹œ; ์ •์ฑ… ๋™์˜; iif vmap { "lo" : wan_input ์ ํ”„ } } }
  • ์ง€์ •๋œ ํŒจํ‚ท ๊ณ„์—ด์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๊ธฐ ๋ชฉ๋ก์„ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด "list Hooks" ๋ช…๋ น์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. # nft list Hooks ip device eth0 family ip { Hook ingress { +0000000010 chain netdev xy [nf_tables] +0000000300 chain inet mw [nf_tables] } ํ›„ํฌ ์ž…๋ ฅ { -0000000100 chain ip ab [nf_tables] +0000000300 chain inet mz [nf_tables] } ํ›„ํฌ ์ „๋‹ฌ { -0000000225 selinux_ipv4_forward 0000000000 ์ฒด์ธ ip ac [nf_tables] } ํ›„ํฌ ์ถœ๋ ฅ { -0000000225 selinux_ipv4_output } ํ›„ํฌ postrou ํŒ… { +0000000225 4 selinux_ipvXNUMX_postroute } }
  • ๋Œ€๊ธฐ์—ด ๋ธ”๋ก์„ ์‚ฌ์šฉํ•˜๋ฉด jhash, Symhash ๋ฐ numgen ํ‘œํ˜„์‹์„ ๊ฒฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ๊ณต๊ฐ„์˜ ๋Œ€๊ธฐ์—ด์— ํŒจํ‚ท์„ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. โ€ฆ Symhash ๋ชจ๋“œ 65536์— ๋Œ€ํ•œ ๋Œ€๊ธฐ์—ด โ€ฆ ๋Œ€๊ธฐ์—ด ํ”Œ๋ž˜๊ทธ๋Š” numgen inc mod 65536์— ๋Œ€ํ•œ ์šฐํšŒ โ€ฆ jhash oif์— ๋Œ€ํ•œ ๋Œ€๊ธฐ์—ด. Meta mark mod 32 "queue"๋Š” ๋งต ๋ชฉ๋ก๊ณผ ๊ฒฐํ•ฉํ•˜์—ฌ ์ž„์˜์˜ ํ‚ค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ฌ์šฉ์ž ๊ณต๊ฐ„์—์„œ ๋Œ€๊ธฐ์—ด์„ ์„ ํƒํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ... ๋Œ€๊ธฐ์—ด ํ”Œ๋ž˜๊ทธ๋Š” oifname map { "eth0" : 0, "ppp0" : 2, "eth1" : 2 }๋กœ ์šฐํšŒ๋ฉ๋‹ˆ๋‹ค.
  • ์„ธํŠธ ๋ชฉ๋ก์„ ํฌํ•จํ•˜๋Š” ๋ณ€์ˆ˜๋ฅผ ์—ฌ๋Ÿฌ ๋งต์œผ๋กœ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜ = { eth0, eth1 } ํ…Œ์ด๋ธ” ip x { ์ฒด์ธ y { ์œ ํ˜• ํ•„ํ„ฐ ํ›„ํฌ ์ž…๋ ฅ ์šฐ์„ ์ˆœ์œ„ 0; ์ •์ฑ… ๋™์˜; iifname vmap { lo : accept, $interfaces : drop } } } # nft -f x.nft # nft ๋ชฉ๋ก ๊ทœ์น™ ์„ธํŠธ table ip x { chain y { type filter Hook ์ž…๋ ฅ ์šฐ์„ ์ˆœ์œ„ 0; ์ •์ฑ… ๋™์˜; iifname vmap { "lo" : ์ˆ˜๋ฝ, "eth0" : ์‚ญ์ œ, "eth1" : ์‚ญ์ œ } } }
  • ์ผ์ • ๊ฐ„๊ฒฉ์œผ๋กœ vmap(ํŒ๊ฒฐ ๋งต)์„ ๊ฒฐํ•ฉํ•˜๋Š” ๊ฒƒ์ด ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. # nft add rule xy tcp dport . IP saddr vmap { 1025-65535 . 192.168.10.2 : ์ˆ˜๋ฝ }
  • NAT ๋งคํ•‘์„ ์œ„ํ•œ ๋‹จ์ˆœํ™”๋œ ๊ตฌ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ฃผ์†Œ ๋ฒ”์œ„ ์ง€์ •์ด ํ—ˆ์šฉ๋จ: ... snat to ip saddr map { 10.141.11.4 : 192.168.2.2-192.168.2.4 } ๋˜๋Š” ๋ช…์‹œ์  IP ์ฃผ์†Œ ๋ฐ ํฌํŠธ: ... dnat to ip saddr map { 10.141.11.4 : 192.168.2.3 . 80 } ๋˜๋Š” IP ๋ฒ”์œ„์™€ ํฌํŠธ์˜ ์กฐํ•ฉ: ... dnat์—์„œ ip saddr๋กœ. tcp dport ๋งต { 192.168.1.2 . 80: 10.141.10.2-10.141.10.5. 8888-8999 }

์ถœ์ฒ˜ : opennet.ru

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