archived-old-homelab
(Project) HomeLab Cluster - Base Network Setting with Meshnet (3)
Index
- Introduction
- Ground Rules
- 기존 HomeLab Cluster Network (before 0517)
- 현재 HomeLab Cluster Network with Meshnet
- Conclusion
Introduction
안녕하세요 Yureutae입니다. 이번 포스팅에서는 제 HomeLab Cluster의 전체적인 네트워크 구성에 관해 소개드리려합니다.
정말 많은 자료를 보았고, 특히 개발이나 엔지니어링을 업으로 삼는 분들뿐만 아니라 네트워크 설치 기사분들이나 취미 관련 포스팅과 영상을 많이 참고했던 것 같습니다.
간단하면서도 홈 네트워크 관련이라 클라우드 위주의 환경을 사용하는 분들께는 비교적 신선한 내용이 있을 것이라 생각되는 부분도 있습니다. 저 나름대로 공부하면서도 재정립한 내용이 많았던 것 같습니다. 특히 Meshnet을 반영하면서 네트워크 기초 공부를 여러번 다시 할 수 밖에 없었습니다.
그럼 포스팅 내용 소개 시작해보겠습니다.
Ground Rules
제가 HomeLab Cluster를 계획하면서 네트워크 부분에서 고민했던 점은 다음과 같습니다.
- 이관성
- 이식성
- 독립성
일전에 말씀드린 것처럼, 현재 HomeLab Cluster는 연구실 책상 위에 얹어놓은 상태입니다. 네트워크 빵빵하고 전기세 신경 안써도 되고 문제있으면 출근한 상태에서 금방 해결할 수 있기 때문이죠.

하지만 언젠가(취직이 되는 순간) 나가면 원룸에 옮겨야 할거고 또 1년 내에는 원룸을 옮길 생각이라서, 1번(이관성)을 고려해야만 합니다. 언제든 이관을 쉽게 결정할 수 있는 정도의 구조여야 할 필요가 있습니다.
또한 최소 2번의 이관 과정을 거치게 될 건데 매번 세팅을 다시 해줘야하나?라는 문제에 봉착하게 됩니다. 클라우드 네이티브 기술을 쓰는 대부분의 엔지니어분들과 같이 저는 이런 부분을 최소화하고 싶은 욕심(귀차니즘)이 있습니다. 그래서 2번(이식성)도 고려해야합니다. 기존 구조를 재구성하는 것도 아니고 그대로 가져다 옮기고 싶다는 얘기입니다.
마지막으로는 이관 목적지에 대한 생각도 하게됩니다. 이관 목적지의 네트워크 환경 및 구성에 영향을 받기 쉬운 구조면 기존 구성도 어그러질 수 밖에 없습니다. 따라서 HomeLab Cluster 자체에 대해 3번(독립성)도 고려해야합니다.
위 3개의 항목을 고려해서 구조를 설계했었습니다.
기존 HomeLab Cluster Network (before 0517)

원래 이 프로젝트 초기 구조입니다. 현재 첫 번째 포스팅은 NordVPN Meshnet을 추가한 아키텍처로 수정완료했습니다.
그래도 원래 구성한 구조가 다른 HomeLab이나 NAS를 구축하시는 분들과 네트워크 구성이 유사해서 간략하게 소개해보겠습니다.
네트워크 부분만 추려서 설명하자면
- Router A (홈 네트워크의 기본적인 토대가 되는 공유기)에는 기존 휴대폰, 맥북 등의 일반적으로 사용되는 디바이스가 연결됩니다. 대부분의 가정환경에서는 이 Router A 한대를 사용합니다.
- Router B를 A와 연결합니다. Router B는 A와 별개의 내부망을 구성하게 됩니다.
- Router B에는 HomeLab Cluster의 Node들이 연결됩니다. 각 Node에는 고정 ip를 할당하도록 합니다.
- Router B 네트워크 내 Node 들간 K8s를 구축합니다. Router B 네트워크 내 할당된 고정 ip를 기반으로 Node들이 소통하게 되며, CNI(Container Network Interface)를 기반으로 추상화된 논리적 네트워크를 구성하게 됩니다.
아래 항목에서 더 상세히 설명하겠습니다. 4번의 K8s 관련 내용은 추후 포스팅에서 K8s를 구성하며 설명하도록하겠습니다.
Nested Router

