DNSTap ๋ฐ BGP๋กœ ILV ์ฐจ๋‹จ ์šฐํšŒ

DNSTap ๋ฐ BGP๋กœ ILV ์ฐจ๋‹จ ์šฐํšŒ

์ฃผ์ œ๊ฐ€ ๊ฝค ๋‘๋“ค๊ฒจ ๋งž์•˜์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ›Œ๋ฅญํ•œ ๊ธฐ์‚ฌ, ๊ทธ๋Ÿฌ๋‚˜ ์ฐจ๋‹จ ๋ชฉ๋ก์˜ IP ๋ถ€๋ถ„๋งŒ ์—ฌ๊ธฐ์—์„œ ๊ณ ๋ ค๋ฉ๋‹ˆ๋‹ค. ๋„๋ฉ”์ธ๋„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๋ฒ•์›๊ณผ RKN์ด ๋ชจ๋“  ๊ฒƒ์„ ์ขŒ์šฐ๋กœ ์ฐจ๋‹จํ•˜๊ณ  ๊ณต๊ธ‰์ž๊ฐ€ Revizorro๊ฐ€ ๋ถ€๊ณผํ•œ ๋ฒŒ๊ธˆ์„ ๋ถ€๊ณผํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด ์—ด์‹ฌํžˆ ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฐจ๋‹จ์œผ๋กœ ์ธํ•œ ๊ด€๋ จ ์†์‹ค์ด ์ƒ๋‹นํžˆ ํฝ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  "ํ•ฉ๋ฒ•์ ์œผ๋กœ" ์ฐจ๋‹จ๋œ ์‚ฌ์ดํŠธ ์ค‘์—๋Š” ์œ ์šฉํ•œ ์‚ฌ์ดํŠธ๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค(hello, rutracker).

๋‚˜๋Š” RKN ๊ด€ํ• ๊ถŒ ๋ฐ–์— ์‚ด๊ณ  ์žˆ์ง€๋งŒ ๋ถ€๋ชจ๋‹˜, ์นœ์ฒ™, ์นœ๊ตฌ๋“ค์€ ์ง‘์— ๋‚จ์•„ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ IT์™€ ๊ฑฐ๋ฆฌ๊ฐ€ ๋จผ ์‚ฌ๋žŒ๋“ค์ด ๊ฐ€๊ธ‰์ ์ด๋ฉด ์ฐธ์—ฌํ•˜์ง€ ์•Š๊ณ  ์ฐจ๋‹จ์„ ์šฐํšŒํ•  ์ˆ˜ ์žˆ๋Š” ์‰ฌ์šด ๋ฐฉ๋ฒ•์„ ์ฐพ๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ๋…ธํŠธ์—์„œ๋Š” ๊ธฐ๋ณธ ๋„คํŠธ์›Œํฌ ํ•ญ๋ชฉ์„ ๋‹จ๊ณ„๋ณ„๋กœ ์„ค๋ช…ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ์ด ์ฒด๊ณ„๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ์›์น™์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ๋„คํŠธ์›Œํฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€, ํŠนํžˆ Linux์—์„œ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ง€์‹์ด ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ž ๊ธˆ ์œ ํ˜•

๋จผ์ € ๋ฌด์—‡์ด ์ฐจ๋‹จ๋˜๊ณ  ์žˆ๋Š”์ง€ ๊ธฐ์–ตํ•ด ๋ด…์‹œ๋‹ค.

RKN์—์„œ ์–ธ๋กœ๋“œ๋œ XML์—๋Š” ์—ฌ๋Ÿฌ ์œ ํ˜•์˜ ์ž ๊ธˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • IP
  • ๋„๋ฉ”์ธ ์ด๋ฆ„
  • URL

๋‹จ์ˆœํ™”๋ฅผ ์œ„ํ•ด IP์™€ ๋„๋ฉ”์ธ์˜ ๋‘ ๊ฐ€์ง€๋กœ ์ค„์ด๊ณ  URL ์ฐจ๋‹จ์—์„œ ๋„๋ฉ”์ธ์„ ๊ฐ„๋‹จํžˆ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค(๋” ์ •ํ™•ํ•˜๊ฒŒ๋Š” ์ด๋ฏธ ์šฐ๋ฆฌ๋ฅผ ์œ„ํ•ด ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค).

์˜ ์ข‹์€ ์‚ฌ๋žŒ๋“ค ๋กœ์Šค์ฝค๋ณด๋ณด๋‹ค ๋†€๋ผ์šด ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜๋‹ค API, ์ด๋ฅผ ํ†ตํ•ด ํ•„์š”ํ•œ ๊ฒƒ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐจ๋‹จ๋œ ์‚ฌ์ดํŠธ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค

์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ํŠธ๋ž˜ํ”ฝ์ด ๋ฌด์ œํ•œ์ธ ์ž‘์€ ์™ธ๋ถ€ VPS๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. 3-5๋‹ฌ๋Ÿฌ์— ๋งŽ์€ VPS๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•‘์ด ๊ทธ๋‹ค์ง€ ํฌ์ง€ ์•Š๋„๋ก ๊ฐ€๊นŒ์šด ํ•ด์™ธ์—์„œ ๊ฐ€์ ธ ๊ฐ€์•ผํ•˜์ง€๋งŒ ์ธํ„ฐ๋„ท๊ณผ ์ง€๋ฆฌ๊ฐ€ ํ•ญ์ƒ ์ผ์น˜ํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค๋Š” ์ ์„ ๋‹ค์‹œ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. ๊ทธ๋ฆฌ๊ณ  5๋‹ฌ๋Ÿฌ์— ๋Œ€ํ•œ SLA๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด๊ฒฐํ•จ์„ฑ์„ ์œ„ํ•ด ๋‹ค๋ฅธ ๊ณต๊ธ‰์ž๋กœ๋ถ€ํ„ฐ 2๊ฐœ ์ด์ƒ์˜ ๋ถ€ํ’ˆ์„ ๊ฐ€์ ธ๊ฐ€๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ ๋ผ์šฐํ„ฐ์—์„œ VPS๋กœ ์•”ํ˜ธํ™”๋œ ํ„ฐ๋„์„ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” Wireguard๋ฅผ ๊ฐ€์žฅ ๋น ๋ฅด๊ณ  ์‰ฝ๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Linux ๊ธฐ๋ฐ˜ ํด๋ผ์ด์–ธํŠธ ๋ผ์šฐํ„ฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค(APU2 ๋˜๋Š” OpenWRT์˜ ๋ฌด์–ธ๊ฐ€). ์ผ๋ถ€ Mikrotik/Cisco์˜ ๊ฒฝ์šฐ OpenVPN ๋ฐ GRE-over-IPSEC์™€ ๊ฐ™์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ด€์‹ฌ ํŠธ๋ž˜ํ”ฝ ์‹๋ณ„ ๋ฐ ๋ฆฌ๋””๋ ‰์…˜

