Linux์˜ ๋น ๋ฅธ ๋ผ์šฐํŒ… ๋ฐ NAT

IPv4 ์ฃผ์†Œ๊ฐ€ ๊ณ ๊ฐˆ๋จ์— ๋”ฐ๋ผ ๋งŽ์€ ํ†ต์‹  ์‚ฌ์—…์ž๋Š” ์ฃผ์†Œ ๋ณ€ํ™˜์„ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋„คํŠธ์›Œํฌ ์•ก์„ธ์Šค๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•˜๋Š” ํ•„์š”์„ฑ์— ์ง๋ฉดํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ์‚ฌ์—์„œ๋Š” ์ƒ์šฉ ์„œ๋ฒ„์—์„œ ์บ๋ฆฌ์–ด๊ธ‰ NAT ์„ฑ๋Šฅ์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์—ญ์‚ฌ์˜ ๋น„ํŠธ

IPv4 ์ฃผ์†Œ ๊ณต๊ฐ„ ๊ณ ๊ฐˆ์ด๋ผ๋Š” ์ฃผ์ œ๋Š” ๋” ์ด์ƒ ์ƒˆ๋กœ์šด ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์–ด๋–ค ์‹œ์ ์—์„œ RIPE์— ๋Œ€๊ธฐ์ž ๋ช…๋‹จ์ด ๋‚˜ํƒ€๋‚œ ๋‹ค์Œ ์ฃผ์†Œ ๋ธ”๋ก์ด ๊ฑฐ๋ž˜๋˜๊ณ  ์ด๋ฅผ ์ž„๋Œ€ํ•˜๋Š” ๊ฑฐ๋ž˜๊ฐ€ ์ฒด๊ฒฐ๋˜๋Š” ๊ตํ™˜์ด ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ์ ์ฐจ์ ์œผ๋กœ ํ†ต์‹  ์‚ฌ์—…์ž๋Š” ์ฃผ์†Œ ๋ฐ ํฌํŠธ ๋ณ€ํ™˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธํ„ฐ๋„ท ์•ก์„ธ์Šค ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€๋Š” ๊ฐ ๊ฐ€์ž…์ž์—๊ฒŒ "ํ™”์ดํŠธ" ์ฃผ์†Œ๋ฅผ ๋ฐœ๊ธ‰ํ•  ๋งŒํผ ์ถฉ๋ถ„ํ•œ ์ฃผ์†Œ๋ฅผ ํ™•๋ณดํ•˜์ง€ ๋ชปํ•œ ๋ฐ˜๋ฉด, ๋‹ค๋ฅธ ์ผ๋ถ€๋Š” 104์ฐจ ์‹œ์žฅ์—์„œ ์ฃผ์†Œ ๊ตฌ๋งค๋ฅผ ๊ฑฐ๋ถ€ํ•˜์—ฌ ๋น„์šฉ์„ ์ ˆ์•ฝํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ์žฅ๋น„ ์ œ์กฐ์—…์ฒด๊ฐ€ ์ด ์•„์ด๋””์–ด๋ฅผ ์ง€์ง€ํ•œ ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ ์ถ”๊ฐ€ ํ™•์žฅ ๋ชจ๋“ˆ์ด๋‚˜ ๋ผ์ด์„ผ์Šค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Juniper์˜ MX ๋ผ์šฐํ„ฐ ์ œํ’ˆ๊ตฐ(์ตœ์‹  MX204 ๋ฐ MX1 ์ œ์™ธ)์—์„œ NAPT๋Š” ๋ณ„๋„์˜ MS-MIC ์„œ๋น„์Šค ์นด๋“œ์—์„œ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ Cisco ASR9k์—๋Š” CGN ๋ผ์ด์„ผ์Šค๊ฐ€ ํ•„์š”ํ•˜๊ณ  Cisco ASR9k์—๋Š” ๋ณ„๋„์˜ A100K-ISM-9 ๋ชจ๋“ˆ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  AXNUMXK-CGN ๋ผ์ด์„ผ์Šค -LIC๋ฅผ ๊ทธ์—๊ฒŒ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ฆ๊ฑฐ์›€์„ ๋ˆ„๋ฆฌ๋ ค๋ฉด ๋งŽ์€ ๋น„์šฉ์ด ๋“ญ๋‹ˆ๋‹ค.