왜 굳이 Router(공유기)를 중첩해서 쓰냐?라고 생각하시는 분들이 있을 것 같습니다.
우선 위의 Ground Rules에서 나열했던 것처럼 저는 HomeLab Cluster가 구축할 환경의 기존 네트워크 구조에 영향을 최소한으로 받으면 좋겠다는 생각이 있었습니다.
인터넷 모뎀 선이 여러개인 환경도 있고, 공인 ip를 여러개 할당 받을 수 있는 환경도 있으며, 기존 공유기가 포트가 정말 많을 수도 있습니다. 하지만 범용적인 환경에 이식 가능성을 노린다면 다른 방법을 찾아봐야겠죠?
그래서 별도의 내부망 구축을 찾아보게 되었으며, 내부망 구축을 위해서는 별도의 Router를 추가하는 것이 좋다라는 것을 알게 되었습니다. 아래와 같은 장점이 있을 것 같습니다.
- Router A와 독립적으로 네트워크 환경 구성 가능
- 내부 네트워크 통신(K8s로 인한 Node 간 통신)을 Router B 단에서 처리가 가능하므로 Rotuer A에 부하가 줄어듦.
(Router도 하나의 서버와 유사하다는 것을 잊고 있었습니다.)
- 모든 Node를 Router A에 연결할 필요없이, Router B와 Router A 간 연결으로 쉽게 이식 가능.
Internal Network
내부망을 구성하는 것은 Router 간 연결 방법도 고려해야합니다. 내부망 관련으로 정말 많은 자료를 찾아봤는데, 실제 네트워크 기사분들의 자료가 많았던 것 같습니다. 그 중 이해가 제일 잘 되었던 블로그 포스팅입니다.
연결방식 1 - LAN to LAN (내부망 X)

Router A의 LAN 포트를 Router B LAN 포트에 연결하는 방법입니다.
보통 가정에서 네트워크가 닿는 범위를 넓히기 위해서 사용하는 것 같습니다. 물론 지금은 Mesh Network라는 것이 나와서 저렇게 하지 않아도 되지만, 아직도 많은 집들이 저렇게 구성하고 있습니다.
저럴 경우 Router B가 Router A에 대해 허브모드로 동작하게 되며, 단순히 Router A의 확장 역할을 맡게 됩니다. Router B로서의 정체성을 잃어버린다(?) 정도로 표현할 수 있겟습니다.
연결방식 2 - WAN to LAN (내부망 O)

Router A의 LAN 포트를 Router B의 WAN 포트에 연결하는 방법입니다.
이 경우 Router A에서 Router B 자체에 ip를 할당하게 됩니다. 즉, Router B를 네트워크 기기인 동시에 A에 접속한 하나의 접속기기로 여기는 셈입니다. 이 때, Router A의 네트워크 대역과 아예 별개인 Router B의 네트워크 대역을 구성할 수 있고, 이것이 내부망이 됩니다.
AWS VPC를 먼저 공부하신 분들은 Public/Private Subnet 구조를 생각하시면 편한 것 같습니다. Public Subnet 안에 NAT Gateway를 만들고 최종적으로
IG-NAT-Private Subnet을 만들잖아요? 그것과 유사하다고 보시면 됩니다.
실제로 ip 대역이 분리되었나 보겠습니다. 아래는 실제 제가 구성한 환경의 Router A와 Router B의 공유기 현황입니다. Router A는 192.168.0.0/24로 ip 대역을 사용 중입니다. Router B는 192.168.1.0/24로 ip 대역을 사용 중입니다. 즉 Router A와 Router B는 별개의 대역을 구성해서 잘 동작하고 있습니다.