๋ฌผ๋ก  ํ•ด์™ธ๋ฅผ ํ†ตํ•œ ๋ชจ๋“  ์ธํ„ฐ๋„ท ํŠธ๋ž˜ํ”ฝ์„ ๋Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋กœ ์ธํ•ด ๋กœ์ปฌ ์ฝ˜ํ…์ธ  ์ž‘์—… ์†๋„๊ฐ€ ํฌ๊ฒŒ ์ €ํ•˜๋  ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค. ๋˜ํ•œ VPS์˜ ๋Œ€์—ญํญ ์š”๊ตฌ ์‚ฌํ•ญ์€ ํ›จ์”ฌ ๋” ๋†’์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์–ด๋–ป๊ฒŒ๋“  ์ฐจ๋‹จ๋œ ์‚ฌ์ดํŠธ์— ํŠธ๋ž˜ํ”ฝ์„ ํ• ๋‹นํ•˜๊ณ  ์„ ํƒ์ ์œผ๋กœ ํ„ฐ๋„๋กœ ๋ณด๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. "์—ฌ๋ถ„์˜" ํŠธ๋ž˜ํ”ฝ ์ค‘ ์ผ๋ถ€๊ฐ€ ๊ฑฐ๊ธฐ์— ๋„๋‹ฌํ•˜๋”๋ผ๋„ ํ„ฐ๋„์„ ํ†ตํ•ด ๋ชจ๋“  ๊ฒƒ์„ ์šด์ „ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์—ฌ์ „ํžˆ ํ›จ์”ฌ ๋‚ซ์Šต๋‹ˆ๋‹ค.

ํŠธ๋ž˜ํ”ฝ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด BGP ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜๊ณ  VPS์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ํ•„์š”ํ•œ ๋„คํŠธ์›Œํฌ ๊ฒฝ๋กœ๋ฅผ ์•Œ๋ฆฝ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๊ธฐ๋Šฅ์ ์ด๊ณ  ํŽธ๋ฆฌํ•œ BGP ๋ฐ๋ชฌ ์ค‘ ํ•˜๋‚˜๋กœ BIRD๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

IP

IP๋กœ ์ฐจ๋‹จํ•˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ๋ช…ํ™•ํ•ด์ง‘๋‹ˆ๋‹ค. VPS๋กœ ์ฐจ๋‹จ๋œ ๋ชจ๋“  IP๋ฅผ ๊ฐ„๋‹จํžˆ ๋ฐœํ‘œํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” API๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ชฉ๋ก์— ์•ฝ 600๋งŒ ๊ฐœ์˜ ์„œ๋ธŒ๋„ท์ด ์žˆ๊ณ  ๊ทธ ์ค‘ ๋Œ€๋‹ค์ˆ˜๊ฐ€ /32 ํ˜ธ์ŠคํŠธ๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ๋กœ ์ˆ˜๋Š” ์ทจ์•ฝํ•œ ํด๋ผ์ด์–ธํŠธ ๋ผ์šฐํ„ฐ๋ฅผ ํ˜ผ๋™์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋ชฉ๋ก์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ํ˜ธ์ŠคํŠธ๊ฐ€ 24๊ฐœ ์ด์ƒ์ธ ๊ฒฝ์šฐ ๋„คํŠธ์›Œํฌ/2๊นŒ์ง€ ์š”์•ฝํ•˜๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฒฝ๋กœ ์ˆ˜๊ฐ€ ~100๊ฐœ๋กœ ์ค„์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ์Šคํฌ๋ฆฝํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋„๋ฉ”์ธ

๋” ๋ณต์žกํ•˜๊ณ  ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฐ ํด๋ผ์ด์–ธํŠธ ๋ผ์šฐํ„ฐ์— ํˆฌ๋ช… Squid๋ฅผ ์„ค์น˜ํ•˜๊ณ  ๊ทธ๊ณณ์—์„œ HTTP ๊ฐ€๋กœ์ฑ„๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  TLS ํ•ธ๋“œ์…ฐ์ดํฌ๋ฅผ ์—ฟ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ฒซ ๋ฒˆ์งธ ๊ฒฝ์šฐ์—๋Š” ์š”์ฒญ๋œ URL์„, ๋‘ ๋ฒˆ์งธ ๊ฒฝ์šฐ์—๋Š” SNI์—์„œ ๋„๋ฉ”์ธ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ์ƒˆ๋กœ์šด TLS1.3 + eSNI๋กœ ์ธํ•ด HTTPS ๋ถ„์„์€ ๋งค์ผ ์ ์  ๋” ํ˜„์‹ค์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ, ํด๋ผ์ด์–ธํŠธ ์ธก ์ธํ”„๋ผ๊ฐ€ ์ ์  ๋” ๋ณต์žกํ•ด์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ์†Œํ•œ OpenWRT๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‚˜๋Š” DNS ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ๊ฐ€๋กœ์ฑ„๋Š” ๊ธธ์„ ํƒํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ๋„ ๋ชจ๋“  DNS-over-TLS/HTTPS๊ฐ€ ๋จธ๋ฆฌ ์œ„๋กœ ์›€์ง์ด๊ธฐ ์‹œ์ž‘ํ•˜์ง€๋งŒ ํด๋ผ์ด์–ธํŠธ์—์„œ ์ด ๋ถ€๋ถ„์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋น„ํ™œ์„ฑํ™”ํ•˜๊ฑฐ๋‚˜ DoT/DoH์— ์ž์ฒด ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

