headscale+derp自主组虚拟网,解决阿里云VPS部署问题

in 云服务器 with 0 comment

背景

用了多年的zerotier,近期发现,手上的VPS,加上自用的电脑,加起来已经超过了25台。这就很尴尬了。

再加上公司内部复杂的网络环境,多部门在不同外网,都有内部共享的需求。试着暂时用了一下zerotier,发现很快就25台了。没办法,只能另外想办法。

在网上找了一下,发现有tailscal方案,试用了一下,发现还可以自己搭整体方案。

试验了一下,现在已经正常跑起来了。在这里记录一下。(好多好多坑。。。。)

为了节省文字,这里不介绍和讨论技术架构及原理,只上干货。

安装headscale服务端

headscal是tailscal的开源服务端替代,安装这个后就可以直接使用它加上tailscal的客户端,任意组网。

https://github.com/juanfont/headscale

安装headscale,可以有很多方法,你可以用DOCKER,也可以用官方的安装包。由于我担心使用DOCKER会有很多内外网络的各种麻烦问题,自己又使用的是unbuntu系统,所以就直接使用了官方的DEB安装包。


sudo dpkg --install headscale.deb

这里我用找的资料,介绍一下配置文件的参数说明。


---

# Headscale 服务器的访问地址

# 

# 这个地址是告诉客户端需要访问的地址, 即使你需要在跑在

# 负载均衡器之后这个地址也必须写成负载均衡器的访问地址

server_url: https://your.domain.com

# Headscale 实际监听的地址

listen_addr: 0.0.0.0:8080

# 监控地址

metrics_listen_addr: 127.0.0.1:9090

# grpc 监听地址

grpc_listen_addr: 0.0.0.0:50443

# 是否允许不安全的 grpc 连接(非 TLS)

grpc_allow_insecure: false

# 客户端分配的内网网段

ip_prefixes:

  - fd7a:115c:a1e0::/48

  - 100.64.0.0/10

# 中继服务器相关配置

derp:

  server:

    # 关闭内嵌的 derper 中继服务(可能不安全, 还没去看代码)

    enabled: false

  # 下发给客户端的中继服务器列表(默认走官方的中继节点)

  urls:

    - https://controlplane.tailscale.com/derpmap/default

  # 可以在本地通过 yaml 配置定义自己的中继接待你

  paths: []

# SQLite config

db_type: sqlite3

db_path: /var/lib/headscale/db.sqlite

# 使用自动签发证书是的域名

tls_letsencrypt_hostname: ""

# 使用自定义证书时的证书路径

tls_cert_path: ""

tls_key_path: ""

# 是否让客户端使用随机端口, 默认使用 41641/UDP

randomize_client_port: false

由于我是用nginx来代理服务的,所以这里的配置方式上,是不使用headscale的ACME脚本去获取证书的,也没有填写自定义证书。

一个用户就相当于一个空间,空间与空间之间是隔离的。


headscale user create xxxx

systemctl enable --now headscale

systemctl start headscale

systemctl status headscale

headscale user list

ID | Name | Created

1 | default | 2022-03-09 06:12:06


headscale apikey create

安装headscale前端管理界面

headscale前端有很多开源项目,我这里选用了一个:https://github.com/GoodiesHQ/headscale-admin

直接docker跑起来


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

然后再在headscale服务端的Nginx反代里,加上反代前端的代码:


    location /admin {

        proxy_pass http://127.0.0.1:8000;

        proxy_http_version 1.1;

        proxy_set_header Upgrade $http_upgrade;

        proxy_set_header Connection $connection_upgrade;

        proxy_set_header Host $server_name;

        proxy_redirect http:// https://;

        proxy_buffering off;

        proxy_set_header X-Real-IP $remote_addr;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;

        add_header Strict-Transport-Security "max-age=15552000; includeSubDomains" always;

    }

    location / {

        proxy_pass http://127.0.0.1:8080;

        proxy_http_version 1.1;

        proxy_set_header Upgrade $http_upgrade;

        proxy_set_header Connection $connection_upgrade;

        proxy_set_header Host $server_name;

        proxy_redirect http:// https://;

        proxy_buffering off;

        proxy_set_header X-Real-IP $remote_addr;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;

        add_header Strict-Transport-Security "max-age=15552000; includeSubDomains" always;

    }

这样就能用你的域名加上/admin来访问管理界面了,填写上你的域名,加上上面生成的API KEY,就能看到用户、节点等信息了。

2024-02-05T08:48:02.png

连接客户端

官方说明有多端的连接方式,我这里只以WINDOWS和LINUX为例。

LINUX客户端连接

在客户端机器上,一条命令安装tailscale客户端

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

再一条命令加入到healscale服务端

tailscale up --login-server https://your.domain.com   --accept-routes=true --accept-dns=false

把域名改为你自己的域名。

此时界面上会有提示一个网址,复制到网页里打开,网页里出现一条命令,复制出来。

headscale nodes register --user username --key mkey:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

在headscale服务端,输入上面的命令,此时客户端和服务端都会提示成功,此时接入成功。