DDNS
ISP(인터넷 서비스 사업자)는 대개 가정환경에 공인 ip를 유동 ip 형태로 제공하고 있습니다.
좀 더 이해하기 쉽게, 외부에서 제가 HomeLab Cluster 노드에 접근 가능한 ip가 유동적으로 변경될 수 있다는 얘기입니다. 통신사에서는 ip를 쉽게 고정시켜주진 않으므로 다른 방법을 찾아야합니다.
이때 DDNS(Dynamic DNS)를 사용하게 됩니다. 말그대로 동적인 DNS입니다. 유동 ip가 변경되더라도 공유기와 DDNS 제공자가 주기적으로 소통하여 동적으로 DNS를 매핑하게 됩니다.
요즘은 공유기를 구입하면 공유기 업체에서 DDNS 하나를 공짜로 제공하기 때문에 비용도 없고 설정도 쉬운 편입니다.
저는 아래와 같이 각 노드의 22번 포트를 Router(공유기)단에서 포트포워딩해서 사용했었습니다.
- master node 22번 → Router n번
- worker node 22번 → Router n+1번
이렇게 사용하면 동작에는 문제없지만 아래와 같은 작업을 반복 수반하게 됩니다.
Router A에서 DMZ 설정 또는 포트포워딩 + Router B에서 포트포워딩(DMZ는 특정 내부 ip에 대해서 포트 전체를 오픈하는 방법입니다)


현재 HomeLab Cluster Network with Meshnet
우선 새로 구성한 아키텍쳐는 다음과 같습니다. 1) NordVPN Meshnet이 추가되었고, 2) Router A와 B 간은 애플리케이션 공개가 필요한 경우나 특수한 경우에만 포트포워딩을하게 됩니다.

사실 기존 아키텍쳐로 구성해서 혼자 쓰는데는 전혀 문제가 없었습니다. 하지만 Ground Rules를 고려했을 때 뭔가 계속 석연치 않던 것 같아요.
기존 아키텍쳐의 문제는 다음과 같았습니다.
- Nested Router 및 내부망 사전 구축으로 HomeLab Cluster 네트워크의 물리적인 부분은 Ground Rules를 만족하지만, 결국에는 Router단에서 DMZ, 포트포워딩, DDNS 설정 작업 등을 거쳐줘야하는 번거로움 발생
- Router A의 설정을 건드려야하므로 제시한 Ground Rules에서 독립성이 저하된다는 문제
- 포트가 노출될 수 밖에 없으므로 ip나 DDNS 주소만 안다면 누구나 접근 가능해서 보안이 취약

NordVPN Meshnet
(무료입니다 무료무료무료무료)돈을 안들이고 다른 방법이 없나하다가 그냥 포기하고 타협을 하려고 했었습니다. 아무리 생각해도 아이디어가 안떠오르더라고요.
그러던 중에 제가 구독했었던 NordVPN에서 Meshnet이라는 서비스가 떠올랐습니다. Meshnet 기능에 한해서 무료라는 것두요.

MattsTechInfo/Meshnet
NordVPN Meshnet Docker Client 리포지토리 (이 사람도 HomeLab 만드는 사람이더라~)
What is Meshnet?
Meshnet은, Meshnet 참여 노드 간에 가상의 네트워크를 구성하는 방식입니다. 즉, 각 노드가 P2P(Peer-to-Peer)로 직접적인 통신을 하게 됩니다.
참여 노드 각각의 가상의 ip가 부여되고, Meshnet 기능만 켜져있으면 언제든지 참여 노드 간 통신이 가능합니다. 당연히 참여 노드가 아니라면 해당 가상 ip에 접근은 불가하고요.
이 과정에서 NordVPN에서는 통신에 VPN 터널링을 사용해서 안전하게 만듭니다.
요약하자면 다음과 같습니다.
- Meshnet 참여 노드만을 위한 가상의 네트워크 구성 (보안 향상)
- 노드 각각에는 Meshnet 상 가상의 ip 주소를 부여 (위치와 관계없이 노드에 대해서)
- 노드 간 P2P 통신이 가능 (물리적인 Router 상 포트포워딩 관련 작업 필요 x)

