Headscale+Tailscale+DERP虚拟组网全流程(上)

默认分类 · 2023-08-04

有一批零散的windows机器需要远程管理,之前一直通过ToDesk远程桌面的方式来管理,延迟高带宽小,操作起来很难受。
为了方便,要把这批机器都换装Linux,同时组建虚拟局域网,方便接入k8s集群统一管理。

Headscale是Tailscale控制端的开源实现,Tailscale本质是一款商业产品,免费用户是有限制的,同时官方提供的DERP节点都不在国内,导致NAT穿透失败后走中继的延迟和带宽表现都挺一般,这就需要自建Headscale和DERP服务器来实现完全可控和加速中继。

简单来说,Headscale是服务端,Tailscale是客户端,DERP是中转流量的小弟。

操作环境

  • 阿里云服务器一台,带宽5M,部署Headscale服务给节点做验证
  • 阿里云服务器一台,带宽30M,部署DERP服务做辅助打洞和流量中转
    ❗注意DERP服务强制要求https,部署在大陆地区需要自行解决备案问题
  • Linux客户端若干,位于不同省份,均无公网ip,部署Tailscale

Headscale部署

  1. 拉取Docker镜像
    Headscale官方提供了docker镜像,链接:DockerHub

    docker pull headscale/headscale:0.22.3
  2. 下载模板配置文件

    wget -O /etc/headscale/config-example.yaml \
     https://raw.githubusercontent.com/juanfont/headscale/main/config-example.yaml

    根据实际对配置文件进行修改

    server_url: http://<服务器ip>:8001       # 这里的ip端口是服务器的ip和实际端口,如果容器内外端口号不一样,填容器外的
    listen_addr: 0.0.0.0:8080               # 这里的监听地址和port按实际修改
    metrics_listen_addr: 0.0.0.0:9090       # 指标采集接口,没有监控需求的可不暴露此端口
    grpc_listen_addr: 127.0.0.1:50443       # grpc端口
    grpc_allow_insecure: false
    private_key_path: /etc/headscale/private.key
    noise:
      private_key_path: /etc/headscale/noise_private.key
    ip_prefixes: # 虚拟局域网的网段,ipv6用不上可以删掉
      - fd7a:115c:a1e0::/48
      - 100.64.0.0/10
    
    disable_check_updates: true # 关闭Headscale启动时的检查更新
    
    logtail:
      enabled: false # 关闭Tailscale公司的远程日志收集
    
    其他配置自行参考模板文件
  3. 拉起容器

    docker run -d \
       --name headscale \
       -v /etc/headscale:/etc/headscale/ \
       -p 8001:8080 \    # 这里的端口要按实际来改
       headscale/headscale:0.22.3 \
       headscale serve

Tailscale部署

因为Tailscale官方的软件源不在国内,国内也没有加速镜像,跑官方的安装脚本非常慢,所以选择二进制安装的方式来部署。

  1. 下载二进制文件
    Tailscale官方二进制下载页: 下载
    自行选择下载合适的二进制包
  2. 解压二进制文件包

    tar -xvf ./tailscale_1.46.1_amd64.tgz

    解压后得到以下文件:

    root@armbian:~/tailscale_1.46.1_arm64# tree 
    .
    ├── systemd
    │   ├── tailscaled.defaults
    │   └── tailscaled.service
    ├── tailscale
    └── tailscaled
    
     1 drecitory, 4 files
  3. 移动文件到对应目录下

    mv ./tailscale* /usr/sbin
    mv ./systemd/tailscaled.service /etc/systemd/system/
    mv ./systemd/tailscaled.defaults /etc/default/tailscaled
  4. 启动服务

    systemctl daemon-reload
    systemctl start tailscaled.service
    systemctl enable tailscaled.service

注册节点

  1. 首先在Headscale容器内创建一个用户,用户的概念和k8s的Namespace一样,是用来隔离资源的

    headscale user create root
  2. 在Tailscale节点上执行命令,获取nodekey

    tailscale up \
     --accept-dns=false \  # 不接受Headscale设置的magic-dns
     --accept-routes \     # 接受其他节点广播的子网路由
     --advertise-routes=192.168.0.0/24,192.168.1.0/24 \  # 向其他节点广播子网路由
     --login-server=http://<HeadscaleIP>:8001  # Headscale服务地址

    执行命令后Tailscale会给出一个网址,指向Headscale的注册页

    [root@centos ~]# tailscale up --accept-dns=false --accept-routes --advertise-routes=192.168.0.0/24,192.168.1.0/24 --login-server=http://<HeadscaleIP>:8001
    Warning: IPv6 forwarding is disabled.
    Subnet routes and exit nodes may not work correctly.
    See https://tailscale.com/s/ip-forwarding
    
    To authenticate, visit:
    
         http://<HeadscaleIP>:8001/register/nodekey:fe**************40

    记下网址后面跟的nodekey

  3. 在Headscale上用nodekey注册节点
    到这一步可以不打开注册页,注册页上就一条注册命令,没什么用
    直接切到Headscale容器的shell,执行以下命令注册节点
    username要换成第一步创建的用户,nodekey要换成上面那个网址的nodekey

    root@e0d00fa45fe0:/# headscale nodes register --user <username> --key nodekey:fe**************40
    Machine centos registered

    注册完成后,Tailscale会打印出一条信息,如果没有,也可以直接ctrl+c退出来,一般都是注册好了

    Success.
    [root@centos ~]#
  4. 检查状态
    Headscale上可以用headscale node list来查看节点状态

    root@e0d00fa45fe0:/# headscale node list
    ID | Hostname   | Name       | MachineKey | NodeKey | User | IP addresses | Ephemeral |Last seen           | Expiration          | Online | Expired
    \1 | centos     | centos     | [*****]    | [*****] | root | 100.64.0.1   | false     |2023-08-01 00:00:00 | 0001-01-01 00:00:00 | online | no

    Tailscale上可以用tailscale status来查看状态

    [root@ovpn ~]# tailscale status
    100.64.0.1      centos                 root         linux   -

    两边都能看到信息,说明节点注册正常
    按照同样的流程注册其他节点,节点之间就可以通过Headscale分配的100.64.0.0/10网段的ip进行通信了

DERP的部署比较麻烦,坑比较多,放到下篇单独写

Theme Jasmine by Kent Liao