愚蠢的地球人

当前位置:   网站首页 >> 计算机

Windows Server服务器上原生部署私有Tailscale服务端

Tailscale 是一款基于 WireGuard 协议的虚拟组网工具,它能将不同网络环境下的设备连接至同一个加密的虚拟局域网,无需公网 IP,也免去了复杂的端口映射和防火墙配置。 

WireGuard 要求连接的其中一端必须有公网 IP 或者在路由器上做端口映射。若两台设备都在严格的 NAT后方,通常无法直接建立连接。由于是点对点的连接,所以它的设置比较复杂,需要在每一台设备上单独手动配置密钥、IP 地址和路由等信息。一旦设备过多,管理会非常繁琐。

Tailscale 由于引入了中心协调服务器,所有设备连接到同一个虚拟网络中,由中心服务器给每个设备分配固定 IP 地址,通过图形化界面进行统一管理,它还能自动识别网络环境并实现 NAT 穿透。如果直连失败,它会通过加密中转服务器(DERP)转发流量,保证连接成功率。 

Tailscale 除了可以使用官方的服务器之外,还允许用户自建私有服务器。Headscale 是一个开源、自托管的 Tailscale 服务器。在 Windows Server 上搭建 Headscale 最便捷且推荐的方法是利用 WSL (Windows Subsystem for Linux) 安装 Linux 版本的 Headscale,或直接使用 Docker 部署,因为 Headscale 原生主要是针对 Linux 环境设计的。但是我的云服务器配置太低,我不想安装 Docker 服务。

打开Headscale 的 Github 主页看了一下,这个项目是用 Go 语言编写的,Go 语言是跨平台的,所以理论上应该可以直接在 Windows 上编译运行。

于是我就安装了 Go 语言的 Windows 版本,下载 Headscale 的源代码,然后输入以下指令来进行编译:

$env:GOOS="windows"
$env:GOARCH="amd64"
$env:GOPROXY = "https://goproxy.cn,direct"
go build -o headscale.exe ./cmd/headscale

编译完成后在当前目录下生成了 headscale.exe 文件,说明编译已经成功了。


接着按照官网的范例创建一个配置文件 config.yaml:

# 基础访问配置
server_url: https://myhost:8080
listen_addr: 0.0.0.0:8080
metrics_listen_addr: 127.0.0.1:9090
grpc_listen_addr: 0.0.0.0:50443
grpc_allow_insecure: false
# 密钥与协议
noise:
  private_key_path: ./data/noise_private.key
# IP 分配
prefixes:
  v4: 100.100.64.0/24
  v6: fd7a:115c:a1e0::/48
  allocation: sequential
# DERP 核心配置
derp:
  server:
    enabled: true # 开启内置 DERP
    region_id: 999
    region_code: "headscale"
    region_name: "Headscale Embedded DERP"
    verify_clients: true
    stun_listen_addr: "0.0.0.0:3478"
    ipv4: 129.28.179.56
    private_key_path: ./data/derp_server_private.key
    automatically_add_embedded_derp_region: true
  # 清空官方 URL,不使用外部路径
  urls: []
  paths: []
  auto_update_enabled: true
  update_frequency: 3h
disable_check_updates: false
# 其他设置
node:
  expiry: 0
  ephemeral:
    inactivity_timeout: 30m
  routes:
    ha:
      probe_interval: 10s
      probe_timeout: 5s
# 数据库配置
database:
  type: sqlite
  sqlite:
    path: ./data/db.sqlite
    write_ahead_log: true
    wal_autocheckpoint: 1000
# 证书配置
tls_cert_path: ./data/fairysoft.net-chain.pem
tls_key_path: ./data/fairysoft.net-key.pem
log:
  # Valid log levels: panic, fatal, error, warn, info, debug, trace
  level: info
  # Output formatting for logs: text or json
  format: text
policy:
  # The mode can be "file" or "database" that defines
  # where the policies are stored and read from.
  mode: file
  # If the mode is set to "file", the path to a HuJSON file containing policies.
  path: ""
# DNS 配置
dns:
  magic_dns: true
  base_domain: home
  override_local_dns: true
  nameservers:
    global:
      - 223.5.5.5
      - 114.114.114.114


测试一下看能不能运行

.\headscale.exe serve


测试通过之后就可以使用 nssm.exe 将 Headscale 注册为服务,这样就不需要每次都手动运行了。

先下载 nssm.exe,然后输入以下指令注册服务:

.\nssm.exe install headscale


在弹出来的界面中做以下设置:

Path: C:\headscale\headscale.exe
Startup directory: C:\headscale
Arguments: serve -c C:\headscale\config\config.yam

设置好之后点击安装,安装完成后就可以在服务管理器里面看到 headscale 服务了,右键点击启动即可。

到现在为止,Headscale 服务器的编译安装工作就全部完成了。


然后我们进行配置,首先,添加一个用户:

.\headscale.exe users create Admin


接下来在客户端上登录,按照官网的说明,输入以下指令发送登录认证申请,我第一个测试的设备是威联通:

/share/CACHEDEV1_DATA/.qpkg/Tailscale/tailscale up --login-server https://myhost:8080 --reset --force-reauth


然后会返回一个 URL,复制粘贴到浏览器打开,浏览器上会得到一行包含了临时登录密钥的指令,按照提示在服务器上运行这个指令审批登录申请:

.\headscale.exe auth register --auth-id hskey-authreq-xxxxxx --user Admin


这种登录方式适用于 Linux 这种使用命令行的客户端

对于有操作界面的 Tailscale 客户端,比如说安卓或者IOS设备,在菜单中直接输入自定义的登录网址之后会自动弹出系统浏览器显示临时登录申请密钥


成功之后就可以在其他已登录的客户端上看到这个新增的节点了。


对于 Windows、安卓、苹果等有操作界面的客户端,更方便的登录方法是先在服务端创建一个预认证密钥,然后在客户端上输入服务器的登录网址和这个密钥来登录

创建预认证密钥的指令如下:

.\headscale.exe auth create-api-key --user Admin


在威联通上声明路由:

/share/CACHEDEV1_DATA/.qpkg/Tailscale/tailscale up \
  --login-server https://myhost:8080 \
  --advertise-routes=192.168.1.0/24 \
  --advertise-exit-node \
  --reset


在 Headscale 服务端审批

出于安全考虑,服务端默认不信任客户端声明的路由,需要手动开启。

#查看威联通节点的 ID
.\headscale.exe nodes list
#查看节点 2 的所有路由请求
.\headscale.exe nodes list-routes -i 2
#同意审批
.\headscale.exe nodes approve-routes -i 2 -r "192.168.1.0/24,0.0.0.0/0,::/0"


下一篇文章我会介绍如何部署 Headscale 的 Web UI 管理界面。



发表我的评论

Hi,您需要填写昵称和邮箱!

  • 必填项