Tailscale + Headscale 部署VPN实现异地组网 (WireGuard)

53次阅读
没有评论

共计14023个字符,预计需要花费36分钟才能阅读完成。

Tailscale 介绍

简介

Tailscale 是一个基于 WireGuard 构建的现代化虚拟局域网(VPN)工具。它能在任何网络环境下,将你分布在全球各地的设备(服务器、电脑、手机等)加密连接起来,让它们像插在同一个交换机上一样直接通信。

其实和 WireGuard 的功能基本一致。

相比于 WireGuard 的优势

那问题来了,为什么不直接使用 WireGuard 呢?

WireGuard 只支持 UDP 协议传输,而在某些诸如学习、企业的公共场合,是禁止 UDP 包传输的,因此无法使用。而 Tailscale 不一样,它在允许 UDP 协议的环境下直接使用 WireGuard 协议进行点对点传输,而在禁止 UDP 协议的环境下可以采用通过加密的 DERP 中继服务器来使用 TCP 协议进行传输,从而能在任何环境下使用。

如果你使用的所有场景都是支持 UDP 包的,那么你没有必要使用 Tailscale!而是直接使用 WireGuard 更方便,关于 WireGuard 的部署教程,可以看我 以前的文章

原理

你肯定好奇,为什么以 WireGuard 为底层的 Tailscale,却可以在完全屏蔽 UDP 包的网络中实现虚拟局域网。

我们先从 Tailscale 的架构来看。Tailscale 可以分为以下两层:

  • 控制层面:用于控制用户的行为、连接和 IP 地址的分配等等,等下提到的 Headscale 也是在这个层面的。

  • 数据层面:只关注数据的传输,由 DREP (Designated Encrypted Relay for Packets) 服务器提供。DREP 服务器不仅可以协商两个客户端之间以 UDP 协议来连接,还能在 UDP 协议被禁用时,提供加密的 TCP 连接充当中继服务器。

这里我提供一个两个客户端连接到同一个服务器的示例,帮助大家理解。

  1. 设备 A 开始尝试与设备 B 连接。
  2. 设备 A 连接到设备 B 正在使用的 DERP 服务器。
  3. 设备 A 通过 DERP 服务器向设备 B 发送连接请求。
  4. 设备通过连接的 DERP 服务器交换直接连接信息。
    i. 设备 A 发送连接请求。
    ii. 设备 B 回复其连接信息。
  5. 两台设备都执行 NAT 遍历。他们尝试各种 NAT 穿越策略,建立彼此之间的直接 UDP 隧道。
    i. 如果 NAT 穿越成功,设备 A 和设备 B 会建立点对点连接。他们不需要通过第三个设备(如 DERP 服务器或对等中继服务器)中继数据包。
    ii. 如果设备无法建立直接连接,它们会尝试通过 Tailscale 的对等中继服务器连接。要实现这一点,网络中必须至少有一个对等中继设备,设备 A 和设备 B 都能访问。
    iii. 如果没有可用的对等中继,设备会通过 DERP 服务器保持连接,在它们之间中继数据包。
  6. 会定期重新检查是否能建立直接连接或对等中继连接。

到这里,相信你对 Tailscale 已经有了大致了解。

Headscale 介绍

简介

Headscale 是 Tailscale 协调服务器的开源替代品,让你可以在自己控制的服务器上,完整实现 Tailscale 的组网能力,而无需依赖官方服务。

为什么需要 Headscale,而不是 Tailscale?

Tailscale 是一款商业产品,使用这个平台需要注册、登录等等麻烦的操作,还可能会泄露隐私信息。而且,免费版也有一些限制,比如无法自定义网段等等。

这时候,就该 Headscale 登场了。Headscale 是 Tailscale 控制平面的开源替代品。它让你可以完全在自己控制的服务器上,搭建 Tailscale 网络所需的控制平台,从而不依赖任何官方服务。

其实还是可能会用到一些官方服务的,虽然我们控制层面已经完全替代,但是还有数据层面呀。数据层面是可以用到官方的 DERP 服务器的!

部署教程

说了这么多,得开始部署了!先从 Headscale 这个控制层面的东西开始。

部署 Headscale (服务端)

官方的教程 在这里,基本上也说的七七八八了,但我这里还是翻译了一下。

对于不同的 Linux 服务器,有不同的部署方式。

