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