DNS๋ฅผ ๊ฐ€๋กœ์ฑ„๋Š” ๋ฐฉ๋ฒ•?

์—ฌ๊ธฐ์—๋„ ๋ช‡ ๊ฐ€์ง€ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • PCAP ๋˜๋Š” NFLOG๋ฅผ ํ†ตํ•œ DNS ํŠธ๋ž˜ํ”ฝ ์ฐจ๋‹จ
    ์ด ๋‘ ์ฐจ๋‹จ ๋ฐฉ๋ฒ•์€ ๋ชจ๋‘ ์œ ํ‹ธ๋ฆฌํ‹ฐ์—์„œ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค. ์‹œ๋“œ๋งˆํŠธ. ๊ทธ๋Ÿฌ๋‚˜ ์˜ค๋žซ๋™์•ˆ ์ง€์›๋˜์ง€ ์•Š์•˜๊ณ  ๊ธฐ๋Šฅ์ด ๋งค์šฐ ์›์‹œ์ ์ด๋ฏ€๋กœ ์—ฌ์ „ํžˆ ์ด๋ฅผ ์œ„ํ•œ ํ•˜๋„ค์Šค๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • DNS ์„œ๋ฒ„ ๋กœ๊ทธ ๋ถ„์„
    ๋ถˆํ–‰ํ•˜๊ฒŒ๋„ ๋‚ด๊ฐ€ ์•„๋Š” ๋ฆฌ์ปค์„œ๋Š” ์‘๋‹ต์„ ๊ธฐ๋กํ•  ์ˆ˜ ์—†๊ณ  ์š”์ฒญ๋งŒ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์›์น™์ ์œผ๋กœ ์ด๊ฒƒ์€ ์š”์ฒญ๊ณผ ๋‹ฌ๋ฆฌ ๋‹ต๋ณ€์ด ๋ณต์žกํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ํ…์ŠคํŠธ ํ˜•์‹์œผ๋กœ ์ž‘์„ฑํ•˜๊ธฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— ๋…ผ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค.
  • DNSTap
    ๋‹คํ–‰์Šค๋Ÿฝ๊ฒŒ๋„ ๋งŽ์€ ๊ธฐ์—…์ด ์ด๋ฏธ ์ด๋Ÿฌํ•œ ๋ชฉ์ ์„ ์œ„ํ•ด DNSTap์„ ์ง€์›ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

DNSTap์ด๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

DNSTap ๋ฐ BGP๋กœ ILV ์ฐจ๋‹จ ์šฐํšŒ

DNS ์„œ๋ฒ„์—์„œ ๊ตฌ์กฐํ™”๋œ DNS ์ฟผ๋ฆฌ ๋ฐ ์‘๋‹ต ์ˆ˜์ง‘๊ธฐ๋กœ ์ „์†กํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋กœํ† ์ฝœ ๋ฒ„ํผ ๋ฐ ํ”„๋ ˆ์ž„ ์ŠคํŠธ๋ฆผ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ํ”„๋กœํ† ์ฝœ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ DNS ์„œ๋ฒ„๋Š” ์ฟผ๋ฆฌ ๋ฐ ์‘๋‹ต ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ(๋ฉ”์‹œ์ง€ ์œ ํ˜•, ํด๋ผ์ด์–ธํŠธ/์„œ๋ฒ„ IP ๋“ฑ)์™€ ์™„์ „ํ•œ DNS ๋ฉ”์‹œ์ง€๋ฅผ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š” (๋ฐ”์ด๋„ˆ๋ฆฌ) ํ˜•์‹์œผ๋กœ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

DNSTap ํŒจ๋Ÿฌ๋‹ค์ž„์—์„œ DNS ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ ์—ญํ• ์„ ํ•˜๊ณ  ์ˆ˜์ง‘๊ธฐ๋Š” ์„œ๋ฒ„ ์—ญํ• ์„ ํ•œ๋‹ค๋Š” ์ ์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, DNS ์„œ๋ฒ„๋Š” ์ˆ˜์ง‘๊ธฐ์— ์—ฐ๊ฒฐ๋˜๋ฉฐ ๊ทธ ๋ฐ˜๋Œ€๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

์˜ค๋Š˜๋‚  DNSTap์€ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“  DNS ์„œ๋ฒ„์—์„œ ์ง€์›๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์˜ˆ๋ฅผ ๋“ค์–ด ๋งŽ์€ ๋ฐฐํฌํŒ(Ubuntu LTS์™€ ๊ฐ™์€)์˜ BIND๋Š” ์–ด๋–ค ์ด์œ ๋กœ ์ง€์› ์—†์ด ๊ตฌ์ถ•๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์žฌ์กฐ๋ฆฝ์— ์‹ ๊ฒฝ์“ฐ์ง€ ๋ง๊ณ  ๋” ๊ฐ€๋ณ๊ณ  ๋น ๋ฅธ ์žฌ๊ท€์ธ Unbound๋ฅผ ์‚ฌ์šฉํ•ฉ์‹œ๋‹ค.

DNSTap์„ ์žก๋Š” ๋ฐฉ๋ฒ•?

์ด ์ผ๋ถ€ ์ˆ˜ DNSTap ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆผ ์ž‘์—…์„ ์œ„ํ•œ CLI ์œ ํ‹ธ๋ฆฌํ‹ฐ์ด์ง€๋งŒ ๋ฌธ์ œ ํ•ด๊ฒฐ์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋‚˜๋งŒ์˜ ์ž์ „๊ฑฐ๋ฅผ ๋ฐœ๋ช…ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. dnstap-bgp

