
클라우드나 온프레미즈 등 여기저기 흩어져있는 서버에 연결해야하는 경우에 VPN을 쓰게 된다. 다양한 툴들이 있지만 개인적으로 최근에 접하면서 가장 좋아하게 된 것은 tailscale이라는 VPN이었다. 간편한 설정을 제공하면서 wireGuard 기반으로 돌아가는 VPN으로 관리 등 편한 부분들이 많다.
개인적으로 온프레미즈 기반의 쿠버네티스를 운영해야하는 상황에서 외부에서도 작업할 수 있게, 또한 보안상의 문제로 tailscale을 직접 사용하고 있는데 꽤 좋았다. tailscale에 대해서 레퍼런스를 확인할 때, 일반적인 VPN과는 다르게 WireGuard 기반으로 동작한다는 내용이 있었는데, 나중에 한 번 VPN의 비교를 다뤄보면 좋을 것 같다는 생각이 들었다. 이번 포스팅에서는 관련된 내용과 함께 tailscale를 설정하는 방법에 대해서 다룰 예정이다.
Tailscale이란?
Tailscale은 WireGuard 기반으로 돌아가는 메쉬 VPN이다. 키 관리나 NAT 뚫기, 접근 제어같은 골치 아픈 부분을 대신 해주는 서비스라고 볼 수 있다. 다음은 VPN에 대한 위키피디아에 있는 그림으로, 이와 같이 원격으로 다른 지역에 있는 사무실에 연결하려면 인터넷을 거치게 된다.

VPN은 이러한 인터넷을 거쳐가는 트래픽을 안전하게 보낼 수 있도록 터널을 만들어 트래픽을 보호해주는 역할을 하게 된다. 그래서 VPN 광고를 살펴보면 어떤 광고는 자신의 프라이버시를 지키기 위해서 VPN을 광고하기도 하고, 어떤 사람들은 개발 환경에 접근하기 위해서 사용한다. 또는 국가를 바꿔서 특정 사이트에 접속하거나 다른 국가에서는 어떻게 보이는 지 테스트할 수 있다.
보안에 있어서는 Virtual Private Network라는 말에 맞게, 보안에 관련한 요소들을 tailscale은 많이 제공한다. google이나 microsoft 같은 OAuth를 통해서 로그인할 수 있도록 제공하고, 키(key)를 가져오는 것도 자동으로 해주며, ACL을 통해서 어떤 계정이나 그룹이 어떤 IP/Port에 붙을 수 있는지 제어해주고, 접근 기록도 잘 남는다.
개발 환경적인 부분에 있어서는 MagicDNS라며, example.ts.net같은 호스트 이름으로 접근할 수 있도록 제공하기도 한다. 이런 식으로 VPN을 통해서 개발 환경에서 동작할 수 있게 되며, 앱을 개발하는 경우에는 https 연결이 필수적이기 때문에 이렇게 MagicDNS를 통한 개발 환경 제공이 큰 도움이 된다.
그렇다면 tailscale은 어떻게 private network를 구축하는 걸까? 이것은 tailnet이라고 부른다.
tailnet
tailnet은 tailscale에 로그인한 모든 장비(유저가 아니다!)가 하나의 private 네트워크(tailnet)를 형성한다는 개념이다. 각 노드는 100.x.y.z 같은 tailscale 전용 IP를 할당받고, 노드끼리는 가능한 한 P2P로 직접 WireGuard 터널을 맺고, 안 되면 DERP 중계 서버를 사용한다.
tailscale을 설치한 장비들을 콘솔에서 확인해보면 100.으로 시작하는 IP를 할당받은 것을 볼 수 있는데, 이것이 tailnet에 해당한다. tailscale을 깔고 실행하게 되면 서로 어디에 있든지 같은 LAN인 것처럼 보이게 된다.

위와 같이 tailscale에 로그인한 후에 콘솔을 확인하면 같은 VPN에 연결되어있는 기기(Machines)를 관리할 수 있게 된다. 이러한 VPN을 이메일을 통해서 가입하도록 링크를 줄 수도 있으며, 다방면으로 사용할 수 있다.
다음으로는 tailscale에서 사용하는 wireGuard에 대해서 간단하게 설명한다.
WireGuard란?
WireGuard는 최신식 VPN 터널링 프로토콜로, OpenVPN이나 IPSec보다 단순하고 경량화된 프로토콜이다. 몇 개 안되는 모던 암호 알고리즘 세트와 작은 코드베이스로 가볍게 쓸 수 있다. 이러한 WireGuard 자체만으로 VPN을 사용하게 되면, 키 관리나 NAT 설정 등 복잡한 부분을 직접 설정해야한다.
대표적인 문제로는 망이 늘어날수록 설정이 n의 제곱으로 늘어나는 문제가 있는데, tailscale의 경우에는 메시 토폴로지를 구성하였고, ACL 등을 제공하기 때문에 복잡한 관리를 대신 해주게 된다. 이번 포스팅에서 WireGuard는 자세한 설명을 생략한다. 아래에서 관련된 정보를 참고할 수 있다.
- [github] wireGuard : https://github.com/wireguard
WireGuard
Mirror of various WireGuard-related projects. See https://www.wireguard.com/repositories/ for official repositories. - WireGuard
github.com
다음으로는 tailscale에서 라우팅하는 기능을 살펴보자.
tailscale의 라우팅