IPTables

NAT๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์—๋Š” ํŠน์ˆ˜ํ•œ ์ปดํ“จํŒ… ๋ฆฌ์†Œ์Šค๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์˜ˆ๋ฅผ ๋“ค์–ด ํ™ˆ ๋ผ์šฐํ„ฐ์— ์„ค์น˜๋œ ๋ฒ”์šฉ ํ”„๋กœ์„ธ์„œ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ†ต์‹  ์‚ฌ์—…์ž ๊ทœ๋ชจ์—์„œ ์ด ๋ฌธ์ œ๋Š” FreeBSD(ipfw/pf) ๋˜๋Š” GNU/Linux(iptables)๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์ƒ์šฉ ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” FreeBSD๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด... ๋‚˜๋Š” ๊ฝค ์˜ค๋ž˜ ์ „์— ์ด OS๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— GNU/Linux๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฃผ์†Œ ๋ณ€ํ™˜์„ ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์€ ์ „ํ˜€ ์–ด๋ ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋จผ์ € nat ํ…Œ์ด๋ธ”์˜ iptables์— ๊ทœ์น™์„ ๋“ฑ๋กํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

iptables -t nat -A POSTROUTING -s 100.64.0.0/10 -j SNAT --to <pool_start_addr>-<pool_end_addr> --persistent

์šด์˜ ์ฒด์ œ๋Š” ๋ชจ๋“  ํ™œ์„ฑ ์—ฐ๊ฒฐ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ํ•„์š”ํ•œ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” nf_conntrack ๋ชจ๋“ˆ์„ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ฏธ๋ฌ˜ํ•จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ์งธ, ํ†ต์‹  ์‚ฌ์—…์ž ๊ทœ๋ชจ์˜ NAT์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ณ€ํ™˜ ํ…Œ์ด๋ธ”์˜ ํฌ๊ธฐ๊ฐ€ ์น˜๋ช…์ ์ธ ๊ฐ’์œผ๋กœ ๋น ๋ฅด๊ฒŒ ์ฆ๊ฐ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„ ์ดˆ๊ณผ๋ฅผ ์กฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๋‚ด ์„œ๋ฒ„์—์„œ ์‚ฌ์šฉํ•œ ์„ค์ •์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค.

net.ipv4.ip_forward = 1
net.ipv4.ip_local_port_range = 8192 65535

net.netfilter.nf_conntrack_generic_timeout = 300
net.netfilter.nf_conntrack_tcp_timeout_syn_sent = 60
net.netfilter.nf_conntrack_tcp_timeout_syn_recv = 60
net.netfilter.nf_conntrack_tcp_timeout_established = 600
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 45
net.netfilter.nf_conntrack_tcp_timeout_last_ack = 30
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close = 10
net.netfilter.nf_conntrack_tcp_timeout_max_retrans = 300
net.netfilter.nf_conntrack_tcp_timeout_unacknowledged = 300
net.netfilter.nf_conntrack_udp_timeout = 30
net.netfilter.nf_conntrack_udp_timeout_stream = 60
net.netfilter.nf_conntrack_icmpv6_timeout = 30
net.netfilter.nf_conntrack_icmp_timeout = 30
net.netfilter.nf_conntrack_events_retry_timeout = 15
net.netfilter.nf_conntrack_checksum=0

๋‘˜์งธ, ๋ณ€ํ™˜ํ‘œ์˜ ๊ธฐ๋ณธ ํฌ๊ธฐ๋Š” ํ†ต์‹  ์‚ฌ์—…์ž์˜ ์กฐ๊ฑด์—์„œ ์ž‘๋™ํ•˜๋„๋ก ์„ค๊ณ„๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ๋Š˜๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค.

net.netfilter.nf_conntrack_max = 3145728