์ž‘์—… ์•Œ๊ณ ๋ฆฌ์ฆ˜:

  • ์‹œ์ž‘๋˜๋ฉด ํ…์ŠคํŠธ ํŒŒ์ผ์—์„œ ๋„๋ฉ”์ธ ๋ชฉ๋ก์„ ๋กœ๋“œํ•˜๊ณ  ๋ฐ˜์ „(habr.com -> com.habr)ํ•˜๊ณ  ๋Š์–ด์ง„ ์ค„, ์ค‘๋ณต ๋ฐ ํ•˜์œ„ ๋„๋ฉ”์ธ์„ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค(์ฆ‰, ๋ชฉ๋ก์— habr.com ๋ฐ www.habr.com์ด ํฌํ•จ๋œ ๊ฒฝ์šฐ, ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ๋งŒ ๋กœ๋“œ๋จ) ์ด ๋ชฉ๋ก์„ ํ†ตํ•œ ๋น ๋ฅธ ๊ฒ€์ƒ‰์„ ์œ„ํ•œ ์ ‘๋‘์‚ฌ ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค.
  • DNSTap ์„œ๋ฒ„๋กœ ์ž‘๋™ํ•˜์—ฌ DNS ์„œ๋ฒ„์˜ ์—ฐ๊ฒฐ์„ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ์›์น™์ ์œผ๋กœ๋Š” ์œ ๋‹‰์Šค์™€ TCP ์†Œ์ผ“์„ ๋ชจ๋‘ ์ง€์›ํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ์•„๋Š” DNS ์„œ๋ฒ„๋Š” ์œ ๋‹‰์Šค ์†Œ์ผ“๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋“ค์–ด์˜ค๋Š” DNSTap ํŒจํ‚ท์€ ๋จผ์ € Protobuf ๊ตฌ์กฐ๋กœ ์—ญ์ง๋ ฌํ™”๋˜๊ณ  Protobuf ํ•„๋“œ ์ค‘ ํ•˜๋‚˜์— ์žˆ๋Š” ์ด์ง„ DNS ๋ฉ”์‹œ์ง€ ์ž์ฒด๊ฐ€ DNS RR ๋ ˆ์ฝ”๋“œ ์ˆ˜์ค€์œผ๋กœ ๊ตฌ๋ฌธ ๋ถ„์„๋ฉ๋‹ˆ๋‹ค.
  • ์š”์ฒญ๋œ ํ˜ธ์ŠคํŠธ(๋˜๋Š” ์ƒ์œ„ ๋„๋ฉ”์ธ)๊ฐ€ ๋กœ๋“œ๋œ ๋ชฉ๋ก์— ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ์‘๋‹ต์„ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.
  • ์‘๋‹ต์—์„œ A/AAAA/CNAME RR๋งŒ ์„ ํƒํ•˜๊ณ  ํ•ด๋‹น IPv4/IPv6 ์ฃผ์†Œ๋ฅผ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.
  • IP ์ฃผ์†Œ๋Š” ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ TTL๋กœ ์บ์‹œ๋˜๊ณ  ๊ตฌ์„ฑ๋œ ๋ชจ๋“  BGP ํ”ผ์–ด์— ์•Œ๋ ค์ง‘๋‹ˆ๋‹ค.
  • ์ด๋ฏธ ์บ์‹œ๋œ IP๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์‘๋‹ต์„ ์ˆ˜์‹ ํ•˜๋ฉด ํ•ด๋‹น TTL์ด ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.
  • TTL์ด ๋งŒ๋ฃŒ๋˜๋ฉด ํ•ญ๋ชฉ์ด ์บ์‹œ ๋ฐ BGP ์•Œ๋ฆผ์—์„œ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ๊ธฐ๋Šฅ:

  • SIGHUP์œผ๋กœ ๋„๋ฉ”์ธ ๋ชฉ๋ก ๋‹ค์‹œ ์ฝ๊ธฐ
  • ์บ์‹œ๋ฅผ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค์™€ ๋™๊ธฐํ™” ์ƒํƒœ๋กœ ์œ ์ง€ dnstap-bgp HTTP/JSON์„ ํ†ตํ•ด
  • ๋‹ค์‹œ ์‹œ์ž‘ํ•œ ํ›„ ๋‚ด์šฉ์„ ๋ณต์›ํ•˜๊ธฐ ์œ„ํ•ด ๋””์Šคํฌ(BoltDB ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค)์˜ ์บ์‹œ๋ฅผ ๋ณต์ œํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹ค๋ฅธ ๋„คํŠธ์›Œํฌ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋กœ์˜ ์ „ํ™˜ ์ง€์›(ํ•„์š”ํ•œ ์ด์œ ๋Š” ์•„๋ž˜์—์„œ ์„ค๋ช…)
  • IPv6 ์ง€์›

์ œํ•œ ์‚ฌํ•ญ :

  • IDN ๋„๋ฉ”์ธ์€ ์•„์ง ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ช‡ ๊ฐ€์ง€ BGP ์„ค์ •

๋‚˜๋Š” ๋ชจ์•˜๋‹ค RPM ๋ฐ DEB ์‰ฌ์šด ์„ค์น˜๋ฅผ ์œ„ํ•œ ํŒจํ‚ค์ง€. systemd๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋น„๊ต์  ์ตœ๊ทผ์˜ ๋ชจ๋“  OS์—์„œ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ข…์†์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค.

๊ณ„ํš

์ด์ œ ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํ•จ๊ป˜ ์กฐ๋ฆฝํ•ด ๋ด…์‹œ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋‹ค์Œ ๋„คํŠธ์›Œํฌ ํ† ํด๋กœ์ง€์™€ ๊ฐ™์€ ๊ฒƒ์„ ์–ป์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
DNSTap ๋ฐ BGP๋กœ ILV ์ฐจ๋‹จ ์šฐํšŒ

