# ๐Ÿ”— Tailscale ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ ๋ฐ ํ…Œ์ŠคํŠธ ๊ฐ€์ด๋“œ ## ๐Ÿ“‹ ํ…Œ์ŠคํŠธ ๊ฐœ์š” - **๋ชฉ์ **: Headscale ์„œ๋ฒ„์— Tailscale ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ ๋ฐ VPN ๊ธฐ๋Šฅ ๊ฒ€์ฆ - **ํ™˜๊ฒฝ**: Ubuntu 24.04 LTS, Tailscale 1.86.2 - **์„œ๋ฒ„**: Headscale (http://localhost:8070) ## ๐Ÿ› ๏ธ ์‚ฌ์ „ ์ค€๋น„์‚ฌํ•ญ - Headscale ์„œ๋ฒ„๊ฐ€ ์ •์ƒ ์ž‘๋™ ์ค‘ (8070 ํฌํŠธ) - ์‚ฌ์šฉ์ž ๋ฐ Pre-auth ํ‚ค ์ƒ์„ฑ ์™„๋ฃŒ - ํ…Œ์ŠคํŠธํ•  ํด๋ผ์ด์–ธํŠธ ์žฅ์น˜ ์ค€๋น„ ## ๐Ÿ“Š ๊ธฐ๋ณธ ์ •๋ณด ํ™•์ธ ### Headscale ์„œ๋ฒ„ ์ƒํƒœ ```bash # API ํ—ฌ์Šค ์ฒดํฌ curl -s http://localhost:8070/health # ์‘๋‹ต: {"status":"pass"} # ์ปจํ…Œ์ด๋„ˆ ์ƒํƒœ ํ™•์ธ docker-compose ps # STATUS: Up (healthy ๋˜๋Š” running) ``` ### ์‚ฌ์šฉ์ž ๋ฐ ํ‚ค ์ •๋ณด ```bash # ์‚ฌ์šฉ์ž ๋ชฉ๋ก docker-compose exec headscale headscale users list # ๊ฒฐ๊ณผ: myuser (ID: 1) # Pre-auth ํ‚ค ํ™•์ธ echo "Pre-auth Key: fc4f2dc55ee00c5352823d156129b9ce2df4db02f1d76a21" ``` ## ๐Ÿš€ Tailscale ํด๋ผ์ด์–ธํŠธ ์„ค์น˜ ### Ubuntu/Debian ์„ค์น˜ ```bash # ๊ณต์‹ ์„ค์น˜ ์Šคํฌ๋ฆฝํŠธ ์‚ฌ์šฉ curl -fsSL https://tailscale.com/install.sh | sh # ์„ค์น˜ ํ™•์ธ tailscale version # ๊ฒฐ๊ณผ: 1.86.2 ``` ### ์„ค์น˜ ํ›„ ์„œ๋น„์Šค ์ƒํƒœ ํ™•์ธ ```bash # Tailscale ๋ฐ๋ชฌ ์ƒํƒœ ํ™•์ธ sudo systemctl status tailscaled # Active: active (running) # Tailscale ๋ช…๋ น์–ด ํ™•์ธ which tailscale # /usr/bin/tailscale ``` ## ๐Ÿ”— Headscale ์„œ๋ฒ„ ์—ฐ๊ฒฐ ### ์—ฐ๊ฒฐ ๋ช…๋ น์–ด ์‹คํ–‰ ```bash # Pre-auth ํ‚ค๋ฅผ ์‚ฌ์šฉํ•œ ์ž๋™ ์—ฐ๊ฒฐ tailscale up --login-server=http://localhost:8070 --authkey=fc4f2dc55ee00c5352823d156129b9ce2df4db02f1d76a21 ``` ### ์—ฐ๊ฒฐ ์„ฑ๊ณต ํ™•์ธ ```bash # ์—ฐ๊ฒฐ ์ƒํƒœ ํ™•์ธ tailscale status ``` **์„ฑ๊ณต์ ์ธ ์ถœ๋ ฅ ์˜ˆ์‹œ:** ``` 100.64.0.1 0bin-ubuntu-vm myuser linux - ``` ## ๐Ÿ“ก ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค ํ™•์ธ ### Tailscale ์ธํ„ฐํŽ˜์ด์Šค ์ƒ์„ฑ ํ™•์ธ ```bash # tailscale0 ์ธํ„ฐํŽ˜์ด์Šค ํ™•์ธ ip addr show tailscale0 ``` **์ถœ๋ ฅ ๊ฒฐ๊ณผ:** ``` 214: tailscale0: mtu 1280 qdisc pfifo_fast state UNKNOWN group default qlen 500 link/none inet 100.64.0.1/32 scope global tailscale0 valid_lft forever preferred_lft forever inet6 fd7a:115c:a1e0::1/128 scope global valid_lft forever preferred_lft forever inet6 fe80::a49:8d96:4244:2fcf/64 scope link stable-privacy valid_lft forever preferred_lft forever ``` ### IP ์ฃผ์†Œ ํ• ๋‹น ํ™•์ธ - **IPv4**: `100.64.0.1/32` - **IPv6**: `fd7a:115c:a1e0::1/128` - **๋งํฌ๋กœ์ปฌ**: `fe80::a49:8d96:4244:2fcf/64` ## ๐ŸŒ Headscale ์„œ๋ฒ„์—์„œ ๋…ธ๋“œ ํ™•์ธ ### ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ๋ชฉ๋ก ํ™•์ธ ```bash docker-compose exec headscale headscale nodes list ``` **์ถœ๋ ฅ ๊ฒฐ๊ณผ:** ``` ID | Hostname | Name | MachineKey | NodeKey | User | IP addresses | Ephemeral | Last seen | Expiration | Connected | Expired 1 | 0bin-Ubuntu-VM | 0bin-ubuntu-vm| [rzOhs] | [SbpbT] | myuser | 100.64.0.1, fd7a:115c:a1e0::1| false | 2025-09-09 05:42:25 | N/A | online | no ``` ### ๋…ธ๋“œ ์„ธ๋ถ€ ์ •๋ณด - **ID**: 1 - **ํ˜ธ์ŠคํŠธ๋ช…**: 0bin-Ubuntu-VM - **๋…ธ๋“œ๋ช…**: 0bin-ubuntu-vm - **์‚ฌ์šฉ์ž**: myuser - **IP ์ฃผ์†Œ**: 100.64.0.1 (IPv4), fd7a:115c:a1e0::1 (IPv6) - **์ƒํƒœ**: online - **์ž„์‹œ ๋…ธ๋“œ**: false - **๋งŒ๋ฃŒ**: ์—†์Œ ## ๐Ÿงช ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ ### 1. ์ž๊ธฐ ์ž์‹  ํ•‘ ํ…Œ์ŠคํŠธ ```bash # IPv4 ํ•‘ ํ…Œ์ŠคํŠธ ping -c 3 100.64.0.1 ``` **์„ฑ๊ณต ๊ฒฐ๊ณผ:** ``` PING 100.64.0.1 (100.64.0.1) 56(84) bytes of data. 64 bytes from 100.64.0.1: icmp_seq=1 ttl=64 time=0.032 ms 64 bytes from 100.64.0.1: icmp_seq=2 ttl=64 time=0.044 ms 64 bytes from 100.64.0.1: icmp_seq=3 ttl=64 time=0.050 ms --- 100.64.0.1 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2080ms rtt min/avg/max/mdev = 0.032/0.042/0.050/0.007 ms ``` ### 2. IPv6 ํ•‘ ํ…Œ์ŠคํŠธ ```bash # IPv6 ํ•‘ ํ…Œ์ŠคํŠธ ping6 -c 3 fd7a:115c:a1e0::1 ``` ### 3. DNS ํ™•์ธ (Magic DNS) ```bash # Magic DNS ํ…Œ์ŠคํŠธ (์„ค์ •๋œ ๊ฒฝ์šฐ) nslookup 0bin-ubuntu-vm.headscale.local ``` ## ๐Ÿ“‹ ์ถ”๊ฐ€ ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ ๋ฐฉ๋ฒ• ### ๋‹ค๋ฅธ ์žฅ์น˜์—์„œ ์—ฐ๊ฒฐํ•˜๊ธฐ #### Windows ```cmd # PowerShell ๋˜๋Š” Command Prompt์—์„œ tailscale up --login-server=http://YOUR_SERVER_IP:8070 --authkey=fc4f2dc55ee00c5352823d156129b9ce2df4db02f1d76a21 ``` #### macOS ```bash # Terminal์—์„œ sudo tailscale up --login-server=http://YOUR_SERVER_IP:8070 --authkey=fc4f2dc55ee00c5352823d156129b9ce2df4db02f1d76a21 ``` #### ๋‹ค๋ฅธ Linux ์žฅ์น˜ ```bash # ๋™์ผํ•œ ๋ช…๋ น์–ด ์‚ฌ์šฉ tailscale up --login-server=http://YOUR_SERVER_IP:8070 --authkey=fc4f2dc55ee00c5352823d156129b9ce2df4db02f1d76a21 ``` ### ์ƒˆ๋กœ์šด Pre-auth ํ‚ค ์ƒ์„ฑ (ํ•„์š”์‹œ) ```bash # ์ƒˆ๋กœ์šด 24์‹œ๊ฐ„ ์œ ํšจ ํ‚ค ์ƒ์„ฑ docker-compose exec headscale headscale preauthkeys create --user 1 --reusable --expiration 24h ``` ## ๐Ÿ” ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๊ด€๋ฆฌ ### ์‹ค์‹œ๊ฐ„ ์—ฐ๊ฒฐ ์ƒํƒœ ๋ชจ๋‹ˆํ„ฐ๋ง ```bash # ์‹ค์‹œ๊ฐ„ ๋กœ๊ทธ ํ™•์ธ docker-compose logs -f headscale # Tailscale ์ƒํƒœ ์ง€์† ํ™•์ธ watch -n 5 'tailscale status' ``` ### ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ ๋ชจ๋‹ˆํ„ฐ๋ง ```bash # tailscale0 ์ธํ„ฐํŽ˜์ด์Šค ํŠธ๋ž˜ํ”ฝ ํ™•์ธ iftop -i tailscale0 # ๋˜๋Š” ๊ฐ„๋‹จํ•œ ํ†ต๊ณ„ ip -s link show tailscale0 ``` ## ๐Ÿšจ ๋ฌธ์ œ ํ•ด๊ฒฐ ### ์—ฐ๊ฒฐ ์‹คํŒจ ์‹œ ์ฒดํฌ๋ฆฌ์ŠคํŠธ #### 1. Headscale ์„œ๋ฒ„ ์ƒํƒœ ํ™•์ธ ```bash curl -f http://localhost:8070/health || echo "Headscale not responding" ``` #### 2. ๋ฐฉํ™”๋ฒฝ ์„ค์ • ํ™•์ธ ```bash # 8070 ํฌํŠธ ์˜คํ”ˆ ํ™•์ธ sudo ufw status | grep 8070 # ํ•„์š”์‹œ ํฌํŠธ ๊ฐœ๋ฐฉ sudo ufw allow 8070 ``` #### 3. Pre-auth ํ‚ค ์œ ํšจ์„ฑ ํ™•์ธ ```bash # ํ‚ค ๋ชฉ๋ก ํ™•์ธ docker-compose exec headscale headscale preauthkeys list ``` #### 4. Tailscale ์„œ๋น„์Šค ์žฌ์‹œ์ž‘ ```bash sudo systemctl restart tailscaled ``` ### ์—ฐ๊ฒฐ ํ•ด์ œ ๋ฐ ์žฌ์—ฐ๊ฒฐ ```bash # ์—ฐ๊ฒฐ ํ•ด์ œ tailscale down # ์žฌ์—ฐ๊ฒฐ tailscale up --login-server=http://localhost:8070 --authkey=fc4f2dc55ee00c5352823d156129b9ce2df4db02f1d76a21 ``` ## ๐Ÿ“Š ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ### ๋Œ€์—ญํญ ํ…Œ์ŠคํŠธ (2๊ฐœ ์ด์ƒ ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ ์‹œ) ```bash # iperf3 ์„ค์น˜ sudo apt install iperf3 # ์„œ๋ฒ„ ๋ชจ๋“œ (์ฒซ ๋ฒˆ์งธ ํด๋ผ์ด์–ธํŠธ) iperf3 -s # ํด๋ผ์ด์–ธํŠธ ๋ชจ๋“œ (๋‘ ๋ฒˆ์งธ ํด๋ผ์ด์–ธํŠธ) iperf3 -c 100.64.0.1 ``` ### ์ง€์—ฐ์‹œ๊ฐ„ ํ…Œ์ŠคํŠธ ```bash # ์ง€์†์ ์ธ ํ•‘ ํ…Œ์ŠคํŠธ ping -i 0.1 100.64.0.1 ``` ## ๐ŸŽฏ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ ์š”์•ฝ ### โœ… ์„ฑ๊ณต์ ์œผ๋กœ ํ™•์ธ๋œ ๊ธฐ๋Šฅ 1. **ํด๋ผ์ด์–ธํŠธ ์„ค์น˜**: Tailscale 1.86.2 ์„ค์น˜ ์™„๋ฃŒ 2. **์„œ๋ฒ„ ์—ฐ๊ฒฐ**: Pre-auth ํ‚ค๋ฅผ ํ†ตํ•œ ์ž๋™ ์ธ์ฆ ์„ฑ๊ณต 3. **IP ํ• ๋‹น**: IPv4(100.64.0.1), IPv6(fd7a:115c:a1e0::1) ์ •์ƒ ํ• ๋‹น 4. **๋„คํŠธ์›Œํฌ ํ†ต์‹ **: ํ•‘ ํ…Œ์ŠคํŠธ ์„ฑ๊ณต (0% ํŒจํ‚ท ์†์‹ค) 5. **์ธํ„ฐํŽ˜์ด์Šค ์ƒ์„ฑ**: tailscale0 ์ธํ„ฐํŽ˜์ด์Šค ์ •์ƒ ์ƒ์„ฑ 6. **์„œ๋ฒ„ ์ธ์‹**: Headscale์—์„œ ๋…ธ๋“œ ์ •์ƒ ์ธ์‹ ### ๐Ÿ“ˆ ๋„คํŠธ์›Œํฌ ์„ฑ๋Šฅ - **ํ•‘ ์ง€์—ฐ์‹œ๊ฐ„**: ํ‰๊ท  0.042ms (๋กœ์ปฌ) - **ํŒจํ‚ท ์†์‹ค**: 0% - **MTU**: 1280 bytes - **์ƒํƒœ**: UNKNOWN (์ •์ƒ ๋™์ž‘) ### ๐Ÿ”’ ๋ณด์•ˆ ํ™•์ธ์‚ฌํ•ญ - **์•”ํ˜ธํ™”**: WireGuard ํ”„๋กœํ† ์ฝœ ์‚ฌ์šฉ - **์ธ์ฆ**: Pre-auth ํ‚ค ๊ธฐ๋ฐ˜ ์ž๋™ ์ธ์ฆ - **ํ‚ค ๊ด€๋ฆฌ**: 24์‹œ๊ฐ„ ๋งŒ๋ฃŒ, ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ ์„ค์ • ## ๐Ÿš€ ๊ฒฐ๋ก  Headscale ์„œ๋ฒ„์™€ Tailscale ํด๋ผ์ด์–ธํŠธ ๊ฐ„์˜ ์—ฐ๊ฒฐ์ด ์™„๋ฒฝํ•˜๊ฒŒ ์„ฑ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค. **์ฃผ์š” ์„ฑ๊ณผ:** - โœ… VPN ํ„ฐ๋„ ๊ตฌ์„ฑ ์™„๋ฃŒ - โœ… IP ์ฃผ์†Œ ์ž๋™ ํ• ๋‹น ์„ฑ๊ณต - โœ… ์‹ค์‹œ๊ฐ„ ํ†ต์‹  ํ™•์ธ - โœ… Headscale ๊ด€๋ฆฌ ์ธํ„ฐํŽ˜์ด์Šค ์ •์ƒ ๋™์ž‘ - โœ… Headplane ์›น UI ์™ธ๋ถ€ ์ ‘์† ์„ฑ๊ณต ### ๐ŸŒ ์™„์ „ํ•œ ๊ด€๋ฆฌ ํ™˜๊ฒฝ ๊ตฌ์ถ• - **Headscale API**: http://localhost:8070 (๋ช…๋ น์ค„ ๊ด€๋ฆฌ) - **Headplane UI**: http://192.168.0.151:3000/admin/ (์›น ๊ด€๋ฆฌ) - **๋กœ๊ทธ์ธ API Key**: `8qRr1IB.tV95CmA0fLaCiGGIgBfeoN9daHceFkzI` ์ด์ œ **Tailscale์„ ์™„์ „ํžˆ ๋Œ€์ฒด**ํ•  ์ˆ˜ ์žˆ๋Š” ์ž์ฒด ํ˜ธ์ŠคํŒ… VPN ์†”๋ฃจ์…˜์ด ๊ตฌ์ถ•๋˜์—ˆ์Šต๋‹ˆ๋‹ค!