๋˜ํ•œ ๋ชจ๋“  ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ๋ฅผ ์ €์žฅํ•˜๋Š” ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ๋ฒ„ํ‚ท ์ˆ˜๋ฅผ ๋Š˜๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค(์ด๊ฒƒ์€ nf_conntrack ๋ชจ๋“ˆ์˜ ์˜ต์…˜์ž…๋‹ˆ๋‹ค).

options nf_conntrack hashsize=1572864

์ด๋Ÿฌํ•œ ๊ฐ„๋‹จํ•œ ์กฐ์ž‘ ํ›„์—๋Š” ๋งŽ์€ ์ˆ˜์˜ ํด๋ผ์ด์–ธํŠธ ์ฃผ์†Œ๋ฅผ ์™ธ๋ถ€ ์ฃผ์†Œ ํ’€๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋Š” ๋””์ž์ธ์ด ์–ป์–ด์ง‘๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ์†”๋ฃจ์…˜์˜ ์„ฑ๋Šฅ์€ ์•„์ง ๋งŽ์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. NAT์— GNU/Linux๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋Š” ์ฒซ ๋ฒˆ์งธ ์‹œ๋„(2013๋…„๊ฒฝ)์—์„œ ์„œ๋ฒ„(Xeon E7-0.8v5)๋‹น 1650Mpps์—์„œ ์•ฝ 2Gbit/s์˜ ์„ฑ๋Šฅ์„ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ดํ›„๋กœ GNU/Linux ์ปค๋„ ๋„คํŠธ์›Œํฌ ์Šคํƒ์—์„œ ๋‹ค์–‘ํ•œ ์ตœ์ ํ™”๊ฐ€ ์ด๋ฃจ์–ด์กŒ์œผ๋ฉฐ ๋™์ผํ•œ ํ•˜๋“œ์›จ์–ด์— ์žˆ๋Š” ํ•œ ์„œ๋ฒ„์˜ ์„ฑ๋Šฅ์€ 18-19 Mpps์—์„œ ๊ฑฐ์˜ 1.8-1.9 Gbit/s๋กœ ์ฆ๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค(์ด๋Š” ์ตœ๋Œ€๊ฐ’์ž…๋‹ˆ๋‹ค). , ๊ทธ๋Ÿฌ๋‚˜ ํ•˜๋‚˜์˜ ์„œ๋ฒ„์—์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ํŠธ๋ž˜ํ”ฝ ์–‘์— ๋Œ€ํ•œ ์ˆ˜์š”๋Š” ํ›จ์”ฌ ๋น ๋ฅด๊ฒŒ ์ฆ๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋‹ค์–‘ํ•œ ์„œ๋ฒ„์˜ ๋กœ๋“œ ๊ท ํ˜•์„ ์กฐ์ •ํ•˜๋Š” ์ฒด๊ณ„๊ฐ€ ๊ฐœ๋ฐœ๋˜์—ˆ์ง€๋งŒ ์ด๋กœ ์ธํ•ด ์ œ๊ณต๋˜๋Š” ์„œ๋น„์Šค ํ’ˆ์งˆ์„ ์„ค์ •, ์œ ์ง€ ๋ฐ ์œ ์ง€ํ•˜๋Š” ๋ณต์žก์„ฑ์ด ์ฆ๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

NFTable

