Tailscale 虽然是 mesh 的网络模式, 可以点对点的连接所有设备, 能直连会尽量直接连接, 然鹅还是需要一个默认的 server 来进行服务发现和临时中转流量.

那么大概的配置框架就已经出现了, 一个服务发现中心, 和多个不同的客户端.
开始的时候直接使用的 tailscale + github 账户登录的方式使用, 然后发现 github 账户直接托管的中心服务不能关闭国外的中转服务器, 这就比较难受, 本来可以直通的线路走了国外的中转不稳定, 会断, 最后还是走国内的便宜云服务器自己维护了一个开源的 headscale 作为中心服务.

安装 Headscale

headscale 官方文档
现在的 headscale 容器镜像的是有问题的, 不太好用, 还得花时间修。

Update: 看起来现在是修复了, 并且费点儿劲可以用起来, 但是不确定稳定性如何.


我准备了这些:

  • 域名 和 域名证书
  • 一台 Debian 的云服务器
  • 公网 ip 地址

具体的安装步骤就是按照官方网站走下来就可以了.
一些条件:
需要注意的地方就是备案, 不备案会导致无法使用 443.
那么需要在tailscale的配置文件中指定端口, 让 tailscale 监听在一个不常用的端口上.

因为没有写清楚 server 的地址和端口, 折腾了一天… 一度怀疑是不是换端口也不行, 必须备案 …

配置文件

headscale ~$ vim /etc/headscale/config.yaml
# 大约在配置文件的 13行左右.
server_url 这个字段需要写成 https://YOURHOSTNAME.YOURDOMAIN:PORT 就可以了. 

大约在配置文件的77行左右, 会有一个 DEPR 集成的服务, 开启这个服务之后, 可以使用当前的服务器直接作为DEPR中转节点.

77	derp:
78	  server:
79	    # If enabled, runs the embedded DERP server and merges it into the rest of the DERP config
80	    # The Headscale server_url defined above MUST be using https, DERP requires TLS to be in place
81	    enabled: true

绑定证书的位置在大约 151行之后, 我使用自己签发的证书, 就是直接配置 182 183 两行的参数就行.

181	## Use already defined certificates:
182	tls_key_path: /path/to/cert.key
183	tls_cert_path: /path/to/cert.pem

关闭了官方的DERP服务列表:

 98	  # List of externally available DERP maps encoded in JSON
 99	  #urls:
100	  #  - https://controlplane.tailscale.com/derpmap/default
101	
102	  # Locally available DERP map files encoded in YAML
103	  #
104	  # This option is mostly interesting for people hosting
105	  # their own DERP servers:
106	  # https://tailscale.com/kb/1118/custom-derp-servers/
107	  #
108	  # paths:
109	  #   - /etc/headscale/derp-example.yaml
110	  paths: []

关闭了 OverwriteDNS, 总是会尝试将客户的默认DNS服务器重写为 TailNet DNS.

204	dns_config:
205	  # Whether to prefer using Headscale provided DNS or use local.
206	  override_local_dns: false

安装tailscale客户端

按照安装文档直接安装, 不一样的发行版(是的, Windows 也是 Linux 发行版) 安装方式不同, 基本上启动之后都能用, 完成度非常高.

注册节点的命令

节点注册命令记录.

sudo tailscale up --accept-dns=false --advertise-exit-node --advertise-routes=192.168.31.0/24 --login-server=https://YOURHOSTNAME.YOURDOMAIN:PORT --accept-routes
# 也可以是: 
sudo tailscale up --accept-dns=false --advertise-exit-node --login-server=https://YOURHOSTNAME.YOURDOMAIN:PORT --accept-routes
# 或者是: 
sudo tailscale up --accept-dns=false --login-server=https://YOURHOSTNAME.YOURDOMAIN:PORT --accept-routes
# 最后是: 
sudo tailscale up --accept-dns=true --login-server=https://YOURHOSTNAME.YOURDOMAIN:PORT --accept-routes

这个命令执行完毕之后, 会返回一个网页, 网页打开里面有一个命令, 复制命令去 headscale 服务器的命令行(bash)里面执行一下,节点就注册进来了.

更新运行中的 Tailscale 客户端的设置

最近需要更新我的一个节点, 发布 VPC 内的 CIDR 块, 这个设置之前没有 advertise-route 参数进行更新 。
这个实例在我的默认VPC里面, 这样的话这个实例就直接变成了这个VPC内的IGW, 流量会通过这个实例发送到VPC内, 可以直接将这个网络范围内的DNS指向VPC内的 .2 Resolver, 甚至感觉可以直接在家用 EFS 这类的东西了.

当然, 如果节点需要变动之前运行的参数, 是需要给出和之前一致的参数, 然后添加 或者 变更其中的一部分的.

sudo tailscale up --accept-dns=false --advertise-exit-node --login-server=https://YOURHOSTNAME.YOURDOMAIN:PORT --accept-routes --advertise-routes=172.31.0.0/16

问题汇总

查看当前客户端的网络状况

╰─>$ tailscale netcheck
Report:
  * UDP: true
  * IPv4: yes, PUBLIC_IP:35941
  * IPv6: no, but OS has support
  * MappingVariesByDestIP: false
  * PortMapping:
  * CaptivePortal: false
  * Nearest DERP: Headscale Embedded DERP
  * DERP latency:
    - headscale: 24.3ms  (Headscale Embedded DERP)

测试ping:

╰─>$ tailscale ping --until-direct -c 0 100.64.0.9
pong from home-SOME_NODE (100.64.0.9) via PUBLIC_IP:50177 in 6ms