Initial commit: Tailscale Docker deployment with Headscale
Docker Compose 部署 Tailscale 連線至自架 Headscale 控制伺服器, 包含子網路由、出口節點、iptables NAT 設定及完整中文文件。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
.env
|
||||||
|
.omc/
|
||||||
42
CLAUDE.md
Normal file
42
CLAUDE.md
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
# CLAUDE.md
|
||||||
|
|
||||||
|
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Docker-based Tailscale deployment using a self-hosted Headscale control server (`https://headscale.lotimmy.com`). Runs a `tailscale/tailscale:latest` container in host network mode with subnet routing (192.168.88.0/24) and exit node capability.
|
||||||
|
|
||||||
|
## Commands
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Start the Tailscale container
|
||||||
|
./run.sh # docker-compose up -d
|
||||||
|
|
||||||
|
# Stop the container
|
||||||
|
./stop.sh # docker-compose down
|
||||||
|
|
||||||
|
# Connect to Headscale (advertise subnet routes + exit node)
|
||||||
|
./docker_exec_tailscale_up.sh
|
||||||
|
|
||||||
|
# Check status / get IP
|
||||||
|
./docker_exec_tailscale_status.sh
|
||||||
|
./docker_exec_tailscale_ip.sh
|
||||||
|
|
||||||
|
# Run arbitrary tailscale commands inside the container
|
||||||
|
./tailscale <args> # wrapper for: docker exec -i tailscale tailscale "$@"
|
||||||
|
|
||||||
|
# Reset iptables and configure NAT/forwarding for Tailscale routing (run on host)
|
||||||
|
./iptables_reset_and_configure.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
## Architecture
|
||||||
|
|
||||||
|
- **docker-compose.yml** - Single service (`tailscale`) running `tailscale/tailscale:latest` with `NET_ADMIN`/`SYS_MODULE` caps, host networking, TUN device mount, and persistent state at `/opt/tailscale`.
|
||||||
|
- **`.env`** - Contains `TS_AUTHKEY` for pre-authenticated registration with Headscale.
|
||||||
|
- **iptables_reset_and_configure.sh** - Configures host firewall: allows SSH/HTTP/HTTPS/ICMP, sets up MASQUERADE NAT for Tailscale CGNAT range (100.64.0.0/10) via eth0, and enables forwarding between `tailscale0` and `eth0`.
|
||||||
|
- Watchtower auto-update is enabled via container label.
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
- Documentation (`README`) is in Traditional Chinese.
|
||||||
|
- Hostname convention: `ip-192-168-88-XX` matching the host's LAN IP.
|
||||||
93
OPERATIONS.md
Normal file
93
OPERATIONS.md
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
# Operations Guide
|
||||||
|
|
||||||
|
## 日常操作
|
||||||
|
|
||||||
|
### 啟動服務
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./run.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
啟動 Tailscale Docker 容器(背景執行)。
|
||||||
|
|
||||||
|
### 停止服務
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./stop.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
停止並移除容器。
|
||||||
|
|
||||||
|
### 連線至 Headscale
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./docker_exec_tailscale_up.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
使用預設的 Auth Key 連線至 `https://headscale.lotimmy.com`,並:
|
||||||
|
- 廣播子網路 `192.168.88.0/24`
|
||||||
|
- 啟用出口節點(Exit Node)
|
||||||
|
- 接受其他節點的路由
|
||||||
|
|
||||||
|
### 檢查狀態
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./docker_exec_tailscale_status.sh # 查看連線狀態
|
||||||
|
./docker_exec_tailscale_ip.sh # 查詢 Tailscale IP
|
||||||
|
```
|
||||||
|
|
||||||
|
### 執行任意 Tailscale 指令
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./tailscale status
|
||||||
|
./tailscale ping <peer>
|
||||||
|
./tailscale netcheck
|
||||||
|
```
|
||||||
|
|
||||||
|
`./tailscale` 是 `docker exec -i tailscale tailscale` 的包裝腳本。
|
||||||
|
|
||||||
|
## 防火牆與路由設定
|
||||||
|
|
||||||
|
在主機上執行:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo ./iptables_reset_and_configure.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
此腳本會:
|
||||||
|
1. 清除所有現有 iptables 規則
|
||||||
|
2. 允許 SSH (22)、HTTP (80)、HTTPS (443)、ICMP
|
||||||
|
3. 設定 Tailscale CGNAT 範圍 (100.64.0.0/10) 的 NAT MASQUERADE
|
||||||
|
4. 啟用 `tailscale0` ↔ `eth0` 之間的封包轉送
|
||||||
|
5. 將規則儲存至 `/etc/iptables/rules.v4`
|
||||||
|
|
||||||
|
## 環境變數
|
||||||
|
|
||||||
|
| 變數 | 說明 | 位置 |
|
||||||
|
|------|------|------|
|
||||||
|
| `TS_AUTHKEY` | Headscale 預認證金鑰 | `.env` |
|
||||||
|
|
||||||
|
## 持久化資料
|
||||||
|
|
||||||
|
- Tailscale 狀態檔案:主機的 `/opt/tailscale` 掛載至容器的 `/var/lib/tailscale`
|
||||||
|
- iptables 規則:`/etc/iptables/rules.v4`
|
||||||
|
|
||||||
|
## 故障排除
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 確認容器正在執行
|
||||||
|
docker ps | grep tailscale
|
||||||
|
|
||||||
|
# 查看容器日誌
|
||||||
|
docker logs tailscale
|
||||||
|
|
||||||
|
# 確認 TUN 裝置存在
|
||||||
|
ls -la /dev/net/tun
|
||||||
|
|
||||||
|
# 確認 IP 轉送已啟用
|
||||||
|
cat /proc/sys/net/ipv4/ip_forward
|
||||||
|
|
||||||
|
# 登出並重新連線
|
||||||
|
./tailscale logout
|
||||||
|
./docker_exec_tailscale_up.sh
|
||||||
|
```
|
||||||
44
QUICKSTART.md
Normal file
44
QUICKSTART.md
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
# Quick Start
|
||||||
|
|
||||||
|
## 前置需求
|
||||||
|
|
||||||
|
- Docker 與 Docker Compose
|
||||||
|
- `/dev/net/tun` 裝置(主機需支援 TUN/TAP)
|
||||||
|
- 具備 `NET_ADMIN` 權限的環境
|
||||||
|
|
||||||
|
## 步驟
|
||||||
|
|
||||||
|
### 1. 設定 Auth Key
|
||||||
|
|
||||||
|
在 `.env` 檔案中填入 Headscale 預認證金鑰:
|
||||||
|
|
||||||
|
```
|
||||||
|
TS_AUTHKEY=your-preauth-key-here
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 啟動容器
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./run.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. 連線至 Headscale
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./docker_exec_tailscale_up.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. 設定防火牆(如需子網路由/出口節點)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo ./iptables_reset_and_configure.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. 驗證
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./docker_exec_tailscale_status.sh
|
||||||
|
./docker_exec_tailscale_ip.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
看到 Tailscale IP 和節點列表即代表連線成功。
|
||||||
35
README
Normal file
35
README
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
Tailscale 操作筆記(使用 Headscale)
|
||||||
|
|
||||||
|
登出目前 Tailscale 使用者
|
||||||
|
tailscale logout
|
||||||
|
|
||||||
|
登入 Headscale 自架登入伺服器
|
||||||
|
tailscale up --login-server=https://headscale.lotimmy.com
|
||||||
|
|
||||||
|
使用預先產生的 Auth Key 進行登入
|
||||||
|
tailscale up --login-server=https://headscale.lotimmy.com --authkey <你的-preauth-key>
|
||||||
|
|
||||||
|
範例:使用實際的 Auth Key
|
||||||
|
tailscale up --login-server=https://headscale.lotimmy.com --authkey tskey-xxxxxxx
|
||||||
|
|
||||||
|
正式使用 Auth Key 登入(可取代上方範例)
|
||||||
|
tailscale up --login-server=https://headscale.lotimmy.com --authkey d07067c4bcc950e7f1b02d4b492859b84ca464350d86273e
|
||||||
|
|
||||||
|
登入並接受子網路路由(子網路代理模式)
|
||||||
|
tailscale up --login-server=https://headscale.lotimmy.com --authkey d07067c4bcc950e7f1b02d4b492859b84ca464350d86273e --accept-routes
|
||||||
|
|
||||||
|
完整範例:廣播子網段、設為出口節點、指定主機名稱
|
||||||
|
tailscale up \
|
||||||
|
--accept-routes \
|
||||||
|
--advertise-routes=192.168.88.0/24 \
|
||||||
|
--advertise-exit-node \
|
||||||
|
--login-server=https://headscale.lotimmy.com \
|
||||||
|
--authkey=d07067c4bcc950e7f1b02d4b492859b84ca464350d86273e \
|
||||||
|
--hostname=ip-192-168-88-81
|
||||||
|
|
||||||
|
檢查目前連線狀態
|
||||||
|
tailscale status
|
||||||
|
|
||||||
|
查詢本機 Tailscale IP
|
||||||
|
tailscale ip
|
||||||
|
|
||||||
67
README.md
Normal file
67
README.md
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
# Tailscale Docker 部署(Headscale)
|
||||||
|
|
||||||
|
使用 Docker Compose 部署 Tailscale,連線至自架的 Headscale 控制伺服器。
|
||||||
|
|
||||||
|
## 功能
|
||||||
|
|
||||||
|
- 透過 Docker 容器執行 Tailscale,使用 host 網路模式
|
||||||
|
- 連線至 `https://headscale.lotimmy.com`
|
||||||
|
- 子網路由廣播(192.168.88.0/24)
|
||||||
|
- 出口節點(Exit Node)支援
|
||||||
|
- iptables NAT/轉送自動設定
|
||||||
|
- 透過 Watchtower 自動更新容器映像
|
||||||
|
|
||||||
|
## 檔案結構
|
||||||
|
|
||||||
|
| 檔案 | 說明 |
|
||||||
|
|------|------|
|
||||||
|
| `docker-compose.yml` | Docker 服務定義 |
|
||||||
|
| `.env` | 環境變數(TS_AUTHKEY) |
|
||||||
|
| `run.sh` | 啟動容器 |
|
||||||
|
| `stop.sh` | 停止容器 |
|
||||||
|
| `docker_exec_tailscale_up.sh` | 連線至 Headscale(含路由與出口節點設定) |
|
||||||
|
| `docker_exec_tailscale_status.sh` | 查看連線狀態 |
|
||||||
|
| `docker_exec_tailscale_ip.sh` | 查詢 Tailscale IP |
|
||||||
|
| `tailscale` | Tailscale CLI 包裝腳本 |
|
||||||
|
| `iptables_reset_and_configure.sh` | 防火牆與 NAT 設定 |
|
||||||
|
|
||||||
|
## 快速開始
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. 設定 .env 中的 TS_AUTHKEY
|
||||||
|
# 2. 啟動
|
||||||
|
./run.sh
|
||||||
|
|
||||||
|
# 3. 連線至 Headscale
|
||||||
|
./docker_exec_tailscale_up.sh
|
||||||
|
|
||||||
|
# 4. 設定防火牆(如需路由功能)
|
||||||
|
sudo ./iptables_reset_and_configure.sh
|
||||||
|
|
||||||
|
# 5. 驗證
|
||||||
|
./docker_exec_tailscale_status.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
## 網路架構
|
||||||
|
|
||||||
|
```
|
||||||
|
Tailscale 節點 ──► Headscale (headscale.lotimmy.com)
|
||||||
|
│
|
||||||
|
▼
|
||||||
|
tailscale0 介面 (100.64.0.0/10)
|
||||||
|
│
|
||||||
|
NAT MASQUERADE
|
||||||
|
│
|
||||||
|
▼
|
||||||
|
eth0 ──► LAN (192.168.88.0/24)
|
||||||
|
```
|
||||||
|
|
||||||
|
## 主機名稱慣例
|
||||||
|
|
||||||
|
使用 `ip-192-168-88-XX` 格式,對應主機的區域網路 IP。
|
||||||
|
|
||||||
|
## 相關文件
|
||||||
|
|
||||||
|
- [QUICKSTART.md](QUICKSTART.md) — 快速開始指南
|
||||||
|
- [OPERATIONS.md](OPERATIONS.md) — 維運操作手冊
|
||||||
|
- [SUMMARY.md](SUMMARY.md) — 專案摘要
|
||||||
25
SUMMARY.md
Normal file
25
SUMMARY.md
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
# Summary
|
||||||
|
|
||||||
|
## 專案摘要
|
||||||
|
|
||||||
|
此專案是一個 Docker 化的 Tailscale 部署方案,用於將主機連線至自架的 Headscale 控制伺服器(`https://headscale.lotimmy.com`)。
|
||||||
|
|
||||||
|
## 核心元件
|
||||||
|
|
||||||
|
- **Docker Compose 服務**:以 `tailscale/tailscale:latest` 映像執行,採用 host 網路模式,具備 `NET_ADMIN` 和 `SYS_MODULE` 權限。
|
||||||
|
- **Headscale 整合**:透過預認證金鑰(Pre-auth Key)自動註冊節點。
|
||||||
|
- **子網路由**:廣播 `192.168.88.0/24` 網段,讓遠端 Tailscale 節點可存取區域網路。
|
||||||
|
- **出口節點**:允許其他節點透過此主機路由所有流量。
|
||||||
|
- **iptables 設定**:NAT MASQUERADE 處理 Tailscale CGNAT 流量,並啟用 `tailscale0` ↔ `eth0` 轉送。
|
||||||
|
|
||||||
|
## 技術規格
|
||||||
|
|
||||||
|
| 項目 | 值 |
|
||||||
|
|------|---|
|
||||||
|
| 容器映像 | `tailscale/tailscale:latest` |
|
||||||
|
| 網路模式 | host |
|
||||||
|
| 控制伺服器 | `https://headscale.lotimmy.com` |
|
||||||
|
| 廣播子網 | `192.168.88.0/24` |
|
||||||
|
| Tailscale CGNAT | `100.64.0.0/10` |
|
||||||
|
| 狀態持久化 | `/opt/tailscale` → `/var/lib/tailscale` |
|
||||||
|
| 自動更新 | Watchtower(透過 container label) |
|
||||||
23
docker-compose.yml
Normal file
23
docker-compose.yml
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
services:
|
||||||
|
tailscale:
|
||||||
|
image: tailscale/tailscale:latest
|
||||||
|
container_name: tailscale
|
||||||
|
hostname: virmach-ubuntu
|
||||||
|
restart: unless-stopped
|
||||||
|
cap_add:
|
||||||
|
- NET_ADMIN
|
||||||
|
- SYS_MODULE
|
||||||
|
network_mode: host
|
||||||
|
# privileged: true
|
||||||
|
environment:
|
||||||
|
- TS_AUTHKEY=${TS_AUTHKEY}
|
||||||
|
volumes:
|
||||||
|
- /dev/net/tun:/dev/net/tun
|
||||||
|
- /opt/tailscale:/var/lib/tailscale
|
||||||
|
labels:
|
||||||
|
- "com.centurylinklabs.watchtower.enable=true"
|
||||||
|
# command: >
|
||||||
|
# tailscaled
|
||||||
|
command: >
|
||||||
|
sh -c "env && tailscaled"
|
||||||
|
|
||||||
4
docker_exec_tailscale_ip.sh
Executable file
4
docker_exec_tailscale_ip.sh
Executable file
@@ -0,0 +1,4 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# docker exec -it tailscale tailscale ip
|
||||||
|
tailscale ip
|
||||||
|
|
||||||
2
docker_exec_tailscale_status.sh
Executable file
2
docker_exec_tailscale_status.sh
Executable file
@@ -0,0 +1,2 @@
|
|||||||
|
docker exec -it tailscale tailscale status
|
||||||
|
|
||||||
9
docker_exec_tailscale_up.sh
Executable file
9
docker_exec_tailscale_up.sh
Executable file
@@ -0,0 +1,9 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
tailscale up \
|
||||||
|
--authkey d07067c4bcc950e7f1b02d4b492859b84ca464350d86273e \
|
||||||
|
--advertise-routes=192.168.88.0/24 \
|
||||||
|
--accept-routes \
|
||||||
|
--advertise-exit-node \
|
||||||
|
--login-server=https://headscale.lotimmy.com \
|
||||||
|
--hostname=ip-192-168-88-82
|
||||||
|
|
||||||
44
iptables_reset_and_configure.sh
Executable file
44
iptables_reset_and_configure.sh
Executable file
@@ -0,0 +1,44 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
echo "🧹 清除所有規則並重設策略..."
|
||||||
|
iptables -F
|
||||||
|
iptables -t nat -F
|
||||||
|
iptables -X
|
||||||
|
|
||||||
|
# 設定預設策略
|
||||||
|
# iptables -P INPUT DROP
|
||||||
|
iptables -P INPUT ACCEPT
|
||||||
|
iptables -P FORWARD ACCEPT
|
||||||
|
# iptables -P FORWARD DROP
|
||||||
|
iptables -P OUTPUT ACCEPT
|
||||||
|
|
||||||
|
echo "✅ 設定 INPUT 安全規則..."
|
||||||
|
|
||||||
|
# 允許已建立與相關的連線(像是回應封包)
|
||||||
|
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -m comment --comment "Allow established/related"
|
||||||
|
|
||||||
|
# 允許 loopback
|
||||||
|
iptables -A INPUT -i lo -j ACCEPT -m comment --comment "Allow loopback"
|
||||||
|
|
||||||
|
# 允許 ICMP (ping)
|
||||||
|
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT -m comment --comment "Allow ping"
|
||||||
|
|
||||||
|
# 允許 SSH
|
||||||
|
iptables -A INPUT -p tcp --dport 22 -j ACCEPT -m comment --comment "Allow SSH"
|
||||||
|
|
||||||
|
# 可選:允許 HTTP/HTTPS(如果有 Web 應用)
|
||||||
|
iptables -A INPUT -p tcp --dport 80 -j ACCEPT -m comment --comment "Allow HTTP"
|
||||||
|
iptables -A INPUT -p tcp --dport 443 -j ACCEPT -m comment --comment "Allow HTTPS"
|
||||||
|
|
||||||
|
echo "🔧 設定 Tailscale 出口 NAT(MASQUERADE)"
|
||||||
|
iptables -t nat -A POSTROUTING -s 100.64.0.0/10 -o eth0 -j MASQUERADE -m comment --comment "Tailscale NAT"
|
||||||
|
|
||||||
|
echo "🔧 允許 Tailscale → LAN 轉送"
|
||||||
|
iptables -A FORWARD -i tailscale0 -o eth0 -j ACCEPT -m comment --comment "Tailscale → LAN"
|
||||||
|
iptables -A FORWARD -i eth0 -o tailscale0 -m state --state RELATED,ESTABLISHED -j ACCEPT -m comment --comment "LAN → Tailscale return"
|
||||||
|
|
||||||
|
echo "📦 儲存規則(iptables-persistent)"
|
||||||
|
iptables-save > /etc/iptables/rules.v4
|
||||||
|
|
||||||
|
echo "✅ 防火牆與 NAT 重設完成!"
|
||||||
|
|
||||||
4
stop.sh
Executable file
4
stop.sh
Executable file
@@ -0,0 +1,4 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# docker stop caddy
|
||||||
|
# docker system prune -f
|
||||||
|
docker-compose down
|
||||||
Reference in New Issue
Block a user