์ž‘์—…์˜ ๋…ผ๋ฆฌ๋Š” ๋‹ค์ด์–ด๊ทธ๋žจ์—์„œ ๋ช…ํ™•ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  • ํด๋ผ์ด์–ธํŠธ์—๋Š” DNS๋กœ ๊ตฌ์„ฑ๋œ ์„œ๋ฒ„๊ฐ€ ์žˆ์œผ๋ฉฐ DNS ์ฟผ๋ฆฌ๋„ VPN์„ ๊ฑฐ์ณ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ณต๊ธ‰์ž๊ฐ€ DNS ๊ฐ€๋กœ์ฑ„๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฐจ๋‹จํ•  ์ˆ˜ ์—†๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ์‚ฌ์ดํŠธ๋ฅผ ์—ด ๋•Œ ํด๋ผ์ด์–ธํŠธ๋Š” "xxx.org์˜ IP๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ"์™€ ๊ฐ™์€ DNS ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  • ๋งค์—ฌ ์žˆ์ง€ ์•Š์€ xxx.org๋ฅผ ํ™•์ธ(๋˜๋Š” ์บ์‹œ์—์„œ ๊ฐ€์ ธ์˜ด)ํ•˜๊ณ  "xxx.org์—๋Š” ์ด๋Ÿฌํ•œ IP๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค"๋ผ๋Š” ์‘๋‹ต์„ ํด๋ผ์ด์–ธํŠธ์— ๋ณด๋‚ด๊ณ  DNSTap์„ ํ†ตํ•ด ๋ณ‘๋ ฌ๋กœ ๋ณต์ œํ•ฉ๋‹ˆ๋‹ค.
  • dnstap-bgp ์—์„œ ์ด๋Ÿฌํ•œ ์ฃผ์†Œ๋ฅผ ๋ฐœํ‘œํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ๋„๋ฉ”์ธ์ด ์ฐจ๋‹จ ๋ชฉ๋ก์— ์žˆ๋Š” ๊ฒฝ์šฐ BGP๋ฅผ ํ†ตํ•ด
  • ์ƒˆ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ IP์— ๋Œ€ํ•œ ๊ฒฝ๋กœ๋ฅผ ์•Œ๋ฆฝ๋‹ˆ๋‹ค. next-hop self ํด๋ผ์ด์–ธํŠธ ๋ผ์šฐํ„ฐ
  • ํด๋ผ์ด์–ธํŠธ์—์„œ ์ด๋Ÿฌํ•œ IP๋กœ์˜ ํ›„์† ํŒจํ‚ท์€ ํ„ฐ๋„์„ ํ†ต๊ณผํ•ฉ๋‹ˆ๋‹ค.

์„œ๋ฒ„์—์„œ ์ฐจ๋‹จ๋œ ์‚ฌ์ดํŠธ๋กœ์˜ ๊ฒฝ๋กœ๋ฅผ ์œ„ํ•ด BIRD ๋‚ด๋ถ€์— ๋ณ„๋„์˜ ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜๋ฉฐ ์–ด๋–ค ์‹์œผ๋กœ๋“  OS์™€ ๊ต์ฐจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ์ฒด๊ณ„์—๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ์˜ ์ฒซ ๋ฒˆ์งธ SYN ํŒจํ‚ท์€ ๋Œ€๋ถ€๋ถ„ ๊ตญ๋‚ด ๊ณต๊ธ‰์ž๋ฅผ ํ†ตํ•ด ๋– ๋‚  ์‹œ๊ฐ„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฝ๋กœ๋Š” ์ฆ‰์‹œ ๋ฐœํ‘œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ณต๊ธ‰์ž๊ฐ€ ์ฐจ๋‹จ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ ์—ฌ๊ธฐ์—์„œ ์˜ต์…˜์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฐ€ ํŠธ๋ž˜ํ”ฝ์„ ๋Š๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฐ€ ๊ทธ๊ฒƒ์„ ์ผ๋ถ€ DPI๋กœ ๋ฆฌ๋””๋ ‰์…˜ํ•˜๋ฉด (์ด๋ก ์ ์œผ๋กœ) ํŠน์ˆ˜ ํšจ๊ณผ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ DNS TTL ๊ธฐ์ ์„ ์กด์ค‘ํ•˜์ง€ ์•Š์•„ ํด๋ผ์ด์–ธํŠธ๊ฐ€ Unbound๋ฅผ ์š”์ฒญํ•˜๋Š” ๋Œ€์‹  ์ฉ์€ ์บ์‹œ์˜ ์˜ค๋ž˜๋œ ํ•ญ๋ชฉ์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ์ฒซ ๋ฒˆ์งธ๋„ ๋‘ ๋ฒˆ์งธ๋„ ๋‚˜์—๊ฒŒ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค์ง€ ์•Š์•˜์ง€๋งŒ ๋งˆ์ผ๋ฆฌ์ง€๋Š” ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„œ๋ฒ„ ํŠœ๋‹

๋กค๋งํ•˜๊ธฐ ์‰ฝ๊ฒŒ ์ผ์Šต๋‹ˆ๋‹ค. Ansible์˜ ์—ญํ• . Linux(deb ๊ธฐ๋ฐ˜ ๋ฐฐํฌ์šฉ์œผ๋กœ ์„ค๊ณ„๋จ)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋ชจ๋‘ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์„ค์ •์€ ๋งค์šฐ ๋ช…ํ™•ํ•˜๋ฉฐ ์ธ๋ฒคํ† ๋ฆฌ.yml. ์ด ์—ญํ• ์€ ๋‚ด ํฐ ํ”Œ๋ ˆ์ด๋ถ์—์„œ ์ž˜๋ผ๋‚ธ ๊ฒƒ์ด๋ฏ€๋กœ ์˜ค๋ฅ˜๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ’€ ์š”์ฒญ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค ๐Ÿ™‚