Debian、Ubuntu 或类似系统的安装

这类系统是最简单的,我们从 Headscale 的 GitHub 仓库 下载最新的安装包,然后安装 deb 包即可。

Tailscale + Headscale 部署 VPN 实现异地组网 (WireGuard)

输入以下命令进行安装:

sudo apt install ./headscale.deb

安装好后配置文件在 /etc/headscale/config.yaml,可以用 vim 编辑器编辑。接着输入:

sudo systemctl enable --now headscale

来设置开机自动启动并启动程序。

RHEL、CentOS 或类似系统的安装

这里提供了一个第三方仓库,详细的教程可以看 这里

我们输入以下命令,将这个仓库添加进软件管理器:

dnf copr enable jonathanspw/headscale

然后直接通过以下命令安装:

yum install headscale

就可以了,很简单。安装好后配置文件也在 /etc/headscale/config.yaml,可以用 vim 编辑器编辑。最后接着输入:

sudo systemctl enable --now headscale

来启动程序。

Linux 系统的通用安装步骤

所有的 Linux 系统都可以采用二进制文件的方式来安装,但是比较麻烦。

我们从 Headscale 的 GitHub 仓库 上下载最新的二进制文件,如下图所示。

Tailscale + Headscale 部署 VPN 实现异地组网 (WireGuard)

将这个文件复制到 /usr/bin/headscale

mv ./path/to/headscale /usr/bin/headscale

接着添加可执行权限:

sudo chmod +x /usr/bin/headscale

接着添加一个专门执行 headscale 的用户:

sudo useradd \
 --create-home \
 --home-dir /var/lib/headscale/ \
 --system \
 --user-group \
 --shell /usr/sbin/nologin \
 headscale

接着,从这里 下载示例配置文件,放到 /etc/headscale/config.yaml 中。当然也可以自己从 GitHub 上下载最新的示例文件。运行命令:

sudo mkdir -p /etc/headscale
mv ./config-example.yaml /etc/headscale/config.yaml

接着可以编辑配置文件 /etc/headscale/config.yaml

最后,从这里 下载服务配置文件,放到 /etc/systemd/system/headscale.service,即:

mv ./headscale.service /etc/systemd/system/headscale.service

接着,直接设置开机启动,并立即启动服务:

systemctl daemon-reload
systemctl enable --now headscale

这样我们就安装好啦!

配置 Headscale

配置文件一般在 /etc/headscale/config.yaml,以下是中文翻译后的配置文件:

# headscale 将按以下顺序查找名为 `config.yaml`(或 `config.json`)的配置文件:#
# - `/etc/headscale`
# - `~/.headscale`
# - 当前工作目录

# 客户端将连接的 URL。# 通常这会是一个域名,例如:#
# https://myheadscale.example.com:443
#
server_url: http://127.0.0.1:8080

# 服务器监听 / 绑定的地址
#
# 生产环境建议:# listen_addr: 0.0.0.0:8080
listen_addr: 127.0.0.1:8080

# /metrics 和 /debug 的监听地址,你可能希望
# 将此端点保留在内部网络中,不对外暴露。# 使用空值可以禁用指标监听器。metrics_listen_addr: 127.0.0.1:9090

# gRPC 的监听地址。# gRPC 用于通过 CLI 远程控制 headscale 服务器。# 注意:远程访问_仅_在你拥有有效证书时才有效。#
# 生产环境建议:# grpc_listen_addr: 0.0.0.0:50443
grpc_listen_addr: 127.0.0.1:50443

# 允许 gRPC 管理接口以不安全模式运行。# 不推荐这样做,因为流量将不会被加密。# 仅在你知道自己做什么的情况下启用。grpc_allow_insecure: false

# Noise 部分包含 TS2021 Noise 协议的特定配置
noise:
  # Noise 私钥用于在使用新的基于 Noise 的协议时,# 加密 headscale 与 Tailscale 客户端之间的通信。# 如果缺少密钥,系统会自动生成。private_key_path: /var/lib/headscale/noise_private.key