WINDOWS客户端连接

在客户端机器上,打开浏览器,打开https://your.domain.com/windows,此时应该可以看到提示。我们先下载那个.reg的注册表文件,然后右键管理员运行,提示导入成功。
再去tailscale官方网址,下载WINDOWS客户端。
安装客户端,然后就能看到右下角任务栏里出现了图标,点击就能看到连接状态和相关信息了。

查看各节点状态

headscale node list

这条命令可查看所有节点信息和连接状态。

客户端,也可以通过以下命令查看各节点连接状态。

tailscale status

安装derp中继服务器

docker安装derp

这个有好多个derp 的镜像,我找到下面这个还算比较靠谱。注意这个镜像的前提是本机要安装tailscale客户端,下面的命令里可以看到。

docker run -d \
        --name derp \
        --restart unless-stopped \
        -p 8800:80 \       
        -p 3478:3478/udp \ 
        --log-opt max-size=10M \
        -v /var/run/tailscale/tailscaled.sock:/var/run/tailscale/tailscaled.sock \
        sparanoid/derp:edge \
        derper \
            -a :80 \
            -verify-clients true

以上说明引用 https://pigeonforce.xyz/index.php/archives/43/ 感谢鸽子。

然后在nginx里做一下反代,证书就在nginx里直接生成就行。

    location / {
        proxy_pass http://127.0.0.1:8800;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        # websocket握手
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection Upgrade;

    }

记得将本机的防火墙,以及运营商的安全组里加入3478/udp 放行。

访问你的域名,应该可以看到以下内容 :

DERP
This is a Tailscale DERP server.

修改服务端配置,增加中继服务器配置文件。

默认headscale服务端的配置里,使用的是tailscale官方的中继服务器:

  # List of externally available DERP maps encoded in JSON
  urls: 
     - https://controlplane.tailscale.com/derpmap/default

  # Locally available DERP map files encoded in YAML
  #
  # This option is mostly interesting for people hosting
  # their own DERP servers:
  # https://tailscale.com/kb/1118/custom-derp-servers/
  #
  # paths:
  #   - /etc/headscale/derp-example.yaml
  paths: []
  #-  /etc/headscale/derp.yaml

上面的urls,就是可以用链接来下载配置文件的,下面的paths,就是使用本地配置文件来拉取中断服务器信息。
我们可以将官方的关掉,只使用我们自己配置的中继服务器。

  # List of externally available DERP maps encoded in JSON
  urls:[] 
    # - https://controlplane.tailscale.com/derpmap/default

  # Locally available DERP map files encoded in YAML
  #
  # This option is mostly interesting for people hosting
  # their own DERP servers:
  # https://tailscale.com/kb/1118/custom-derp-servers/
  #
  # paths:
  #   - /etc/headscale/derp-example.yaml
  paths: 
  -  /etc/headscale/derp.yaml

当然,你可以官方和本地的中断服务器都打开。

编辑本地中继服务器配置文件

vi /etc/headscale/derp.yaml
regions:
  901:
    regionid: 901
    regioncode: DERP
    regionname: Custom DERP
    nodes:
      - name: DERP_SERVER_1 
        regionid: 901
        hostname: derp.example.domain
        stunport: 3478
        stunonly: false
        derpport: 443

全部配置完成后,重启一下headscale

systemctl restart headscale

在任意节点上,看一下DERP配置的下发状态。

Report:
        * UDP: true
        * IPv4: yes, xxxxx:xxxx
        * IPv6: no, but OS has support
        * MappingVariesByDestIP: false
        * HairPinning: false
        * PortMapping: 
        * Nearest DERP: Aliyun hongzhou
        * DERP latency:
                - aliyunhz: 2.3ms   (Aliyun hongzhou)
                - aliyunsz: 28ms    (Aliyun shenzhen)
                - aliyungz: 28.4ms  (Aliyun guangzhou)

参考链接

@米开朗基杨 的博客: 链接
Tailscale的自建DERP教程:链接
kovacs 的博客 :链接

解决阿里云部署后外网出口问题

如果是阿里支的服务器,在安装完headscale服务端后,你会发现,好像上不了外网了,ping baidu.com都不通。。。

查了一下资料,用以下方法暂时避免一下,原因 https://nyan.im/p/troubleshoot-tailscale#comment-18008

修改/etc/netplan/下载配置文件

加上DNS服务IP,我的是50-cloud-init.yaml

network:
    ethernets:
        eth0:
            dhcp4: true
            dhcp6: true
            nameservers:
                addresses: [114.114.114.114]
            match:
                macaddress: 00:16:3e:2f:ce:f1
            set-name: eth0
    version: 2

其中,以下两条是我加上去的。

            nameservers:
                addresses: [114.114.114.114]

这时应该是可以正常连接外网了。但是apt update 和 apt upgrade 都还是会有问题,阿里云的内部镜像,访问不了。
我一恼之下,将APT源换了一下,比如换成北大或中科大的,就正常了。

最后apt update 和 apt upgrade 就正常了。

  [1]: https://github.com/juanfont/headscale/releases

Responses