์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ดํŽด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

BGP

๋™์ผํ•œ ํ˜ธ์ŠคํŠธ์—์„œ ๋‘ ๊ฐœ์˜ BGP ๋ฐ๋ชฌ์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ์—๋Š” ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. BIRD๋Š” localhost(๋˜๋Š” ๋กœ์ปฌ ์ธํ„ฐํŽ˜์ด์Šค)์™€์˜ BGP ํ”ผ์–ด๋ง ์„ค์ •์„ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ „ํ˜€ ๋‹จ์–ด์—์„œ. ์ธํ„ฐ๋„ท ๊ฒ€์ƒ‰๊ณผ ๋ฉ”์ผ๋ง ๋ฆฌ์ŠคํŠธ ์ฝ๊ธฐ๋Š” ๋„์›€์ด ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์ด๊ฒƒ์ด ์˜๋„๋œ ๊ฒƒ์ด๋ผ๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์–ด๋–ค ๋ฐฉ๋ฒ•์ด ์žˆ์„์ง€ ๋ชจ๋ฅด์ง€๋งŒ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ BGP ๋ฐ๋ชฌ์„ ์‚ฌ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ BIRD๋ฅผ ์ข‹์•„ํ•˜๊ณ  ๋ชจ๋“  ๊ณณ์—์„œ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ dnstap-bgp๋ฅผ veth ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ๋ฃจํŠธ์— ์—ฐ๊ฒฐ๋œ ๋„คํŠธ์›Œํฌ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋‚ด๋ถ€์— ์ˆจ๊ฒผ์Šต๋‹ˆ๋‹ค. ํŒŒ์ดํ”„์˜ ๋์ด ๋‹ค๋ฅธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ํŠ€์–ด๋‚˜์™€ ์žˆ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฐ ๋์—์„œ ํ˜ธ์ŠคํŠธ๋ฅผ ๋ฒ—์–ด๋‚˜์ง€ ์•Š๋Š” ๊ฐœ์ธ p2p IP ์ฃผ์†Œ๋ฅผ ๊ฑธ๋ฉด ๋ฌด์—‡์ด๋“  ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚ด๋ถ€ ํ”„๋กœ์„ธ์Šค์— ์•ก์„ธ์Šคํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค. ๋ชจ๋‘์—๊ฒŒ ์‚ฌ๋ž‘๋ฐ›๋Š” ๋„์ปค ๋ฐ ๊ธฐํƒ€ ์ปจํ…Œ์ด๋„ˆ.

์ด๋ฅผ ์œ„ํ•ด ์“ฐ์—ฌ์กŒ๋‹ค. ์Šคํฌ๋ฆฝํŠธ ๋จธ๋ฆฌ์นด๋ฝ์œผ๋กœ ์ž์‹ ์„ ๋‹ค๋ฅธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋กœ ๋“œ๋ž˜๊ทธํ•˜๊ธฐ ์œ„ํ•ด ์œ„์—์„œ ์ด๋ฏธ ์„ค๋ช…ํ•œ ๊ธฐ๋Šฅ์ด dnstap-bgp์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋•Œ๋ฌธ์— ๋ฃจํŠธ๋กœ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ setcap ๋ช…๋ น์„ ํ†ตํ•ด CAP_SYS_ADMIN ๋ฐ”์ด๋„ˆ๋ฆฌ๋กœ ๋ฐœํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ƒ์„ฑ์„ ์œ„ํ•œ ์˜ˆ์ œ ์Šคํฌ๋ฆฝํŠธ

#!/bin/bash

NS="dtap"

IP="/sbin/ip"
IPNS="$IP netns exec $NS $IP"

IF_R="veth-$NS-r"
IF_NS="veth-$NS-ns"

IP_R="192.168.149.1"
IP_NS="192.168.149.2"

/bin/systemctl stop dnstap-bgp || true

$IP netns del $NS > /dev/null 2>&1
$IP netns add $NS

$IP link add $IF_R type veth peer name $IF_NS
$IP link set $IF_NS netns $NS

$IP addr add $IP_R remote $IP_NS dev $IF_R
$IP link set $IF_R up

$IPNS addr add $IP_NS remote $IP_R dev $IF_NS
$IPNS link set $IF_NS up

/bin/systemctl start dnstap-bgp

dnstap-bgp.conf

namespace = "dtap"
domains = "/var/cache/rkn_domains.txt"
ttl = "168h"

[dnstap]
listen = "/tmp/dnstap.sock"
perm = "0666"

[bgp]
as = 65000
routerid = "192.168.149.2"

peers = [
    "192.168.149.1",
]

์ƒˆ.conf

router id 192.168.1.1;

table rkn;

# Clients
protocol bgp bgp_client1 {
    table rkn;
    local as 65000;
    neighbor 192.168.1.2 as 65000;
    direct;
    bfd on;
    next hop self;
    graceful restart;
    graceful restart time 60;
    export all;
    import none;
}

# DNSTap-BGP
protocol bgp bgp_dnstap {
    table rkn;
    local as 65000;
    neighbor 192.168.149.2 as 65000;
    direct;
    passive on;
    rr client;
    import all;
    export none;
}

# Static routes list
protocol static static_rkn {
    table rkn;
    include "rkn_routes.list";
    import all;
    export none;
}

rkn_routes.list

route 3.226.79.85/32 via "ens3";
route 18.236.189.0/24 via "ens3";
route 3.224.21.0/24 via "ens3";
...

DNS

๊ธฐ๋ณธ์ ์œผ๋กœ Ubuntu์—์„œ Unbound ๋ฐ”์ด๋„ˆ๋ฆฌ๋Š” AppArmor ํ”„๋กœํ•„์— ์˜ํ•ด ๊ณ ์ •๋˜์–ด ๋ชจ๋“  ์ข…๋ฅ˜์˜ DNSTap ์†Œ์ผ“์— ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์„ ๊ธˆ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ”„๋กœํ•„์„ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