How it works?
노드 간 가상의 ip가 부여되고 Router 포트포워딩 없이 접근? 이런게 가능하다니~
라고 생각했긴한데 도저히 머리 속으로 이해가 안 되더라구요. 더 큰 문제는 NordVPN에서 제공하는 Docs나 포스팅이 뭔가 명확히 설명하는게 없어서, P2P 관련 자료를 많이 찾아보고 추론했습니다. 실제 NordVPN Meshnet이 이렇게 동작하는 지 정확하진 않으니 참고만 하시면 좋을 것 같습니다.
우선 제 의문은 다음과 같았습니다.
- 어떻게 Router 상의 포트포워딩이 필요하지 않은가? 일단 노드도 물리적인 Router에 연결되어있지 않은가?
- 중개서버 없이 어떻게 가상의 ip 기반으로 P2P 통신이 동작하는가?
뭐 결국엔 알고보니 P2P 및 실시간 통신, UDP 통신에 관한 지식 및 경험이 거의 전무한 상태인 제가 문제였다는 것을 알았습니다.
(얼마전에 아는 분이 K8s 상 STUN 서버 통신에 대한 SSL 인증서 적용 관련으로 문의를 했던 적이 있는데, 저도 몰라서 넘겼었던 대충 넘겼던 기억이…이 때 공부할 걸)
각종 자료를 참고해서 정리해본 결과, 다음과 같이 Meshnet은 동작하게 됩니다.