์š”์ฆ˜ ์†Œํ”„ํŠธ์›จ์–ด "์ด๋™ ๊ฐ€๋ฐฉ"์˜ ์œ ํ–‰ ์ถ”์„ธ๋Š” DPDK ๋ฐ XDP๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์ฃผ์ œ์— ๊ด€ํ•ด ๋งŽ์€ ๊ธฐ์‚ฌ๊ฐ€ ์ž‘์„ฑ๋˜์—ˆ๊ณ  ๋‹ค์–‘ํ•œ ์—ฐ์„ค์ด ์ด๋ฃจ์–ด์กŒ์œผ๋ฉฐ ์ƒ์šฉ ์ œํ’ˆ์ด ๋“ฑ์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: VasExperts์˜ SKAT). ๊ทธ๋Ÿฌ๋‚˜ ํ†ต์‹  ์‚ฌ์—…์ž์˜ ์ œํ•œ๋œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณ ๋ คํ•  ๋•Œ ์ด๋Ÿฌํ•œ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž์ฒด์ ์œผ๋กœ "์ œํ’ˆ"์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์ƒ๋‹นํžˆ ๋ฌธ์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์•ž์œผ๋กœ ์ด๋Ÿฌํ•œ ์†”๋ฃจ์…˜์„ ์šด์˜ํ•˜๋Š” ๊ฒƒ์€ ํ›จ์”ฌ ๋” ์–ด๋ ค์šธ ๊ฒƒ์ด๋ฉฐ, ํŠนํžˆ ์ง„๋‹จ ๋„๊ตฌ๊ฐ€ ๊ฐœ๋ฐœ๋˜์–ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด DPDK๊ฐ€ ํฌํ•จ๋œ ํ‘œ์ค€ tcpdump๋Š” ์ด์™€ ๊ฐ™์ด ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฉฐ XDP๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํšŒ์„ ์œผ๋กœ ๋‹ค์‹œ ์ „์†ก๋œ ํŒจํ‚ท์„ "์ธ์‹"ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŒจํ‚ท ์ „๋‹ฌ์„ ์‚ฌ์šฉ์ž ๊ณต๊ฐ„์œผ๋กœ ์ถœ๋ ฅํ•˜๋Š” ์ƒˆ๋กœ์šด ๊ธฐ์ˆ ์— ๋Œ€ํ•œ ๋ชจ๋“  ์ด์•ผ๊ธฐ ์†์—์„œ ๊ทธ๋“ค์€ ๋ˆˆ์— ๋„์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ณด๊ณ ์„œ ะธ ์กฐํ•ญ iptables ๊ด€๋ฆฌ์ž์ธ Pablo Neira Ayuso๊ฐ€ nftables์˜ ํ๋ฆ„ ์˜คํ”„๋กœ๋”ฉ ๊ฐœ๋ฐœ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋” ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ฃผ์š” ์•„์ด๋””์–ด๋Š” ๋ผ์šฐํ„ฐ๊ฐ€ ํ๋ฆ„์˜ ์–‘๋ฐฉํ–ฅ์œผ๋กœ ํ•œ ์„ธ์…˜์˜ ํŒจํ‚ท์„ ์ „๋‹ฌํ•œ ๊ฒฝ์šฐ(TCP ์„ธ์…˜์ด ESTABLISHED ์ƒํƒœ๋กœ ์ „ํ™˜๋จ) ๋ชจ๋“  ๋ฐฉํ™”๋ฒฝ ๊ทœ์น™์„ ํ†ตํ•ด ์ด ์„ธ์…˜์˜ ํ›„์† ํŒจํ‚ท์„ ์ „๋‹ฌํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ชจ๋“  ๊ฒ€์‚ฌ๋Š” ํŒจํ‚ท์ด ๋ผ์šฐํŒ…์œผ๋กœ ๋” ์ „์†ก๋˜๋ฉด์„œ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ ๊ฒฝ๋กœ๋ฅผ ์„ ํƒํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด ์„ธ์…˜ ๋‚ด์—์„œ ์–ด๋–ค ์ธํ„ฐํŽ˜์ด์Šค์™€ ์–ด๋–ค ํ˜ธ์ŠคํŠธ๋กœ ํŒจํ‚ท์„ ๋ณด๋‚ด์•ผ ํ•˜๋Š”์ง€ ์ด๋ฏธ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚จ์€ ๊ฒƒ์€ ์ด ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ํŒจํ‚ท ์ฒ˜๋ฆฌ ์ดˆ๊ธฐ ๋‹จ๊ณ„์—์„œ ๋ผ์šฐํŒ…์— ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. NAT ์ˆ˜ํ–‰ ์‹œ nf_conntrack ๋ชจ๋“ˆ์—์„œ ๋ณ€ํ™˜๋œ ์ฃผ์†Œ ๋ฐ ํฌํŠธ ๋ณ€๊ฒฝ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€๋กœ ์ €์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ, ๋ฌผ๋ก  ์ด ๊ฒฝ์šฐ iptables์˜ ๋‹ค์–‘ํ•œ ์ •์ฑ…๊ณผ ๊ธฐํƒ€ ์ •๋ณด ๋ฐ ํ†ต๊ณ„ ๊ทœ์น™์ด ์ž‘๋™์„ ์ค‘์ง€ํ•˜์ง€๋งŒ ๋ณ„๋„์˜ ์ƒ์„ค NAT ์ž‘์—… ํ”„๋ ˆ์ž„์›Œํฌ ๋‚ด์—์„œ ๋˜๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด ๊ตญ๊ฒฝ์—์„œ๋Š” ๊ทธ๋‹ค์ง€ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์žฅ์น˜์— ๋ถ„์‚ฐ๋ฉ๋‹ˆ๋‹ค.