# cd /etc/apparmor.d/disable && ln -s ../usr.sbin.unbound .
# apparmor_parser -R /etc/apparmor.d/usr.sbin.unbound

์ด๊ฒƒ์€ ์•„๋งˆ๋„ ํ”Œ๋ ˆ์ด๋ถ์— ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก  ํ”„๋กœํ•„์„ ์ˆ˜์ •ํ•˜๊ณ  ํ•„์š”ํ•œ ๊ถŒํ•œ์„ ๋ฐœ๊ธ‰ํ•˜๋Š” ๊ฒƒ์ด ์ด์ƒ์ ์ด์ง€๋งŒ ๋„ˆ๋ฌด ๊ฒŒ์„๋ €์Šต๋‹ˆ๋‹ค.

์–ธ๋ฐ”์šด๋“œ.conf

server:
    chroot: ""
    port: 53
    interface: 0.0.0.0
    root-hints: "/var/lib/unbound/named.root"
    auto-trust-anchor-file: "/var/lib/unbound/root.key"
    access-control: 192.168.0.0/16 allow

remote-control:
    control-enable: yes
    control-use-cert: no

dnstap:
    dnstap-enable: yes
    dnstap-socket-path: "/tmp/dnstap.sock"
    dnstap-send-identity: no
    dnstap-send-version: no

    dnstap-log-client-response-messages: yes

๋ชฉ๋ก ๋‹ค์šด๋กœ๋“œ ๋ฐ ์ฒ˜๋ฆฌ

IP ์ฃผ์†Œ ๋ชฉ๋ก์„ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์Šคํฌ๋ฆฝํŠธ
๋ชฉ๋ก์„ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์ ‘๋‘์‚ฌ๊นŒ์ง€ ์š”์•ฝํ•ฉ๋‹ˆ๋‹ค. pfx. ์— ์ถ”๊ฐ€ํ•˜์ง€ ๋งˆ์„ธ์š” ะธ dont_summarize ๊ฑด๋„ˆ๋›ฐ๊ฑฐ๋‚˜ ์š”์•ฝํ•˜์ง€ ์•Š๋„๋ก IP์™€ ๋„คํŠธ์›Œํฌ์— ์ง€์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ํ•„์š”ํ–ˆ๋‹ค. ๋‚ด VPS์˜ ์„œ๋ธŒ๋„ท์ด ์ฐจ๋‹จ ๋ชฉ๋ก์— ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค ๐Ÿ™‚

์žฌ๋ฏธ์žˆ๋Š” ์ ์€ RosKomSvoboda API๊ฐ€ ๊ธฐ๋ณธ Python ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๋กœ ์š”์ฒญ์„ ์ฐจ๋‹จํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. script-kiddy๊ฐ€ ์–ป์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Ognelis๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

์ง€๊ธˆ๊นŒ์ง€๋Š” IPv4์—์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. IPv6์˜ ์ ์œ ์œจ์€ ์ ์ง€๋งŒ ์‰ฝ๊ฒŒ ๊ณ ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. bird6๋„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด์š”.

rkn.py

#!/usr/bin/python3

import json, urllib.request, ipaddress as ipa

url = 'https://api.reserve-rbl.ru/api/v2/ips/json'
pfx = '24'

dont_summarize = {
    # ipa.IPv4Network('1.1.1.0/24'),
}

dont_add = {
    # ipa.IPv4Address('1.1.1.1'),
}

req = urllib.request.Request(
    url,
    data=None, 
    headers={
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36'
    }
)

f = urllib.request.urlopen(req)
ips = json.loads(f.read().decode('utf-8'))

prefix32 = ipa.IPv4Address('255.255.255.255')

r = {}
for i in ips:
    ip = ipa.ip_network(i)
    if not isinstance(ip, ipa.IPv4Network):
        continue

    addr = ip.network_address

    if addr in dont_add:
        continue

    m = ip.netmask
    if m != prefix32:
        r[m] = [addr, 1]
        continue

    sn = ipa.IPv4Network(str(addr) + '/' + pfx, strict=False)

    if sn in dont_summarize:
        tgt = addr
    else:
        tgt = sn

    if not sn in r:
        r[tgt] = [addr, 1]
    else:
        r[tgt][1] += 1

o = []
for n, v in r.items():
    if v[1] == 1:
        o.append(str(v[0]) + '/32')
    else:
        o.append(n)

for k in o:
    print(k)

์—…๋ฐ์ดํŠธํ•  ์Šคํฌ๋ฆฝํŠธ
๋‚˜๋Š” ํ•˜๋ฃจ์— ํ•œ ๋ฒˆ ํฌ๋ผ์šด์—์„œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ 4 ์‹œ๊ฐ„๋งˆ๋‹ค ๋‹น๊ธธ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ ์ƒ๊ฐ์—๋Š” ์ด๊ฒƒ์ด RKN์ด ๊ณต๊ธ‰์ž์—๊ฒŒ ์š”๊ตฌํ•˜๋Š” ๊ฐฑ์‹  ๊ธฐ๊ฐ„์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ๋” ๋นจ๋ฆฌ ๋„์ฐฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๋งค์šฐ ๊ธด๊ธ‰ํ•œ ์ฐจ๋‹จ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • ์ฒซ ๋ฒˆ์งธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ฒฝ๋กœ ๋ชฉ๋ก์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค(rkn_routes.list) ๋ฒ„๋“œ
  • ๋ฒ„๋“œ ์ƒˆ๋กœ๊ณ ์นจ
  • dnstap-bgp์— ๋Œ€ํ•œ ๋„๋ฉ”์ธ ๋ชฉ๋ก ์—…๋ฐ์ดํŠธ ๋ฐ ์ •๋ฆฌ
  • dnstap-bgp ์ƒˆ๋กœ๊ณ ์นจ