# 用于分配 Tailscale 地址的 IP 前缀列表。# 每个前缀由一个 IPv4 或 IPv6 地址以及用斜杠分隔的
# 前缀长度组成。它必须位于 Tailscale 客户端支持的 IP 范围内,# 即 100.64.0.0/10 和 fd7a:115c:a1e0::/48 的子网。# 参见下方:# IPv6: https://github.com/tailscale/tailscale/blob/22ebb25e833264f58d7c3f534a8b166894a89536/net/tsaddr/tsaddr.go#LL81C52-L81C71
# IPv4: https://github.com/tailscale/tailscale/blob/22ebb25e833264f58d7c3f534a8b166894a89536/net/tsaddr/tsaddr.go#L33
# 不支持任何其他范围,否则会导致意外问题。prefixes:
  v4: 100.64.0.0/10
  v6: fd7a:115c:a1e0::/48

  # 用于为节点分配 IP 的策略,可用选项:# - sequential(顺序,默认):从上一个给出的 IP 之后分配下一个空闲 IP。#   采用尽力而为的方式,Headscale 可能会在 IP 段中留下空洞或填补现有的空洞。# - random(随机):从伪随机 IP 生成器(crypto/rand)中分配下一个空闲 IP。allocation: sequential

# DERP 是 Tailscale 在无法建立直接连接时使用的中继系统。# https://tailscale.com/blog/how-tailscale-works/#encrypted-tcp-relays-derp
#
# headscale 需要一个可以向客户端呈现的 DERP 服务器列表。derp:
  server:
    # 如果启用,将运行嵌入式 DERP 服务器并将其合并到其余的 DERP 配置中。# 上面定义的 Headscale server_url 必须使用 https,DERP 需要 TLS 已配置就绪。enabled: false

    # 用于嵌入式 DERP 服务器的区域 ID。# 如果该区域 ID 与来自常规 DERP 配置的其他区域 ID 冲突,本地 DERP 将优先。region_id: 999

    # 区域代码和名称会显示在 Tailscale 界面中,用于标识一个 DERP 区域。region_code: "headscale"
    region_name: "Headscale Embedded DERP"

    # 仅允许与此服务器关联的客户端访问
    verify_clients: true

    # 在配置的地址上通过 UDP 监听 STUN 连接,以协助 NAT 穿透。# 当启用嵌入式 DERP 服务器时,必须定义 stun_listen_addr。#
    # 有关其工作方式的更多详细信息,请参阅这篇出色文章:https://tailscale.com/blog/how-tailscale-works/
    stun_listen_addr: "0.0.0.0:3478"

    # 私钥用于加密 headscale DERP 与 Tailscale 客户端之间的通信。# 如果缺少密钥,系统会自动生成。private_key_path: /var/lib/headscale/derp_server_private.key

    # 此标志可用于让嵌入式 DERP 服务器的 DERP 映射条目不被自动写入,# 它允许你使用本地文件通过 DERP.paths 参数创建自己的 DERP 映射条目。# 如果你启用 DERP 服务器并将此项设置为 false,则必须通过 DERP.paths 将该 DERP 服务器添加到 DERP 映射中。automatically_add_embedded_derp_region: true

    # 为了获得更好的连接稳定性(尤其是在使用出口节点且 DNS 不工作时),# 可以选择将公网 IPv4 和 IPv6 地址添加到 Derp-Map 中:ipv4: 198.51.100.1
    ipv6: 2001:db8::1

  # 外部可用的 DERP 映射列表,以 JSON 编码
  urls:
    - https://controlplane.tailscale.com/derpmap/default

  # 本地可用的 DERP 映射文件,以 YAML 编码
  #
  # 此选项主要对托管自有 DERP 服务器的人有用:# https://tailscale.com/kb/1118/custom-derp-servers/
  #
  # paths:
  #   - /etc/headscale/derp-example.yaml
  paths: []

  # 如果启用,将设置一个工作线程定期刷新给定的来源并更新 derpmap。auto_update_enabled: true

  # 我们应该多久检查一次 DERP 更新?update_frequency: 3h

# 禁用在启动时自动检查 headscale 更新
disable_check_updates: false

# 一个处于非活跃状态的临时节点在被删除前的存活时间
ephemeral_node_inactivity_timeout: 30m