๊ตฌ์„ฑ

์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • ์ƒˆ๋กœ์šด ์ปค๋„์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ๊ธฐ๋Šฅ ์ž์ฒด๊ฐ€ ์ปค๋„ 4.16์— ๋“ฑ์žฅํ–ˆ๋‹ค๋Š” ์‚ฌ์‹ค์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๊ฝค ์˜ค๋žซ๋™์•ˆ ์ด ๊ธฐ๋Šฅ์€ ๋งค์šฐ "์›์‹œ์ "์ด์—ˆ๊ณ  ์ •๊ธฐ์ ์œผ๋กœ ์ปค๋„ ํŒจ๋‹‰์„ ์ผ์œผ์ผฐ์Šต๋‹ˆ๋‹ค. LTS ์ปค๋„ 2019 ๋ฐ 4.19.90๊ฐ€ ์ถœ์‹œ๋œ 5.4.5๋…„ XNUMX์›”์ฏค ๋ชจ๋“  ๊ฒƒ์ด ์•ˆ์ •ํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์ตœ์‹  ๋ฒ„์ „์˜ nftables๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ nftables ํ˜•์‹์œผ๋กœ iptables ๊ทœ์น™์„ ๋‹ค์‹œ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋ฒ„์ „ 0.9.0์—์„œ ์ •ํ™•ํžˆ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์›์น™์ ์œผ๋กœ ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ์œผ๋กœ ๋ชจ๋“  ๊ฒƒ์ด ๋ช…ํ™•ํ•˜๋‹ค๋ฉด ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ์กฐ๋ฆฝ ์ค‘์— ๊ตฌ์„ฑ์— ๋ชจ๋“ˆ์„ ํฌํ•จํ•˜๋Š” ๊ฒƒ์„ ์žŠ์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(CONFIG_NFT_FLOW_OFFLOAD=m). ๊ทธ๋Ÿฌ๋ฉด ๋‘ ๋ฒˆ์งธ ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์„ค๋ช…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. nftables ๊ทœ์น™์€ iptables์™€ ์™„์ „ํžˆ ๋‹ค๋ฅด๊ฒŒ ์„ค๋ช…๋ฉ๋‹ˆ๋‹ค. ะ”ะพะบัƒะผะตะฝั‚ะฐั†ะธั ๊ฑฐ์˜ ๋ชจ๋“  ํฌ์ธํŠธ๋ฅผ ๊ณต๊ฐœํ•˜๋ฉฐ ํŠน๋ณ„ํ•œ ํฌ์ธํŠธ๋„ ์žˆ์Šต๋‹ˆ๋‹ค ๋ณ€ํ™˜๊ธฐ iptables์—์„œ nftables๊นŒ์ง€์˜ ๊ทœ์น™. ๋”ฐ๋ผ์„œ NAT ๋ฐ ํ๋ฆ„ ์˜คํ”„๋กœ๋“œ ์„ค์ •์˜ ์˜ˆ๋งŒ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ž‘์€ ๋ฒ”๋ก€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. , - ํŠธ๋ž˜ํ”ฝ์ด ํ†ต๊ณผํ•˜๋Š” ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค์ด๋ฉฐ ์‹ค์ œ๋กœ๋Š” ๋‘ ๊ฐœ ์ด์ƒ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. , โ€” "ํฐ์ƒ‰" ์ฃผ์†Œ ๋ฒ”์œ„์˜ ์‹œ์ž‘ ๋ฐ ๋ ์ฃผ์†Œ.