이러한 콘솔을 보면 Subnets, Exit Node와 같이 칩이 떠있는 것을 볼 수 있는데, 둘다 중요하게 tailscale에서 라우팅하는 역할을 한다. 기본적인 tailscale은 같은 노드끼리 통신만 라우팅하고, 일반 인터넷은 각자 로컬 네트워크에서 나간다. 이 두 가지 세팅을 추가해야 '라우팅 범위'를 확장할 수 있다.
tailscale을 통해서 해당 세팅을 진행하기 전에 앞서, 먼저 tailscale을 설치해야한다. cli 기반으로 동작하는 방법을 다루며, 설치는 리눅스 기준으로 설명한다. 아래의 명령어를 통해서 설치 및 실행을 진행할 수 있다.
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
위와 같은 명령어를 통해서 tailscale을 설치한 노드끼리 피어 통신은 가능하게 됐다. 하지만 VPN을 통해서 IP 대역을 오가는 설정을 하기 위해서는 추가적인 세팅을 진행해야한다.
Exit node : 내 모든 인터넷 트래픽을 저기로 보내줘
Exit node를 쓰면, 클라이언트의 기본 라우트가 0.0.0.0/0, ::/0를 exit node로 향하게 된다. 사실상 "VPN 서버" 처럼 동작하게 된다. 클라이언트 입장에서 보면, 인터넷 트래픽이 먼저 Exit node로 가서 거기서 다시 외부 인터넷으로 나간다고 볼 수 있다.

그림으로 간단하게 나타내면 위와 같다. 왼쪽에 있는 노드에서 exit node를 다른 노드로 찍으면, 해당 노드를 통해서 트래픽이 나가게 된다. 다음과 같은 명령어를 통해서 exit node를 설정할 수 있다.
sudo tailscale up --advertise-exit-node
해당 설정을 통해서 exit 노드를 지정할 수 있다.
Subnet router: 저 네트워크(192.168.x.x)로 길 좀 터줘
Subnet router는 특정 서브넷(예: 192.168.0.0/24)에 대한 라우트를 광고하는 노드이다. tailscale을 깔 수 없는 장비(프린터, NAS, IoT, 사무실 네트워크 장비 등)에 접근할 때 사용한다. 기본적으로 SNAT를 사용해서, 내부 장비에서는 트래픽이 "subnet router의 IP에서 온 것처럼" 보이게 된다.

exit node만 쓰는 경우에는 기본적으로 192.168.0.50이라는 IP를 가진 노드를 통해서 트래픽을 내보내는 것이다. 그렇기 때문에 같은 대역 에 있는 NAS나 printer에 붙을 수가 없다. 이 경우에는 해당 노드를 subnet router로 만들고, 192.168.0.0/24를 advertise 해줘야한다.
exit node를 쓰면 클라이언트 입장에서 0.0.0.0/0, ::/0 기본 게이트웨이가 "인터넷으로 나갈 때에는 저 tailscale 노드(100.x.x.x)로 먼저 보내라"로 바뀌고, 그 노드(192.168.0.50)은 받은 패킷을 NAT해서 인터넷으로 내보낸다. 즉, 밖에서 보면 192.168.0.50의 공인 IP로 나가는 것처럼 보이는 것은 맞지만, Tailscale이 공식적으로 약속하는 것은 인터넷 트래픽에 대한 동작이다. LAN(192.168.x.x) 같은 프라이빗 대역은 인터넷이 아니라 다른 내부망에 해당하기 때문에 추가적인 설정을 해줘야한다.
- [tailscale] subnet route : https://tailscale.com/kb/1019/subnets
Subnet routers · Tailscale Docs
Use subnet routers to give devices outside your local network access to services within specific subnets. Extend your private network with Tailscale.
tailscale.com
다음과 같은 명령어를 통해서 exit node와 함께 켤 수 있다. 참고로 subnet router는 exit node랑 함께 설정되어야 의미가 있기 때문에 단독으로 켤 수 없다. 명령어를 입력하면 둘 다 입력하라는 문구가 나온다.
sudo tailscale up \
--advertise-exit-node \
--advertise-routes=192.168.0.0/24
이렇게 설정을 마치면 정상적으로 NAS(192.168.0.10) 그리고 printer(192.168.0.20)에 접근할 수 있게 된다.
마치며
위 설정에 따라서 subnet routes와 exit node를 설정하게 되면, 콘솔에 들어갔을 때, 다음과 같이 edit 창에서 볼 수 있다. 체크 박스를 눌러 save를 시켜주면 된다. tailscale의 서버가 되는 노드의 설정을 누르면 된다.

이 외에도 tailscale 공식 문서를 살펴보면 많은 기능들이 있다. 특히 보안이나 접근 기록과 같은 부분에서 굉장히 강력한 기능들을 많이 제공하기 때문에 관심이 있는 사람이라면 꼭 한 번 살펴보길 바란다.
'DevOps > On-premise' 카테고리의 다른 글
| [Jenkins] jenkins parameter(파라미터) 설정 및 활용 (2) | 2024.11.20 |
|---|---|
| AWS에서 온프레미즈 Jenkins로의 여정 (5) | 2024.11.08 |
| Nginx Proxy Manager란? (1) | 2024.11.01 |