[2023동계 모각코] 모각코

NetMaker 오픈소스 분석

VertexToEdge 2024. 1. 23. 20:52

인턴중인 회사에서 NetMaker를 이용해 멀티 테넌트 환경의 인프라에 대해 Overlay Network를 구성하고 있다.

그 중에서 Private DNS 관련 버그를 몇 가지 발견했고, 해당 이슈 해결을 위해 NetMaker의 DNS 전파 과정을 파악해보기로 했다.

 

먼저 NetMaker를 간단하게 소개하자면, kernel level WireGuard를 이용해 MeshVPN을 구성해주는 오픈소스 프로젝트(일부 엔터프라이즈 기능은 별도의 라이센스 적용. 운영상 크게 문제가 되는 기능들은 아님)로, VPN 네트워크에 참여하는 호스트에 대한 Control Plane을 제공한다.  Endpoint 간의 WireGuard 터널링을 수행할 때 알아서 STUN으로 홀펀칭도 해주고, 구성된 VPN 네트워크에 CoreDNS를 통해 사설 DNS 기능도 제공한다. Ingress를 통해 외부망간의 포워딩도 간편하게 할 수 있다. Self-Hosted 설치는 다른 MeshVPN 플젝에 비하면 좀 복잡하긴 한데 그래도 크게 어렵진 않다.

 

Private DNS 기능.

기본적으로 VPN 네트워크를 생성하고 새로운 호스트를 추가하면 각 호스트의 이름(기본적으로 해당 엔드포인트의 hostname) + 네트워크 명의 DNS 레코드가 생긴다.

예를 들면 다음과 같다.

엔드포인트 A, B의 호스트명이 hostname_a, hostname_b이고, 네트워크 명이 vertex 라고 한다면,

A와 B를 각각 가리키는 hostname_a.vertex, hostname_b.vertex 라는 도메인이 등록된다.

그 외에도 사용자가 원하는 임의의 커스텀 도메인을 추가할 수 있고, 해당 커스텀 도메인은 데이터베이스에 저장된다.

저장된 도메인은 새로운 호스트가 추가 또는 삭제, Private DNS에 수정 사항이 생기면 NetMaker 서버가 데이터베이스에 있는 DNS 레코드와 기본 생성 가능한 레코드를 CoreDNS에 갱신시킨다.

 

원래(v0.22.0 버전 이전)는 각 호스트에 있는 NetMaker에서 DNS의 변경이 생길 때 마다 Message Broker로 변경 사항을 각 호스트에 전파하고, 각 호스트에 있는 NetClient는 해당 DNS 변경사항을 전달 받아 /etc/hosts 파일을 직접 수정함으로써 Private DNS 기능을 구현했다.