Cloudflare๋Š” XDP ํ•˜์œ„ ์‹œ์Šคํ…œ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ํŠธ๋ž˜ํ”ฝ ๋ถ„์„๊ธฐ์ธ xdpcap์„ ๊ฒŒ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค.

Cloudflare ํšŒ์‚ฌ ์ œ์‹œ ํ”„๋กœ์ ํŠธ ์—ด๊ธฐ xdpcap, ํ•˜์œ„ ์‹œ์Šคํ…œ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•๋œ tcpdump์™€ ์œ ์‚ฌํ•œ ๋„คํŠธ์›Œํฌ ํŒจํ‚ท ๋ถ„์„๊ธฐ๊ฐ€ ๊ฐœ๋ฐœ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. XDP (eXpress ๋ฐ์ดํ„ฐ ๊ฒฝ๋กœ). ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ๋Š” Go๋กœ ์ž‘์„ฑ๋˜์—ˆ์œผ๋ฉฐ ๋ฐฐํฌ์ž BSD ๋ผ์ด์„ผ์Šค์— ๋”ฐ๋ผ. ํ”„๋กœ์ ํŠธ๋„ ์ค€๋น„๋œ Go ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ eBPF ํŠธ๋ž˜ํ”ฝ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๊ธฐ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.

xdpcap ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” tcpdump/libpcap ํ•„ํ„ฐ๋ง ํ‘œํ˜„์‹๊ณผ ํ˜ธํ™˜๋˜๋ฉฐ ๋™์ผํ•œ ํ•˜๋“œ์›จ์–ด์—์„œ ํ›จ์”ฌ ๋” ๋งŽ์€ ์–‘์˜ ํŠธ๋ž˜ํ”ฝ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Xdpcap์€ Linux ์ปค๋„ ๋„คํŠธ์›Œํ‚น ์Šคํƒ(tcpdump)์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋˜๊ธฐ ์ „์— ํŒจํ‚ท์„ ์ฒ˜๋ฆฌํ•˜๋Š” Linux ์ปค๋„ XDP ํ•˜์œ„ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๋Š” ํ•„ํ„ฐ๋ง, DoS ๋ณดํ˜ธ ๋ฐ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ ์‹œ์Šคํ…œ๊ณผ ๊ฐ™์ด ์ผ๋ฐ˜ tcpdump๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š๋Š” ํ™˜๊ฒฝ์—์„œ ๋””๋ฒ„๊น…์—๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. XDP ์ฒ˜๋ฆฌ๊ธฐ์— ์˜ํ•ด ์‚ญ์ œ๋œ ํŒจํ‚ท์€ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

eBPF ๋ฐ XDP ํ•˜์œ„ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ ์„ฑ๋Šฅ์„ ๋‹ฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. eBPF๋Š” Linux ์ปค๋„์— ๋‚ด์žฅ๋œ ๋ฐ”์ดํŠธ์ฝ”๋“œ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋กœ, ์ด๋ฅผ ํ†ตํ•ด ์ˆ˜์‹ /๋ฐœ์‹  ํŒจํ‚ท์˜ ์ „๋‹ฌ ๋˜๋Š” ํ๊ธฐ ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๋Š” ๊ณ ์„ฑ๋Šฅ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. JIT ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด eBPF ๋ฐ”์ดํŠธ์ฝ”๋“œ๊ฐ€ ์ฆ‰์‹œ ๊ธฐ๊ณ„ ๋ช…๋ น์–ด๋กœ ๋ณ€ํ™˜๋˜๊ณ  ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ ์„ฑ๋Šฅ์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. XDP(eXpress Data Path) ํ•˜์œ„ ์‹œ์Šคํ…œ์€ ๋„คํŠธ์›Œํฌ ๋“œ๋ผ์ด๋ฒ„ ์ˆ˜์ค€์—์„œ BPF ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์œผ๋กœ eBPF๋ฅผ ๋ณด์™„ํ•˜๋ฉฐ, DMA ํŒจํ‚ท ๋ฒ„ํผ์— ๋Œ€ํ•œ ์ง์ ‘ ์•ก์„ธ์Šค๋ฅผ ์ง€์›ํ•˜๊ณ  skbuff ๋ฒ„ํผ๊ฐ€ ๋„คํŠธ์›Œํฌ ์Šคํƒ์— ์˜ํ•ด ํ• ๋‹น๋˜๊ธฐ ์ „ ๋‹จ๊ณ„์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

tcpdump์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ xdpcap ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” ๋จผ์ € ํ‘œ์ค€ libpcap ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์œ„ ์ˆ˜์ค€ ํŠธ๋ž˜ํ”ฝ ํ•„ํ„ฐ๋ง ๊ทœ์น™์„ cBPF(ํด๋ž˜์‹ BPF ํ‘œํ˜„)๋กœ ๋ณ€ํ™˜ํ•œ ๋‹ค์Œ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฅผ eBPF ๋ฃจํ‹ด ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. cbpfc, LLVM/Clang ๊ฐœ๋ฐœ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ถœ๋ ฅ ์‹œ ํŠธ๋ž˜ํ”ฝ ์ •๋ณด๋Š” ํ‘œ์ค€ pcap ํ˜•์‹์œผ๋กœ ์ €์žฅ๋˜๋ฏ€๋กœ tcpdump ๋ฐ ๊ธฐํƒ€ ๊ธฐ์กด ํŠธ๋ž˜ํ”ฝ ๋ถ„์„๊ธฐ์—์„œ ํ›„์† ์—ฐ๊ตฌ๋ฅผ ์œ„ํ•ด xdpcap์—์„œ ์ค€๋น„๋œ ํŠธ๋ž˜ํ”ฝ ๋คํ”„๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, DNS ํŠธ๋ž˜ํ”ฝ ์ •๋ณด๋ฅผ ์บก์ฒ˜ํ•˜๋ ค๋ฉด "tcpdump ip and udp port 53" ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  "xdpcap /path/to/hook ์บก์ฒ˜.pcap 'ip and udp port 53โ€ฒ"์„ ์‹คํ–‰ํ•œ ํ›„ ์บก์ฒ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. .pcap ํŒŒ์ผ(์˜ˆ: "tcpdump -r" ๋ช…๋ น ์‚ฌ์šฉ ๋˜๋Š” Wireshark)

์ถœ์ฒ˜ : opennet.ru

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