自建 headscale

751 字
4 分钟
自建 headscale

headscale 安装配置#

默认 headscale 的 ip 段配置为 100.64.0.0/10, 这个会和阿里云的ECS的默认 dns 冲突,改为 10.99.100.0/24 段

---
server_url: https://${服务器地址}
listen_addr: 0.0.0.0:8080
prefixes:
v4: 10.99.100.0/24
dns:
magic_dns: false # 关闭dns
unix_socket: /var/run/headscale/headscale.sock
unix_socket_permission: "0770"

headscale 中用户可以理解为租户,不同的租户网络隔离

常用命令#

Terminal window
# 创建 api key,用于 rest 调用
headscale api create
# 查询 api key
headscale api ls
# 创建用户
headscale user create sephy
# 查询用户
headscale user ls
# 显示节点列表
headscale nodes ls
# 创建 preauthkey 设备加入
headscale authkey create --user 1 # 1 为用户
# 查看 preauthkey
headscale authkey ls --user 1
# 删除节点
headscale nodes delete -i <id>

也可以通过 headscale-ui 设置 preauth#

image 6
image 6

阿里云 tailscale 设置#

阿里云 ECS 默认使用 100.100.2.136/100.100.2.138 作为内部 DNS 解析,会与 tailscale 默认的 iptables 规则冲突

添加 iptables 规则

Terminal window
sudo iptables -I INPUT 1 -s 100.100.2.0/24 -j ACCEPT
# 伪装
sudo iptables -t nat -A POSTROUTING -s 10.250.0.0/24 -d 172.28.0.0/16 -j MASQUERADE

开启 ipv4 转发

Terminal window
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.d/sysctl.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.d/sysctl.conf
sudo sysctl -p /etc/sysctl.d/sysctl.conf
# or
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.d/99-sysctl.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.d/99-sysctl.conf
sudo sysctl -p /etc/sysctl.d/99-sysctl.conf

开放 41641 udp 端口

image 7
image 7

安装 tailscale

Terminal window
sudo apt install tailscale -y

登录到headscale

Terminal window
# --login-server 指定自托管的 Headscale 控制服务器地址
# --accept-routes=true 启用路由接受功能,允许接收其他节点宣告的路由
# --accept-dns=false 禁用 Tailscale 的 DNS 功能,保留本地 DNS 设置
# --advertise-routes 向网络宣告本地子网路由,使其他节点可访问该子网
# --hostname 设置节点在 Tailscale 网络中的显示名称
# --auth-key 使用预认证密钥进行无交互式登录
# --reset 重置现有配置并重新初始化
# --snat-subnet-routes=false
tailscale up --login-server ${服务器地址} \
--accept-routes=true \
--accept-dns=false \
--advertise-routes=172.28.0.0/16 \
--snat-subnet-routes=false
--hostname=aliyun-ecs-1 \
--auth-key=${密钥} \
--reset

—snat-subnet-routes=false 视情况加, 阿里云 RDS 如果只允许内网访问,需要 —snat-subnet-routes=true

macos tailscale 设置#

启用命令行

image 8
image 8

image 9
image 9

通过事先创建好的 preauthkey 加入到网络

Terminal window
tailscale login --login-server https://${服务器地址} --auth-key ${密钥}

添加成功后客户显示

image 10
image 10

iStoreOS tailscale 设置#

官方 iStore 商店中安装的版本太老,需要 在官方地址 下载对应版本, 手动更新替换 /usr/sbin/tailscale /usr/sbin/tailscaled

Terminal window
cp tailscale /usr/sbin/
cp tailscaled /usr/sbin/

ssh 登录后通过以下命令进行登录

Terminal window
# --login-server 指定自托管的 Headscale 控制服务器地址
# --accept-routes=true 启用路由接受功能,允许接收其他节点宣告的路由
# --accept-dns=false 禁用 Tailscale 的 DNS 功能,保留本地 DNS 设置
# --advertise-routes 向网络宣告本地子网路由,使其他节点可访问该子网
# --hostname 设置节点在 Tailscale 网络中的显示名称
# --auth-key 使用预认证密钥进行无交互式登录 通过 docker compose -f docker-compose/docker-compose.vps.yml exec headscale headscale authkey create -u 1 生成
# --reset 重置现有配置并重新初始化
# --snat-subnet-routes=false
tailscale up --login-server 'https://{服务器}' \
--accept-routes=true \
--accept-dns=false \
--advertise-routes=192.168.50.0/24 \
--snat-subnet-routes=false \
--hostname=iStoreOS \
--authkey={密钥} \
--reset

📎 参考文章#

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

自建 headscale
https://blog.sephy.top/posts/自建-headscale/
作者
虾米
发布于
2025-08-17
许可协议
CC BY-NC-SA 4.0
随机文章随机推荐
Profile Image of the Author
虾米
coder
分类
标签
站点统计
文章
61
分类
4
标签
52
总字数
64,663
运行时长
0
最后活动
0 天前
站点信息
构建平台
GitHub Actions
博客版本
Firefly v6.13.9
文章许可
CC BY-NC-SA 4.0