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