愚蠢的地球人

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,将这个 URL 复制粘贴到浏览器打开就会向服务器提交入网申请,服务器会在浏览器上返回一行包含了临时密钥的审批指令,按照提示将这条指令在服务器上执行就可以通过审批:

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

审批通过之后,这台设备就成功加入了这个虚拟局域网,有图形界面的客户端这时就可以看到自己的登录状态以及这个局域网内其他所有设备了。

这种登录方式主要适用于 Linux 这种使用命令行的客户端。对于有操作界面的 Tailscale 客户端就不用输入指令这么麻烦,直接在菜单中直接输入自定义的登录网址之后会自动弹出系统浏览器并打开入网审批的 URL。


对于 Windows、安卓、苹果等有操作界面的客户端,更方便的入网申请方法是先在服务器上创建一个预认证密钥(authkey),然后在客户端上输入服务器的登录网址和这个密钥来加入网络。在服务器上创建预认证密钥的指令如下:

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

这种入网认证方法同样适用于纯命令行的 Linux 客户端:

tailscale up --login-server=https://myhost:8080 --authkey hskey-auth-xxxxxxxx


如果需要通过威联通访问整个家庭局域网,可以在威联通上声明子网路由(--advertise-routes),如果需要将威联通作为出口进行互联网访问,可以声明出口节点(--advertise-exit-node):

/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"

服务器端完成确认之后,其他客户端就能通过威联通访问整个家庭局域网了。其他设备上还可以选择是否通过威联通进行互联网访问。如果想要让家庭局域网中的其他没有安装 Tailscale 的设备也能访问整个虚拟局域网,可以在出口路由器上添加一条静态路由,把 100.100.64.0/24 这个网段路由到威联通的局域网 IP 地址上。


其实以上这些创建用户、审批客户端、创建预登录密钥、审批路由等操作都可以在图形化的管理界面(Web UI)中完成。下一篇文章我会介绍如何部署 Headscale 的 Web UI 管理界面。


发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

相关推荐

最新留言

最近发表

网站分类

Tags列表

友情链接

控制面板

站点统计