rkn_update.sh

#!/bin/bash

ROUTES="/etc/bird/rkn_routes.list"
DOMAINS="/var/cache/rkn_domains.txt"

# Get & summarize routes
/opt/rkn.py | sed 's/(.*)/route 1 via "ens3";/' > $ROUTES.new

if [ $? -ne 0 ]; then
    rm -f $ROUTES.new
    echo "Unable to download RKN routes"
    exit 1
fi

if [ -e $ROUTES ]; then
    mv $ROUTES $ROUTES.old
fi

mv $ROUTES.new $ROUTES

/bin/systemctl try-reload-or-restart bird

# Get domains
curl -s https://api.reserve-rbl.ru/api/v2/domains/json -o - | jq -r '.[]' | sed 's/^*.//' | sort | uniq > $DOMAINS.new

if [ $? -ne 0 ]; then
    rm -f $DOMAINS.new
    echo "Unable to download RKN domains"
    exit 1
fi

if [ -e $DOMAINS ]; then
    mv $DOMAINS $DOMAINS.old
fi

mv $DOMAINS.new $DOMAINS

/bin/systemctl try-reload-or-restart dnstap-bgp

๋ณ„๋กœ ์ƒ๊ฐํ•˜์ง€ ์•Š๊ณ  ์ž‘์„ฑํ–ˆ์œผ๋ฏ€๋กœ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์ด ๋ณด์ด๋ฉด ๋ฐ”๋กœ ์‹คํ–‰ํ•˜์‹ญ์‹œ์˜ค.

ํด๋ผ์ด์–ธํŠธ ์„ค์ •

์—ฌ๊ธฐ์„œ๋Š” Linux ๋ผ์šฐํ„ฐ์— ๋Œ€ํ•œ ์˜ˆ๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ Mikrotik / Cisco์˜ ๊ฒฝ์šฐ ํ›จ์”ฌ ๋” ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋จผ์ € BIRD๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

์ƒˆ.conf

router id 192.168.1.2;
table rkn;

protocol device {
    scan time 10;
};

# Servers
protocol bgp bgp_server1 {
    table rkn;
    local as 65000;
    neighbor 192.168.1.1 as 65000;
    direct;
    bfd on;
    next hop self;
    graceful restart;
    graceful restart time 60;
    rr client;
    export none;
    import all;
}

protocol kernel {
    table rkn;
    kernel table 222;
    scan time 10;
    export all;
    import none;
}

๋”ฐ๋ผ์„œ BGP์—์„œ ๋ฐ›์€ ๊ฒฝ๋กœ๋ฅผ ์ปค๋„ ๋ผ์šฐํŒ… ํ…Œ์ด๋ธ” ๋ฒˆํ˜ธ 222์™€ ๋™๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ธฐ๋ณธ ํŒ์„ ๋ณด๊ธฐ ์ „์— ์ด ํŒ์„ ๋ณด๋„๋ก ์ปค๋„์— ์š”์ฒญํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

# ip rule add from all pref 256 lookup 222
# ip rule
0:  from all lookup local
256:    from all lookup 222
32766:  from all lookup main
32767:  from all lookup default

๋ชจ๋“  ๊ฒƒ์€ ๋ผ์šฐํ„ฐ์—์„œ DHCP๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ ์„œ๋ฒ„์˜ ํ„ฐ๋„ IP ์ฃผ์†Œ๋ฅผ DNS๋กœ ๋ฐฐํฌํ•˜๊ณ  ์ฒด๊ณ„๊ฐ€ ์ค€๋น„๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ œํ•œ

๋„๋ฉ”์ธ ๋ชฉ๋ก์„ ์ƒ์„ฑํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๋Š” ํ˜„์žฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—๋Š” ๋ฌด์—‡๋ณด๋‹ค๋„ ๋‹ค์Œ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. youtube.com ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์˜ CDN.

๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ ๋ชจ๋“  ๋น„๋””์˜ค๊ฐ€ VPN์„ ํ†ต๊ณผํ•˜์—ฌ ์ „์ฒด ์ฑ„๋„์„ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋‹น๋ถ„๊ฐ„ RKN์„ ์ฐจ๋‹จํ•˜๋Š” ์ธ๊ธฐ ์žˆ๋Š” ๋„๋ฉ”์ธ ์ œ์™ธ ๋ชฉ๋ก์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์น˜๊ฐ€ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ตฌ๋ฌธ ๋ถ„์„ํ•  ๋•Œ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

์„ค๋ช…๋œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ณต๊ธ‰์ž๊ฐ€ ํ˜„์žฌ ๊ตฌํ˜„ํ•˜๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ์ฐจ๋‹จ์„ ์šฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์›์น™์ ์œผ๋กœ, dnstap-bgp ๋„๋ฉ”์ธ ์ด๋ฆ„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ผ์ • ์ˆ˜์ค€์˜ ํŠธ๋ž˜ํ”ฝ ์ œ์–ด๊ฐ€ ํ•„์š”ํ•œ ๋‹ค๋ฅธ ์šฉ๋„๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ์‹œ๋Œ€์—๋Š” ์ˆ˜์ฒœ ๊ฐœ์˜ ์‚ฌ์ดํŠธ๊ฐ€ ๋™์ผํ•œ IP ์ฃผ์†Œ(์˜ˆ: ์ผ๋ถ€ Cloudflare ๋’ค)์— ๋งค๋‹ฌ๋ฆด ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด ๋ฐฉ๋ฒ•์€ ์ •ํ™•๋„๊ฐ€ ๋‹ค์†Œ ๋‚ฎ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ž ๊ธˆ ์šฐํšŒ์˜ ํ•„์š”์„ฑ์— ๋Œ€ํ•ด์„œ๋Š” ์ด๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€, ํŽธ์ง‘, ํ’€ ์š”์ฒญ - ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!

์ถœ์ฒ˜ : habr.com

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