database:
  # 数据库类型。可用选项:sqlite, postgres
  # 请注意,强烈不建议使用 Postgres,因为它仅因遗留原因而受支持。# 所有新的开发、测试和优化都围绕 SQLite 进行。type: sqlite

  # 启用调试模式。此设置需要将 log.level 设置为 "debug" 或 "trace"。debug: false

  # GORM 配置设置。gorm:
    # 启用预编译语句。prepare_stmt: true

    # 启用参数化查询。parameterized_queries: true

    # 跳过记录 "record not found" 错误的日志。skip_err_record_not_found: true

    # 慢查询阈值(毫秒)。slow_threshold: 1000

  # SQLite 配置
  sqlite:
    path: /var/lib/headscale/db.sqlite

    # 为 SQLite 启用 WAL 模式。建议在生产环境中使用。# https://www.sqlite.org/wal.html
    write_ahead_log: true

    # WAL 文件帧的最大数量,达到后 WAL 文件将自动执行检查点。# https://www.sqlite.org/c3ref/wal_autocheckpoint.html
    # 设置为 0 可禁用自动检查点。wal_autocheckpoint: 1000

  # # Postgres 配置
  # 请注意,强烈不建议使用 Postgres,因为它仅因遗留原因而受支持。# 更多信息请见 database.type。# postgres:
  #   # 如果使用 Unix 套接字连接 Postgres,请在 'host' 字段中设置套接字路径,并将 'port' 留空。#   host: localhost
  #   port: 5432
  #   name: headscale
  #   user: foo
  #   pass: bar
  #   max_open_conns: 10
  #   max_idle_conns: 10
  #   conn_max_idle_time_secs: 3600
  #
  #   # 如果需要 'require(true)' 和 'disabled(false)' 以外的 'sslmode',请在 'ssl' 字段中设置你所需的 'sslmode'。#   # 参考 https://www.postgresql.org/docs/current/libpq-ssl.html 表 34.1。#   ssl: false

### TLS 配置
#
## Let's Encrypt / ACME
#
# headscale 支持通过 Let's Encrypt 自动为域名申请和设置 TLS。#
# ACME 目录 URL
acme_url: https://acme-v02.api.letsencrypt.org/directory

# 向 ACME 提供商注册的电子邮件地址
acme_email: ""

# 要为其申请 TLS 证书的域名:tls_letsencrypt_hostname: ""

# 存储 Let's Encrypt 所需的证书和元数据的路径
# 生产环境建议:tls_letsencrypt_cache_dir: /var/lib/headscale/cache

# 要使用的 ACME 验证类型,当前支持的类型:# HTTP-01 或 TLS-ALPN-01
# 更多信息参见:docs/ref/tls.md
tls_letsencrypt_challenge_type: HTTP-01
# 当选择 HTTP-01 验证时,Let's Encrypt 必须建立一个验证端点,它将监听在:# :http = 端口 80
tls_letsencrypt_listen: ":http"

## 使用已准备好的证书:tls_cert_path: ""
tls_key_path: ""

log:
  # 有效的日志级别:panic、fatal、error、warn、info、debug、trace
  level: info

  # 日志的输出格式:text 或 json
  format: text

## 策略
# headscale 支持 Tailscale 的 ACL 策略。# 请参阅他们的知识库以更好理解相关概念:https://tailscale.com/kb/1018/acls/
policy:
  # 模式可以是 "file" 或 "database",用于定义 ACL 策略的存储和读取位置。mode: file
  # 如果模式设置为 "file",则为包含 ACL 策略的 HuJSON 文件路径。path: ""

