위그드라실(Yggdrasil) 네트워크는 탈중앙화되고 암호화된 메시(mesh) 네트워크를 지향하는 IPv6 오버레이 네트워크입니다. 네트워크를 이진 트리(binary tree)의 잎사귀처럼 다루는 독특한 방식으로 이를 구현합니다. 오버레이 네트워크인 만큼, 위그드라실은 사용자들이 서로 안전하게 통신할 수 있게 해주는 가상 사설망(VPN) 역할도 수행합니다.
게다가 위그드라실은 무료로 제공되며, 비교적 손쉽게 설정할 수 있고 다양한 플랫폼에서 사용 가능합니다. 이러한 장점 덕분에 보안성 높고 프라이버시가 보장되는 연결을 원하는 사용자에게 강력한 대안이 됩니다.
메시 네트워킹과 위그드라실이란?
위그드라실은 네트워크를 상호 연결된 노드(node)들의 트리 구조로 표현함으로써 메시 네트워킹을 실현합니다. 각 노드는 다른 노드로 데이터를 전달하는 릴레이(relay) 역할을 할 수 있어, 위그드라실은 진정한 의미의 메시 네트워크라고 할 수 있습니다.
또한 이러한 네트워크 구조 덕분에 위그드라실은 방문하고자 하는 기기나 웹사이트를 손쉽게 찾아낼 수 있습니다. 그 결과 중앙 서버 없이도 트래픽 경로를 스스로 결정하며 다른 사용자와 통신할 수 있습니다.
왜 위그드라실을 사용해야 할까?
위그드라실의 가장 큰 매력은 인터넷을 통해 데이터가 전달되는 방식 자체를 바꾼다는 점입니다. 이는 기본 네트워크 상태에 대한 몇 가지 전제를 바탕으로 작동합니다:
- 모든 노드는 최소 하나 이상의 다른 노드와 연결되어 있다.
- 각 노드는 다른 노드로 데이터를 투명하게 중계할 수 있다.
- 각 노드는 자신에게 연결된 노드 정보를 브로드캐스트할 수 있다.
이러한 전제들은 견고하고 예측 가능하면서도 동시에 매우 유연한 구조를 만들어냅니다. 예를 들어, 단 하나의 공개 노드에 연결하는 것만으로도 내 기기를 외부에 공개할 수 있습니다. 이 공개 노드는 다른 노드들과도 연결되어 있으므로, 다른 사용자들은 해당 노드와 피어링(peering)하여 내 기기에 접속할 수 있습니다.
여기에 더해, 위그드라실은 로컬 기기들로 구성된 하위 네트워크(subnetwork)를 만드는 것도 가능합니다. 따라서 VPN을 구축하려는 경우 특히 유용합니다.
위그드라실 설치 방법
앞서 언급했듯이 위그드라실은 다양한 플랫폼과 운영체제에서 사용할 수 있으며, 대부분의 리눅스 배포판도 지원됩니다.
다만 위그드라실이 항상 기본 저장소에 포함되어 있는 것은 아니기 때문에, 일부 배포판에서는 설치 전에 소스를 먼저 추가해야 합니다.
데비안 및 우분투에 위그드라실 설치하기
데비안이나 우분투에 위그드라실을 설치하려면 먼저 공식 GPG 키를 apt에 추가해야 합니다. 다음 명령어를 실행하세요:
gpg --fetch-keys https://neilalexander.s3.dualstack.eu-west-2.amazonaws.com/deb/key.txt gpg --export 569130E8CA20FBC4CB3FDE555898470A764B32C9 | sudo apt-key add -
다음으로, apt가 패키지를 검색할 때 참조하는 소스 목록에 저장소를 추가합니다:
echo 'deb https://neilalexander.s3.dualstack.eu-west-2.amazonaws.com/deb/ debian yggdrasil' | sudo tee /etc/apt/sources.list.d/yggdrasil.list
완료되면 apt를 업데이트하고 프로그램을 설치합니다. 아래 한 줄의 명령어로 처리할 수 있습니다:
sudo apt update && sudo apt install yggdrasil
페도라에 위그드라실 설치하기
데비안이나 우분투와 달리, 페도라에서의 설치 과정은 매우 간단합니다. 위그드라실이 이미 페도라의 "커뮤니티 패키지(Community Packages)"에 포함되어 있기 때문입니다.
따라서 다음 명령어만 실행하면 바로 설치할 수 있습니다:
sudo dnf copr enable rany/yggdrasil sudo dnf install yggdrasil
아치 리눅스에 위그드라실 설치하기
마지막으로 아치 리눅스에서도 설치가 무척 간단합니다. 페도라와 마찬가지로 커뮤니티 저장소에 이미 포함되어 있기 때문입니다.
따라서 pacman을 통해 간단히 설치할 수 있습니다:
sudo pacman -Syu yggdrasil
설치 후 설정하기
설치가 끝나면 노드에 연결하도록 위그드라실을 설정하는 작업은 매우 간단합니다. "/etc/yggdrasil.conf" 파일만 수정하면 프로그램의 동작 방식을 구성할 수 있습니다. nano 에디터로 파일을 열어보세요:
sudo nano -w /etc/yggdrasil.conf
위그드라실은 설치 후 이 파일을 자동으로 생성하지만, 만약 생성되지 않았다면 다음 명령어로 새 설정 파일을 만들 수 있습니다:
su --command="yggdrasil -genconf > /etc/yggdrasil.conf"
공개 노드에 연결하기
앞서 살펴본 것처럼 이 프로그램에는 두 가지 활용 방법이 있습니다:
- 공개 노드에 연결하여 내 기기를 네트워크에서 검색 가능하게 만든다.
- 여러 대의 기기를 하나의 가상 사설망으로 묶는다.
먼저 첫 번째 방법의 경우, 설정 파일의 Peers: 블록에 공개 노드 주소를 추가해야 합니다.
이 섹션은 어떤 노드에 연결할지를 결정합니다. 여기에 나열된 기기들은 모두 인터넷에서 공개적으로 검색 가능하고 접속 가능해야 합니다.
이를 고려하여 다음 예시를 살펴보겠습니다:
{
# List of connection strings for outbound peer connections in URI format,
# e.g. tls://a.b.c.d:e or socks://a.b.c.d:e/f.g.h.i:j. These connections
# will obey the operating system routing table, therefore you should
# use this section when you may connect via different interfaces.
Peers: [
tls://address.domain:port
tcp://1.2.3.4:port
socks://[aaaa:...:ffff]/[1111:...:9999]
]
[...]
Peers 블록은 연결하고자 하는 모든 노드의 목록입니다.
TLS나 SOCKS를 사용한 암호화 연결 또는 TCP를 사용한 비암호화 연결 중 선택할 수 있습니다. 후자는 TLS를 지원하지 않지만 기본적인 네트워크 연결만 되어 있는 소형 임베디드 기기를 연결할 때 유용합니다.
이제 커뮤니티에서 제공하는 공개 노드 링크 몇 개를 복사해서 붙여넣으면 공개 위그드라실 네트워크에 접속할 수 있습니다.
설정을 마친 후 다음 명령어로 프로그램을 활성화합니다:
sudo systemctl enable yggdrasil sudo systemctl start yggdrasil
네트워크에 제대로 연결되었는지 확인하려면 위그드라실에서 제공하는 테스트 웹페이지에 접속해 보면 됩니다.
자신만의 사설 네트워크 만들기
반면 사설 네트워크를 직접 구축하는 것은 약간 더 복잡하지만 여전히 어렵지 않습니다. 사설 위그드라실 네트워크를 만들려면 몇 가지 준비물이 필요합니다:
- 외부에서 접근 가능한 공개 기기. CG-NAT에 차단되지 않은 로컬 기기이거나 저렴한 가상 사설 서버(VPS)면 충분합니다.
- 서로 직접 통신할 수 없는 서로 다른 네트워크에 위치한 여러 대의 기기.
개인 공개 노드 설정하기
사설 위그드라실 네트워크를 만들려면 우선 공개 기기가 다른 노드와 연결될 수 있도록 허용해야 합니다. 이를 위해 공개 기기의 "/etc/yggdrasil.conf" 파일에서 Listen: 블록을 수정합니다.
예를 들어, 외부 접속을 받도록 구성된 노드는 다음과 같은 모습일 수 있습니다:
[...]
# Listen addresses for incoming connections. You will need to add
# listeners in order to accept incoming peerings from non-local nodes.
# Multicast peer discovery will work regardless of any listeners set
# here. Each listener should be specified in URI format as above, e.g.
# tls://0.0.0.0:0 or tls://[::]:0 to listen on all interfaces.
Listen: [
tls://your.ipv4.address.here:12345
tcp://[your:ipv6:address:here]:12345
]
[...]
여기서는 노드가 IPv4와 IPv6 양쪽 모두에서 12345 포트로 들어오는 연결을 받도록 설정했습니다. 추가로 IPv4 연결은 TLS로 감싸져 있고, IPv6는 암호화되지 않은 TCP를 사용합니다.
이후 위그드라실 서비스를 활성화하고 시작하면 설정이 적용됩니다. 그다음부터는 이 노드에 연결하는 방법이 공개 노드에 연결하는 것과 동일합니다.
주소 확인 및 접근 제한
기본적으로 새로 만든 위그드라실 노드는 올바른 포트를 사용하기만 하면 어떤 연결이든 받아들입니다. 기기들을 위한 진정한 사설 VPN을 만들려면 이들을 공개 키 화이트리스트에 추가해야 합니다.
위그드라실 노드는 처음 설치 시 생성된 고유한 공개 키를 브로드캐스트하는 방식으로 작동합니다. 이 키는 네트워크 내에서 보안을 확보하고 주소를 생성하는 데 사용됩니다.
다음 명령어로 자신의 위그드라실 주소를 확인할 수 있습니다:
sudo yggdrasilctl getself
이 명령은 "20x: … " 형식으로 시작하는 IPv6 주소를 표시합니다. 이 주소를 통해 위그드라실을 경유하여 해당 기기에 직접 접속할 수 있습니다.
또한 getself 명령은 기기의 공개 키도 함께 표시합니다. 공개 노드에서 접속을 허용할 기기 목록을 만들 때 필요한 것이 바로 이 공개 키입니다.
접근을 제한하도록 개인 노드 설정하기
위그드라실 노드에 대한 접근을 제한하려면 공개 노드의 "/etc/yggdrasil.conf" 파일에서 AllowedPublicKeys: 블록을 수정해야 합니다. 이 노드가 받아들이길 원하는 공개 키를 모두 추가하면 됩니다.
예를 들어, 세 개의 공개 키만 허용하는 노드의 설정은 다음과 같습니다:
# List of peer public keys to allow incoming peering connections
# from. If left empty/undefined then all connections will be allowed
# by default. This does not affect outgoing peerings, nor does it
# affect link-local peers discovered via multicast.
AllowedPublicKeys: [
"publickey1"
"publickey2"
"publickey3"
]
설정을 마친 후 위그드라실 서비스를 재시작하면 변경 사항이 적용됩니다:
sudo systemctl restart yggdrasil
축하합니다! 이제 위그드라실 네트워크의 작동 원리를 기본적으로 이해했으며, 사설 네트워크를 연결하고 구성하는 방법도 익혔습니다.
인터넷의 작동 원리가 궁금해졌다면 tcpdump로 TCP 패킷을 캡처하는 방법을 다룬 글도 함께 확인해 보세요.
자주 묻는 질문(FAQ)
1. 친구의 위그드라실 주소를 설정 파일에 추가했는데 연결되지 않습니다. 무엇이 문제인가요?
여러 가지 원인이 있을 수 있지만, 가장 흔한 원인은 다음과 같습니다:
- 두 기기 모두 NAT 뒤에 있어 서로 직접 연결을 맺을 수 없는 경우.
- "/etc/yggdrasil.conf" 파일의
Peers:블록과Listen:블록이 잘못 구성된 경우.
첫 번째 원인의 경우, 최소 한 대의 기기가 외부에서 접근 가능하도록 해야 합니다. 사용 중인 포트가 포트 포워딩(port forwarding)으로 제대로 열려 있고 로컬 네트워크 외부에서 보이는지도 확인하세요.
두 번째 원인의 경우, Peers:와 Listen: 블록에 피어링 기기의 실제 IPv4 또는 IPv6 주소가 입력되어 있는지 확인하세요. 위그드라실 주소가 아닌 실제 주소여야 합니다.
2. 내 기기들이 서로 제대로 피어링되고 있는지 어떻게 알 수 있나요?
다음 명령어를 실행하면 기기 간 피어링 상태를 손쉽게 확인할 수 있습니다:
sudo yggdrasilctl getpeers
이 명령은 현재 연결된 모든 피어와 각 피어의 위그드라실 네트워크 트리 내 상대적 위치를 표시해 줍니다.
3. 더 강력한 위그드라실 키와 주소를 만들 수 있나요?
네, 가능합니다! 주소 마이너(address miner)를 사용하면 됩니다. 이는 앞부분에 특정 개수의 0이 포함된 공개 키 쌍을 무차별 대입(brute force) 방식으로 계산해내는 간단한 프로그램입니다.
가장 널리 쓰이는 도구는 Simple Yggdrasil Generator(SYG)이며, 최신 버전은 C++로 작성되었습니다.