NAT ๊ตฌ์„ฑ์€ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

#! /usr/sbin/nft -f

table nat {
        chain postrouting {
                type nat hook postrouting priority 100;
                oif <o_if> snat to <pool_addr_start>-<pool_addr_end> persistent
        }
}

ํ๋ฆ„ ์˜คํ”„๋กœ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์กฐ๊ธˆ ๋” ๋ณต์žกํ•˜์ง€๋งŒ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

#! /usr/sbin/nft -f

table inet filter {
        flowtable fastnat {
                hook ingress priority 0
                devices = { <i_if>, <o_if> }
        }

        chain forward {
                type filter hook forward priority 0; policy accept;
                ip protocol { tcp , udp } flow offload @fastnat;
        }
}

์‚ฌ์‹ค ์ด๊ฒƒ์ด ์ „์ฒด ์„ค์ •์ž…๋‹ˆ๋‹ค. ์ด์ œ ๋ชจ๋“  TCP/UDP ํŠธ๋ž˜ํ”ฝ์€ fastnat ํ…Œ์ด๋ธ”์— ํฌํ•จ๋˜์–ด ํ›จ์”ฌ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

์กฐ์‚ฌ ๊ฒฐ๊ณผ

์ด๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ "ํ›จ์”ฌ ๋” ๋น ๋ฅธ์ง€" ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ๋™์ผํ•œ ํ•˜๋“œ์›จ์–ด(Xeon E5-1650v2), ๋™์ผ ๊ตฌ์„ฑ, ๋™์ผํ•œ Linux ์ปค๋„์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ iptables์—์„œ NAT๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋‘ ๊ฐœ์˜ ์‹ค์ œ ์„œ๋ฒ„์— ๋Œ€ํ•œ ๋กœ๋“œ ์Šคํฌ๋ฆฐ์ƒท์„ ์ฒจ๋ถ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. (NAT4) ๋ฐ nftables (NAT5)์—์„œ.

Linux์˜ ๋น ๋ฅธ ๋ผ์šฐํŒ… ๋ฐ NAT

์Šคํฌ๋ฆฐ์ƒท์—๋Š” ์ดˆ๋‹น ํŒจํ‚ท ์ˆ˜์— ๋Œ€ํ•œ ๊ทธ๋ž˜ํ”„๊ฐ€ ์—†์ง€๋งŒ ์ด๋“ค ์„œ๋ฒ„์˜ ๋กœ๋“œ ํ”„๋กœํ•„์„ ๋ณด๋ฉด ํ‰๊ท  ํŒจํ‚ท ํฌ๊ธฐ๊ฐ€ 800๋ฐ”์ดํŠธ ์ •๋„์ด๋ฏ€๋กœ ๊ทธ ๊ฐ’์€ ์ตœ๋Œ€ 1.5Mpps์— ์ด๋ฆ…๋‹ˆ๋‹ค. ๋ณด์‹œ๋‹ค์‹œํ”ผ, nftables๊ฐ€ ์žˆ๋Š” ์„œ๋ฒ„๋Š” ์—„์ฒญ๋‚œ ์„ฑ๋Šฅ์„ ๋ณด์œ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์ด ์„œ๋ฒ„๋Š” 30Mpps์—์„œ ์ตœ๋Œ€ 3Gbit/s๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฉฐ 40Gbps์˜ ๋ฌผ๋ฆฌ์  ๋„คํŠธ์›Œํฌ ์ œํ•œ์„ ์ถฉ์กฑํ•˜๋Š” ๋™์‹œ์— ์—ฌ์œ  CPU ๋ฆฌ์†Œ์Šค๋ฅผ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์ž๋ฃŒ๊ฐ€ ์„œ๋ฒ„ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋ ค๋Š” ๋„คํŠธ์›Œํฌ ์—”์ง€๋‹ˆ์–ด์—๊ฒŒ ๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

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