## DNS
#
# headscale 支持 Tailscale 的 DNS 配置和 MagicDNS。# 请参阅他们的知识库以更好理解相关概念:#
# - https://tailscale.com/kb/1054/dns/
# - https://tailscale.com/kb/1081/magicdns/
# - https://tailscale.com/blog/2021-09-private-dns-with-magicdns/
#
# 请注意,要使 DNS 配置生效,客户端必须启用 `--accept-dns=true` 选项。# 这是 Tailscale 客户端的默认设置。此选项在 Tailscale 客户端中默认启用。#
# 设置 _任何_ 配置并在客户端上使用 `--accept-dns=true` 将与客户端的 DNS 管理器集成,# 或覆盖 /etc/resolv.conf。# https://tailscale.com/kb/1235/resolv-conf
#
# 如果你希望阻止 Headscale 管理 DNS 配置,# 应将 `dns` 下的所有字段设置为空值。dns:
  # 是否使用 [MagicDNS](https://tailscale.com/kb/1081/magicdns/)。magic_dns: true

  # 定义用于生成 MagicDNS 主机名的基域名。# 此域名_必须_与 server_url 域名不同。# `base_domain` 必须是一个完全限定域名(FQDN),末尾不带点。# 主机的 FQDN 将是 `hostname.base_domain`(例如,_myhost.example.com_)。base_domain: example.com

  # 是否使用节点的本地 DNS 设置,或者覆盖本地 DNS 设置(默认)并强制使用 Headscale 的 DNS 配置。override_local_dns: true

  # 要暴露给客户端的 DNS 服务器列表。nameservers:
    global:
      - 1.1.1.1
      - 1.0.0.1
      - 2606:4700:4700::1111
      - 2606:4700:4700::1001

      # NextDNS(参见 https://tailscale.com/kb/1218/nextdns/)。# "abc123" 是示例 NextDNS ID,请替换为你自己的。# - https://dns.nextdns.io/abc123

    # 拆分 DNS(参见 https://tailscale.com/kb/1054/dns/),# 一个域名到其应使用的 DNS 服务器的映射。split: {}
      # foo.bar.com:
      #   - 1.1.1.1
      # darp.headscale.net:
      #   - 1.1.1.1
      #   - 8.8.8.8

  # 设置自定义 DNS 搜索域。启用 MagicDNS 后,# 你的 tailnet base_domain 始终是第一个搜索域。search_domains: []

  # 额外的 DNS 记录
  # 目前仅支持 A 和 AAAA 记录(在 tailscale 侧)# 参见:docs/ref/dns.md
  extra_records: []
  #   - name: "grafana.myvpn.example.com"
  #     type: "A"
  #     value: "100.64.0.3"
  #
  #   # 你也可以将其放在一行
  #   - {name: "prometheus.myvpn.example.com", type: "A", value: "100.64.0.3"}
  #
  # 或者,额外的 DNS 记录可以从一个 JSON 文件加载。# Headscale 会在每次文件变更时处理该文件。# extra_records_path: /var/lib/headscale/extra-records.json

# 用于 CLI 无需认证即可连接的 Unix 套接字
# 注意:对于生产环境,你通常希望将其设置为类似:unix_socket: /var/run/headscale/headscale.sock
unix_socket_permission: "0770"

# OpenID Connect
# oidc:
#   # 在身份提供者可用且健康之前阻止启动。#   only_start_if_oidc_is_available: true
#
#   # 来自身份提供者的 OpenID Connect 颁发者 URL
#   issuer: "https://your-oidc.issuer.com/path"
#
#   # 来自身份提供者的客户端 ID
#   client_id: "your-oidc-client-id"
#
#   # 来自身份提供者生成的客户端密钥
#   # 注意:client_secret 和 client_secret_path 是互斥的。#   client_secret: "your-oidc-client-secret"
#   # 或者,设置 `client_secret_path` 以从文件读取密钥。#   # 它会解析环境变量,从而可以方便地集成 systemd 的 `LoadCredential`:#   client_secret_path: "${CREDENTIALS_DIRECTORY}/oidc_client_secret"
#
#   # 一个节点通过 OpenID 认证后到过期并需要重新认证的时间。#   # 将值设为 "0" 表示永不过期。#   expiry: 180d
#
#   # 使用从用户登录时 OpenID 收到的令牌中的过期时间。#   # 这通常会导致需要频繁重新认证,除非你知道自己在做什么,否则应仅启用此项。#   # 注意:启用该项将使 `oidc.expiry` 被忽略。#   use_expiry_from_token: false
#
#   # 要使用的 OIDC 作用域,默认为 "openid"、"profile" 和 "email"。#   # 可以按需配置自定义作用域,但请始终包含必需的 "openid" 作用域。#   scope: ["openid", "profile", "email"]
#
#   # 默认情况下,只有已验证的电子邮件地址才会同步到用户配置文件。#   # 如果身份提供者不发送 "email_verified: true" 声明或不需要电子邮件验证,#   # 可以允许未经验证的电子邮件。#   email_verified_required: true
#
#   # 提供自定义的键 / 值对,这些键值对会被发送到身份提供者的授权端点。#   extra_params:
#     domain_hint: example.com
#
#   # 仅接受电子邮件域名属于 allowed_domains 列表的用户。#   allowed_domains:
#     - example.com
#
#   # 仅接受电子邮件地址属于 allowed_users 列表的用户。#   allowed_users:
#     - alice@example.com
#
#   # 仅接受属于 allowed_groups 列表中至少一个组成员的用户。#   allowed_groups:
#     - /headscale
#
#   # 可选:PKCE(授权代码交换证明密钥)配置
#   # PKCE 通过防止授权代码拦截攻击,为 OAuth 2.0 授权码流程增加了一层额外的安全性。#   # 参见 https://datatracker.ietf.org/doc/html/rfc7636
#   pkce:
#     # 启用或禁用 PKCE 支持(默认:false)#     enabled: false
#
#     # 要使用的 PKCE 方法:#     # - plain:使用明文代码验证器
#     # - S256:使用 SHA256 哈希代码验证器(默认,推荐)#     method: S256