Meshnet P2P 통신과정
- 각 노드가 Meshnet에 참여의사를 밝힘.
- 이때 각 노드에서 본인의 공인 ip 및 포트를 찾기 위해서 STUN 서버(NordVPN의 중개서버)에 요청을 보냄.
- STUN 서버에서 참여 노드의 공인 ip 및 포트를 교환시켜 줌
- 위에서의 포트는 outbound 포트로 열리게 되며 Timeout 전까지 계속 열려있게 됨.
- 이 포트를 노드 간 통신 과정에 그대로 활용. 이때 UDP 방식으로 패킷을 전송.
- 노드 간 통신에서는 VPN 터널링으로 동작. 출발지 노드에서는 패킷을 Capsuling해서 이 터널로 전송.
- 패킷이 목적지 도착하면 Decapsuling해서 올바른 목적지(포트 등)로 리디렉션
UDP 홀 펀칭 (4~7번)
두 개의 클라이언트가 각각의 NAT Router 뒤에 있을 때, P2P 연결을 설정하기 위해 사용하는 기법 (NAT Traversal)
NAT 라우터가 아웃바운드 패킷을 보낼 때만 포트를 열어두는 특성을 활용.
STUN (Session Traversal Utilities for NAT) (2번)
클라이언트가 NAT(Network Address Translation) 및 방화벽 뒤에 있을 때 자신의 공인 IP 주소와 포트를 알아내기 위해 사용하는 프로토콜
이해가 좀 어려웠는데, 화상 통화나 실시간 통신, 게임 서버 등에서는 흔하게 사용되는 개념이더라구요.
TCP 통신만 주로 다뤘다면 곧바로 이해하기는 좀 어려울 수 있을 것 같습니다.
Hands-On
간단하게 세팅 및 결과 보여드리겠습니다. docs가 막 친절한 편은 아닌듯…Reddit에 NordVPN 서브채널이 있어서 많이 참고했습니다.
(갓 레딧…어쩌면 사례자체는 GPT보다도 레딧에서 찾는게 훨씬 빠르지 않을까)
NordVPN Installation
sh <(curl -sSfhttps://downloads.nordcdn.com/apps/linux/install.sh)로 nordvpn 다운로드 후 sh로 설치
NordVPN Login with token (먼저 웹에서 가입)
GUI 환경에서는
nordvpn login 명령어 치면 자동으로 웹 브라우저로 접속 후 인증하면 됩니다.그러면 CLI는??? NordVPN에서 로그인 방식을 업데이트 중인지 CLI에서는 지금
nordvpn login --legacy 명령어로도 안됩니다. deprecated 됐대요. 근데 대안에 대해서 별 안내가 되어있는 docs 찾기가 힘들더라구요.그래서 그냥 —help로 뒤지기 시작했습니다.

token 밖에 선택지가 보이지 않네요. 아래 링크를 참고해서 token을 받아봅시다.
my.nordaccount.com/dashboard/ 에 접속해서 가이드라인에 따라 token을 받고
--token 옵션에 붙이면 됩니다.
이제 중요한 부분입니다. 저희는 NordVPN의 Meshnet을 쓰는게 목적입니다. VPN을 쓰는게 아니에요!
VPN 기능 활성화 시 기존 SSH 연결 등도 다 끊기게 됩니다.
(새벽에 다시 연구실 갔다와야했던 이유…)
nordvpn connect: NordVPN 리전에 vpn 연결 활성화
nordvpn set meshnet on: NordVPN Meshnet 기능 활성화 후 참여
뭐 이렇게 하면 Meshnet에 노드가 참여하게 되고 다른 노드의 GUI 환경에서 아래처럼 확인할 수 있습니다.

Test
이론에 따라 기존 DDNS, 포트포워딩, DMZ 등등등 Router A, B에 구성했던 rule을 모~두 지우고 SSH 접속 해보았습니다. 잘 동작하네요.
더불어 Meshnet 접속을 끊거나 Meshnet 참여자가 아닌 경우에는 절대 접속 못합니다.
원래는 트래픽 모두 캡쳐해서 분석한 것까지 올리려했는데, WireShark 오류 때문에 실패했읍니다…뭐 위에 참고자료 포스팅 등에서 잘 나와있어서 굳이..ㅎㅎ

Conclusion
사전에 제시했던 아키텍처(0517 이전)은 네트워크를 기초부터 다시 공부할 수 밖에 없었고, Router간 LAN to WAN 연결 및 내부망 구성을 하고 각종 실제 네트워크 기사분들의 자료를 찾아보는 등 저에게 구성 과정 자체가 하나하나 의미있었던 것 같습니다.
NordVPN Meshnet을 사용한 새로운 아키텍처도 학습에 도움이 되었습니다.
STUN, UDP 홀펀칭, NAT Traversal 등 거의 찾아보지 않을 것 같은 지식들을 왜 현재 HomeLab Cluster에서 필요하고 어떻게 동작하는 지 몇날며칠 고민하고 의논했었습니다.
또한 사전에 제시했던 이관석, 이식성, 독립성 3가지의 Ground Rules를 대부분 만족하게 되었습니다. 또한 아래와 같이 트래픽을 종류에 따라 구분하여 처리할 수 있습니다.
- HomeLab 클러스터 노드 간 통신은 기존 Router 고정 ip로 처리
- 외부에서 관리자 접속 및 개발, 테스트용 통신은 NordVPN Meshnet 기반 가상 ip로 처리
- 애플리케이션 외부 공개 등은 Router 상 포트포워딩 등으로 처리
이번 포스팅 작성이 엄청 오래걸렸는데요. 계속 공부하면서 잘못 이해한 지식을 수정해야하는(지금도 수정이 필요한 것 같은) 강박증에 시달렸던 것 같습니다. 그래도 토대가 되는 네트워크를 모든 목적에 맞추어 구축에 성공했고 무지성 구축이 아니라 대부분의 원리를 이해했다는 것에 뿌듯함을 느낍니다.