# Logtail 配置
# Logtail 是 Tailscale 的日志记录和审计基础设施,它允许控制面板指示 Tailscale 节点将其活动记录到远程服务器。# 要在客户端禁用日志记录,请参考:# https://tailscale.com/kb/1011/log-mesh-traffic#opting-out-of-client-logging
logtail:
  # 为此 Headscale 实例的 Tailscale 节点启用 Logtail。# 由于 Headscale 目前不支持覆盖日志服务器,因此默认禁用。# 启用此项将使你的客户端将日志发送到 Tailscale Inc.。enabled: false

# 启用此选项后,设备会优先使用随机端口进行 WireGuard 流量,而不是默认的静态端口 41641。# 此选项旨在为一些有问题的防火墙设备提供解决方法。更多信息见 https://tailscale.com/kb/1181/firewalls/。randomize_client_port: false

# Taildrop 配置
# Taildrop 是 Tailscale 的文件共享功能,允许节点之间相互发送文件。# https://tailscale.com/kb/1106/taildrop/
taildrop:
  # 为所有节点启用或禁用 Taildrop。# 启用后,节点可以向同一用户拥有的其他节点发送文件。# Tailscale 客户端不允许标记设备和跨用户传输。enabled: true

# 高级性能调优参数。# 默认值经过精心选择,通常很少需要调整。# 仅在您已识别出特定的性能问题时才修改这些参数。#
# tuning:
#   # NodeStore 写入批处理配置。#   # NodeStore 会在重建对等关系(计算开销较高)之前对写入操作进行批处理。#   # 批处理可减少重建频率。#   #
#   # node_store_batch_size: 100
#   # node_store_batch_timeout: 500ms

看到这么长的配置头都晕了,这里提几点比较常见的修改。

  1. listen_addr

这个是控制平台的监听地址,一般设置为:

listen_addr: 0.0.0.0:8080

其中 0.0.0.0 代表允许所有地址访问,8080 代表访问的端口。这时候外网只要访问 http:// 你的外网 IP:8080 就能进去控制平台了。

  1. server_url

这一项主要配置控制平台的访问地址,可以配合 listen_addr 使用,一般设置为 HTTPS 协议的域名。比如说:

server_url: https://www.example.net

这里建议用 Nginx 反向代理刚才的 listen_addr 地址,并且安装 SSL 证书,这样反代出去的就是 HTTPS 协议的网站了。

  1. derp

这一项下包含了 DERP 服务器配置的所有参数。如下所示:

# DERP 是 Tailscale 在无法建立直接连接时使用的中继系统。# https://tailscale.com/blog/how-tailscale-works/#encrypted-tcp-relays-derp
#
# headscale 需要一个可以向客户端呈现的 DERP 服务器列表。derp:
  server:
    # 如果启用,将运行嵌入式 DERP 服务器并将其合并到其余的 DERP 配置中。# 上面定义的 Headscale server_url 必须使用 https,DERP 需要 TLS 已配置就绪。enabled: false

    # 用于嵌入式 DERP 服务器的区域 ID。# 如果该区域 ID 与来自常规 DERP 配置的其他区域 ID 冲突,本地 DERP 将优先。region_id: 999

    # 区域代码和名称会显示在 Tailscale 界面中,用于标识一个 DERP 区域。region_code: "headscale"
    region_name: "Headscale Embedded DERP"

    # 仅允许与此服务器关联的客户端访问
    verify_clients: true

    # 在配置的地址上通过 UDP 监听 STUN 连接,以协助 NAT 穿透。# 当启用嵌入式 DERP 服务器时,必须定义 stun_listen_addr。#
    # 有关其工作方式的更多详细信息,请参阅这篇出色文章:https://tailscale.com/blog/how-tailscale-works/
    stun_listen_addr: "0.0.0.0:3478"

    # 私钥用于加密 headscale DERP 与 Tailscale 客户端之间的通信。# 如果缺少密钥,系统会自动生成。private_key_path: /var/lib/headscale/derp_server_private.key

    # 此标志可用于让嵌入式 DERP 服务器的 DERP 映射条目不被自动写入,# 它允许你使用本地文件通过 DERP.paths 参数创建自己的 DERP 映射条目。# 如果你启用 DERP 服务器并将此项设置为 false,则必须通过 DERP.paths 将该 DERP 服务器添加到 DERP 映射中。automatically_add_embedded_derp_region: true

    # 为了获得更好的连接稳定性(尤其是在使用出口节点且 DNS 不工作时),# 可以选择将公网 IPv4 和 IPv6 地址添加到 Derp-Map 中:ipv4: 198.51.100.1
    ipv6: 2001:db8::1

  # 外部可用的 DERP 映射列表,以 JSON 编码
  urls:
    - https://controlplane.tailscale.com/derpmap/default

  # 本地可用的 DERP 映射文件,以 YAML 编码
  #
  # 此选项主要对托管自有 DERP 服务器的人有用:# https://tailscale.com/kb/1118/custom-derp-servers/
  #
  # paths:
  #   - /etc/headscale/derp-example.yaml
  paths: []

  # 如果启用,将设置一个工作线程定期刷新给定的来源并更新 derpmap。auto_update_enabled: true

  # 我们应该多久检查一次 DERP 更新?update_frequency: 3h

如果想自建 DERP 服务器,则将 enable 设置为 true。接着,还需要修改 server 下的 ipv4ipv6 为自己服务器的地址。

  1. randomize_client_port

客户端采用随机端口,一般设置为 true 防止被过滤。

配置好后使用 systemctl restart headscale.service,重启一遍 Headscale 就能正常使用了。

部署界面 (可选)

Headscale 默认不带界面,纯命令行操作,但这样会很麻烦。于是,我找到了一个为 Headscale 设计的用于界面,即 Headscale Admin,在这里打开

直接用 Docker 安装即可:

docker run -p 8000:80 goodieshq/headscale-admin:latest

然后访问 http://xxx:8000 就能打开了。

接着,通过以下命令获取密钥:

headscale api create

再粘贴到网页里即可。

部署 Tailscale (客户端)

客户端可以 从这里下载 ,下载对应平台的即可。使用教程 可以看这里,当然下面我也会介绍,

Windows 客户端安装

直接下载 exe 文件,打开安装即可。

然后用以下命令来登录:

tailscale login --login-server <YOUR_HEADSCALE_URL>

Tailscale + Headscale 部署 VPN 实现异地组网 (WireGuard)

接着我们根据提示,点进这个网址进行认证。

Tailscale + Headscale 部署 VPN 实现异地组网 (WireGuard)

复制以下内容到服务端,输入即可。这个命令的意思是,为 USERNAME 这个用户创建一个结点。注意,用户名 USERNAME 要替换成你的用户。

如果还不知道什么是用户,不要着急,在服务端输入以下命令:

headscale users create default

就可以创建一个名叫 default 的用户,然后替换掉刚才的 USERNAME 即可。

Linux 客户端安装

直接输入以下命令:

curl -fsSL https://tailscale.com/install.sh | sh

安装即可。

Tailscale + Headscale 部署 VPN 实现异地组网 (WireGuard)

然后用同样的命令来登录:

tailscale login --login-server <YOUR_HEADSCALE_URL>

然后同样进行认证就好了。

顺便开启开机自动启动:

systemctl enable tailscaled

Android 客户端安装

到这里 可以下载 Android 的安装包,下载好后安装即可。

打开后点击右上角的用户头像,接着点 Accounts,再点右上角的三个小点,选择 Use an alternate server。最后就是输入你的服务端网址,点击登录。

剩下的和其他客户端一样,不再赘述。

维护和一些小技巧

Headscale 主要由用户 (User) 和结点 (Node) 组成,一个用户可以有多个结点。这里注意,所有用户共享一个内网网段,但用户之间的结点是无法互相访问的。如果想要实现互相访问,那么就必须添加 ACL 规则。

#include <stdio.h>
正文完
 0
评论(没有评论)
验证码