目录

  •       Tailscale 是什么?
  •       Headscale 是什么?
  •       一、搭建headscale服务端
  •             1.创建相关文件并配置
  • 1. server_url: http://0.0.0.0:8080
  • 2. listen_addr: 0.0.0.0:8080
  • 3. metrics_listen_addr: 0.0.0.0:9090
  • 4. grpc_listen_addr: 0.0.0.0:50443
  •             4、配置nginx和web-ui
  •                   NPM配置nginx
  •                   宝塔面板Nginx配置
  • 创建用户
  • reusable 参数代表可以重复使用,不加的话密钥只能用来一个客户端加入
  • 查看密钥
  • ipv4: ip
  • /etc/headscale/config.yaml
  • List of externally available DERP maps encoded in JSON
  • - controlplane.tailsca...
  • Locally available DERP map files encoded in YAML
  • This option is mostly interesting for people hosting
  • their own DERP servers:
  • tailscale.com/kb/111...
  • paths:
  • - /etc/headscale/derp-example.yaml
  • If enabled, a worker will be set up to periodically
  • refresh the given sources and update the derpmap
  • will be set up.
  • How often should we check for DERP updates?
  • docker 运行的客户端
  • 非 docker 运行的客户端
  • 防止探测ip6table
  • 将 <HEADSCALE_PUB_IP> 换成你的 Headscale 公网 IP 或域名
  • 目前国家工信部在大力推动三大运营商发展 IPv6,对家用宽带而言,可以使用的 IPv4 公网 IP 会越来越少。有部分地区即使拿到了公网 IPv4 地址,也是个大内网地址,根本不是真正的公网 IP,访问家庭内网的资源将会变得越来越困难。
    部分小伙伴可能会选择使用 frp 等针对特定协议和端口的内网穿透方案,但这种方案还是不够酸爽,无法访问家庭内网任意设备的任意端口。更佳的选择还是通过 VPN 来组建大内网。至于该选择哪种 VPN,毫无疑问肯定是 WireGuard,WireGuard 就是 VPN 的未来。
    WireGuard 目前最大的痛点就是上层应用的功能不够健全,因为 WireGuard 推崇的是 Unix 的哲学,WireGuard 本身只是一个内核级别的模块,只是一个数据平面,至于上层的更高级的功能(比如秘钥交换机制,UDP 打洞,ACL 等),需要通过用户空间的应用来实现。

    Tailscale 是什么?

    Tailscale 是一种基于 WireGuard 的虚拟组网工具,和 Netmaker 类似,最大的区别在于 Tailscale 是在用户态实现了 WireGuard 协议,而 Netmaker 直接使用了内核态的 WireGuard。所以 Tailscale 相比于内核态 WireGuard 性能会有所损失,但与 OpenVPN 之流相比还是能甩好几十条街的,Tailscale 虽然在性能上做了些许取舍,但在功能和易用性上绝对是完爆其他工具:

    1. 开箱即用
    • 无需配置防火墙

    • 没有额外的配置

    1. 高安全性/私密性

    • 自动密钥轮换

    • 点对点连接

    • 支持用户审查端到端的访问记录

    1. 在原有的 ICE、STUN 等 UDP 协议外,实现了 DERP TCP 协议来实现 NAT 穿透

    2. 基于公网的控制服务器下发 ACL 和配置,实现节点动态更新

    3. 通过第三方(如 Google) SSO 服务生成用户和私钥,实现身份认证

    简而言之,我们可以将 Tailscale 看成是更为易用、功能更完善的 WireGuard。
    img
    Tailscale 是一款商业产品,但个人用户是可以白嫖的,个人用户在接入设备不超过 20 台的情况下是可以免费使用的(虽然有一些限制,比如子网网段无法自定义,且无法设置多个子网)。
    Tailscale 终究是第三方平台,如该平台发生数据泄露、异常崩溃、服务终止等,就无能为力。或许,我们可以自己建一个类似的私有平台?

    Headscale 是什么?

    Headscale 旨在实现一个自托管、开源的Tailscale控制服务器替代方案,可以实现较小范围内和实现单个Tailnet的功能,通常可用于设置为单个组织、家庭或个人使用。

    一、搭建headscale服务端

    Headscale 部署很简单,推荐直接在 Linux 主机上安装。

    1.创建相关文件并配置

    这里需要手动创建 db.sqlite,这是根服务器的数据库文件。另外,还需要下载官网给的配置文件示例,然后需要修改一部分。

    mkdir -p /home/docker/headscale/config && \
    mkdir -p /home/docker/headscale/data && \
    touch /home/docker/headscale/data/db.sqlite && \
    wget https://github.com/juanfont/headscale/raw/main/config-example.yaml -O /home/docker/headscale/config/config.yaml
    ```修改相关配置文件,比如配置文件中配置 `127.0.0.1` 的话,那么就只能本机访问。这里修改为 `0.0.0.0` 那么就所有的 ip 都能访问。

    sed -i 's/127.0.0.1/0.0.0.0/g' /home/docker/headscale/config/config.yaml

    1. server_url: http://0.0.0.0:8080

    2. listen_addr: 0.0.0.0:8080

    3. metrics_listen_addr: 0.0.0.0:9090

    4. grpc_listen_addr: 0.0.0.0:50443

    a、hs的监听端口号,要和docker-compose.yaml里定义的端口一致,默认是8080
    b、没有部署中继服务器,但derp部分不能删除,把enabled项设为fasle即可,否则后面headscale-webui进行overview时会出现服务器错误。-->
    其中server_url还需要另外修改:`server_url`是对外访问和登录的地址,如果你需要使用域名并开启https,那么照我如下配置。如果你仅仅使用ip,那么这个地址修改为`ip+端口`的方式即可。<!--**如果是国内服务器,域名必须要备案**-->
    **域名填自己的**

    sed -i 's#http://0.0.0.0:8080#headscale.yourname.c... /home/docker/headscale/config/config.yaml

    sed -i 's/1.1.1.1/119.29.29.29/g' /home/docker/headscale/config/config.yaml
    `客户端可以通过 `主机名 + 用户 + 基础域名` 访问任意一台终端,所以这里修改下基础域名[根域名],根据自己的实际域名进行填写。 **域名填自己的**

    sed -i 's/example.com/yourname.com/' /home/docker/headscale/config/config.yaml
    ```设置客户端随机端口,这里是听见有说不开机随机端口可能出现只能加入一台客户端的情况,为了保险还是选择开启。
    以前是 namespace 的概念,现在似乎改为 user 了

    4、配置nginx和web-ui

    NPM配置nginx

    Nginx Proxy Manager 中配置一下反向代理,并且配置下 SSL。需要注意的是,要把 Websockets Support 打开,否则客户端会无法登录。
    img
    如果 webuiHeadscale 使用了同一个域名,需要配置一下 Custom locations
    img
    最后访问下 Headscale 的域名,如果返回了 404,说明部署成功。
    保存配置后重启 nginx,如果配置正确,那么通过 https://域名/admin 应该可以访问到 web-ui 界面,输入容器启动时配置的用户名密码即可进入。

    宝塔面板Nginx配置

    server {
        listen       443 ssl;
        listen  [::]:443 ssl;
        server_name  headscale.amjun.com;
        ssl_certificate  /etc/nginx/conf.d/cert/amjun.com.cer;
        ssl_certificate_key /etc/nginx/conf.d/cert/amjun.com.key;
     
        location ^~/ {
            proxy_pass http://localhost: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 https:// 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;
        }
     
        location ^~/admin/ {
            proxy_pass http://localhost:5000/admin/;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
     
    server {
        listen 80;
        server_name  headscale.amjun.com;
        rewrite ^(.*)$ https://$host:443$1 permanent;
    }
    ```#### 配置web-ui
    
    上面提示输入 apikey,这个需要 headscale 服务端生成,这里设置一个比较长的时间,根据自己的需要即可。

    docker exec -it headscale headscale apikeys create -e 10000d

    ![img](https://trilium.88531.cn/share/api/attachments/60L1MQw1HCH7/image/655b3d15c9a50.png)
    ![image-20231120182150172](https://trilium.88531.cn/share/api/attachments/eMOGzstcr9IA/image/655b3340dccfd.png)
    ### 5、创建用户和授权密钥
    
    headscale 个人理解是用户就是命名空间,进行网络隔离,所以需要先创建用户。

    创建用户

    docker exec -it headscale headscale users create hz

    reusable 参数代表可以重复使用,不加的话密钥只能用来一个客户端加入

    docker exec -it headscale headscale preauthkeys create -e 10000d --reusable -u hz

    查看密钥

    docker exec -it headscale headscale preauthkeys list -u hz

    ## 二、搭建Derp服务端
    
    由于 `Tailscale` 官方的 `DERP` 服务在中国大陆地区并没有服务提供,并且使用的人也非常的多,以至于中继的体验并不好,因此可以自建一个中继服务来改善这个问题。
    ### 1、使用如下命令即可搭建 derp 服务器:
    

    docker run -d \
    --name derper \
    -p 12345:12345 \
    -p 3478:3478/udp \
    -e DERP_ADDR=:12345 \
    -e DERP_DOMAIN=derper.your-domain.com \
    -e DERP_VERIFY_CLIENTS=false \
    --restart always \
    yangchuansheng/derper

    - 能用 443 端口尽量用 443 端口,实在不行再用别的端口;
    - 默认情况下也会开启 STUN 服务,UDP 端口是 `3478`
    - 防火墙需要放行端口 123453478
    - 准备好 SSL 证书;
    
    `derper.your-domain.com` 修改为自己的域名。设置环境变量 `DERP_VERIFY_CLIENTS` 是为了验证域名,这里考虑到有些人不一定需要所以设置为 false,如果真正自己使用还是建议设置为 true
    目前 derper 运行一段时间就会崩溃,暂时还没有更好的解决方案,只能通过定时重启来解决,比如通过 crontab 来设置每两小时重启一次容器:

    0 */2 * * * docker restart derper &> /dev/null

    server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name derper.your-domain.com;
    ssl_certificate /etc/nginx/conf.d/cert/your-domain.com/your-domain.com.cer;
    ssl_certificate_key /etc/nginx/conf.d/cert/your-domain.com/your-domain.com.key;

    location / {
        proxy_pass http://localhost:12345/;
        proxy_redirect https:// https://;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        add_header Content-Security-Policy upgrade-insecure-requests;
    }

    }

    server {
    listen 80;
    server_name derper.your-domain.com;
    rewrite ^(.*)https://host:443$1 permanent;
    }

    配置修改后,记得重启下 nginx,这里需要使用域名或者 ip + 端口能够访问到 derp 页面。
    ![image-20231120185118955](https://trilium.88531.cn/share/api/attachments/9FAsjGINnsik/image/655b3a291ef3c.png)
    `Nginx Proxy Manager` 中配置一下反向代理,这个也需要开启 `Websockets Support` ,否则客户端中会无法连接 `DERP` 服务。
    如果自建了 `DERP` 服务,可以把 `Tailscale` 官方的公共服务禁用,只用自己的服务。修改 `config.yaml`
    ### 3. 创建derp.yaml
    
    需要告诉 headscale 服务器我们创建的 derp 节点的地址,否则客户端不知道地址将无法使用。
    如果你是按照我之前的教程搭建的 headscale,那么运行如下命令,否则需要自己注意配置文件的位置。

    cat << EOF > /home/docker/headscale/config/derp.yaml
    regions:
    900:
    regionid: 900
    regioncode: ts
    regionname: Tencent Shanghai
    nodes:
    - name: 900a
    regionid: 900
    hostname: derper.your-domain.com

    ipv4: ip

    stunport: 3478
    stunonly: false
    derpport: 443
    EOF

    记得开放3478端口!!!
    - `regions`YAML 中的**对象**,下面的每一个对象表示一个**可用区**,每个**可用区**里面可设置多个 DERP 节点,即 `nodes`
    - 每个可用区的 `regionid` 不能重复。
    - 每个 `node``name` 不能重复。
    - `regionname` 一般用来描述可用区,`regioncode` 一般设置成可用区的缩写。
    - `ipv4` 字段不是必须的,如果你的域名可以通过公网解析到你的 DERP 服务器地址,这里可以不填。如果你使用了一个二级域名,而这个域名你并没有在公共 DNS server 中添加相关的解析记录,那么这里就需要指定 IP(前提是你的证书包含了这个二级域名,这个很好支持,搞个泛域名证书就行了)。
    - `stunonly: false` 表示除了使用 STUN 服务,还可以使用 DERP 服务。
    

    regions:
    901:
    regionid: 901
    regioncode: jp
    regionname: Aliyun Japan
    nodes:
    - name: 901a
    regionid: 901
    hostname: 'derper.yourdomain1.com'
    ipv4: ''
    stunport: 3478
    stunonly: false
    derpport: 443
    902:
    regionid: 902
    regioncode: cn
    regionname: Aliyun Guangzhou
    nodes:
    - name: 902a
    regionid: 902
    hostname: 'derper.youdomain2.com'
    ipv4: ''
    stunport: 3478
    stunonly: false
    derpport: 443

    
    修改 config.yaml 文件,paths 指定 derp.yaml 文件的位置,urls 下面的链接是官方提供的中继服务器,根据自己判断是否需要注释。

    /etc/headscale/config.yaml

    derp:

    List of externally available DERP maps encoded in JSON

    urls:

    - controlplane.tailsca...

    Locally available DERP map files encoded in YAML

    #

    This option is mostly interesting for people hosting

    their own DERP servers:

    tailscale.com/kb/111...

    #

    paths:

    - /etc/headscale/derp-example.yaml

    paths:
    - /etc/headscale/derp.yaml

    If enabled, a worker will be set up to periodically

    refresh the given sources and update the derpmap

    will be set up.

    auto_update_enabled: true

    How often should we check for DERP updates?

    update_frequency: 24h

    docker restart headscale

    
    再次执行 `netcheck` 命令,可以看见自己搭建的 derp 节点,如果是使用国内的服务器搭建,那么一般这个服务器是最近的。

    docker 运行的客户端

    docker exec -it tailscaled tailscale netcheck

    非 docker 运行的客户端

    tailscale netcheck

    
    目前除了 iOS 客户端,其他平台的客户端都有办法自定义 Tailscale 的控制服务器。
    
    |OS |是否支持 Headscale |
    |:--|
    |Linux |Yes |
    |OpenBSD |Yes |
    |FreeBSD |Yes |
    |macOS |Yes |
    |Windows |Yes 参考 [Windows 客户端文档](https://github.com/juanfont/headscale/blob/main/docs/windows-client.md) |
    |Android |支持,参考 [这个 PR](https://github.com/tailscale/tailscale-android/pull/55) |
    |iOS |暂不支持 |
    ### 1、Linux
    
    #### 1.1脚本安装
    

    curl -fsSL tailscale.com/instal... | sh && \
    tailscale login --login-server headscale.amjun.com --authkey b6a9b4f4e9c3a7c7e7b9b1a3a6b9e6b7a5e7c2a1e3a0a4a1 --accept-dns=false --accept-routes

    #### 1.2Docker安装
    

    docker run -d \
    --name=tailscaled \
    -v /home/docker/tailscale/:/var/lib \
    -v /dev/net/tun:/dev/net/tun \
    -e TS_STATE_DIR=/var/lib/state/ \
    --network=host \
    --restart always \
    --privileged tailscale/tailscale:v1.44.0 \
    tailscaled --tun=tailscale0 -debug=:8088 -no-logs-no-support=true
    ```这里需要将 TS_STATE_DIR 指定的文件夹持久化,否则删除容器再新建后,在服务端能看见重复的设备。并且需要指定 --tun=tailscale0,不然似乎不能在宿主机创建网卡。
    然后使用如下命令进行登录:

    docker exec tailscaled tailscale login --login-server https://headscale.amjun.com --accept-dns=false --accept-routes=false --authkey b6a9b4f4e9c3a7c7e7b9b1a3a6b9e6b7a5e7c2a1e3a0a4a1 --advertise-routes=172.21.9.0/24,172.30.1.0/24,172.26.1.0/24,172.20.2.0/23
    ```根据自己网络情况设置 `--advertise-routes`,我这是需要通过这台内网机器访问公司其他网络。
    如果出现如下错误:
    >running [/sbin/ip6tables -t filter -N ts-input --wait]: exit status 3: modprobe: can't change directory to '/lib/modules': No such file or directory
    ip6tables v1.8.8 (legacy): can't initialize ip6tables table `filter': Table does not exist (do you need to insmod?)
    Perhaps ip6tables or your kernel needs to be upgraded
    
    执行以下命令:

    防止探测ip6table

    sudo modprobe ip6table_filter

    
    Tailscale 官方提供了各种 Linux 发行版的软件包,但国内的网络你懂得,软件源根本用不了。好在官方还提供了 [静态编译的二进制文件](https://tailscale.com/download/linux/static),我们可以直接下载。例如:

    wget pkgs.tailscale.com/s...

    tar zxvf tailscale_1.22.2_amd64.tgz

    cp tailscale_1.22.2_amd64/tailscaled /usr/sbin/tailscaled
    cp tailscale_1.22.2_amd64/tailscale /usr/bin/tailscale

    cp tailscale_1.22.2_amd64/systemd/tailscaled.service /lib/systemd/system/tailscaled.service

    cp tailscale_1.22.2_amd64/systemd/tailscaled.defaults /etc/default/tailscaled

    systemctl enable --now tailscaled

    systemctl status tailscaled

    将 <HEADSCALE_PUB_IP> 换成你的 Headscale 公网 IP 或域名

    tailscale up --login-server=http://<HEADSCALE_PUB_IP>:8080 --accept-routes=true --accept-dns=false

    执行完上面的命令后,会出现下面的信息:

    To authenticate, visit:

    http://xxxxxx:8080/register?key=905cf165204800247fbd33989dbc22be95c987286c45aac303393704

    1150d846

    
    除了常规的 Linux 发行版之外,还有一些特殊场景的 Linux 发行版,比如 OpenWrt、威联通(QNAP)、群晖等,这些发行版的安装方法已经有人写好了,这里就不详细描述了,我只给出相关的 GitHub 仓库,大家如果自己有需求,直接去看相关仓库的文档即可。
    - OpenWrt: https://github.com/adyanth/openwrt-tailscale-enabler 
    - 群晖: https://github.com/tailscale/tailscale-synology 
    - 威联通: https://github.com/ivokub/tailscale-qpkg 
    
    ### 3、Android
    
    Android 客户端从 1.30.0 版本开始支持自定义控制服务器(即 coordination server),你可以通过 [Google Play](https://play.google.com/store/apps/details?id=com.tailscale.ipn) 或者 [F-Droid](https://f-droid.org/packages/com.tailscale.ipn/) 下载最新版本的客户端。[国内本地下载](https://kdocs.cn/l/cihuMda1eQPj)
    安装完成后打开 Tailscale App,会出现如下的界面:
    ![img](https://trilium.88531.cn/share/api/attachments/DqOsL1Dd23cz/image/655b431b7855b.jpeg)
    点开右上角的“三个点”,你会看到只有一个 `About` 选项:
    ![img](https://trilium.88531.cn/share/api/attachments/zhws38mFj6hd/image/655b432eee77e.jpeg)
    接下来就需要一些骚操作了,你需要反复不停地**点开再关闭**右上角的“三个点”,重复三四次之后,便会出现一个 `Change server` 选项:
    ![img](https://trilium.88531.cn/share/api/attachments/BVq6sn3MNJ5H/image/655b4341297e9.jpeg)
    点击 `Change server`,将 headscale 控制服务器的地址填进去:
    ![img](https://trilium.88531.cn/share/api/attachments/t9P5edWFOBxg/image/655b43531a1c9.jpeg)
    然后点击 `Save and restart` 重启,点击 `Sign in with other`,就会跳出这个页面:
    ![img](https://trilium.88531.cn/share/api/attachments/xzsQP9ZKbZhg/image/655b43697f8da.jpeg)
    将其中的命令粘贴到 Headscale 所在主机的终端,将 **NAMESPACE** 替换为之前创建的 namespace,然后执行命令即可。注册成功后可将该页面关闭,回到 App 主页,效果如图:

    docker exec -it headscale headscale nodes register --user hz --key nodekey:xxxx

    ### 4、Windows
    
    tailscale 客户端下载地址:[https://tailscale.com/download/](https://tailscale.com/download/windows)
    #### 4.1 安装客户端
    
    下载 windows 客户端并进行安装。
    #### 4.2 安装注册表
    
    访问 `https://headscale.amjun.com/windows`,可以看见配置的教程。
    提示需要修改注册表,这里可以直接 `curl https://headscale.amjun.com/windows/tailscale.reg` 下载文件后,双击运行文件进行安装即可。
    #### 4.3 登录
    
    在 tailscale 的安装目录下使用 cmd 打开,输入命令:

    tailscale login --login-server headscale.amjun.com --authkey b6a9b4f4e9c3a7c7e7b9b1a3a6b9e6b7a5e7c2a1e3a0a4a1 --accept-dns=false --accept-routes

    docker exec -it headscale headscale nodes ls
    ```## 总结

    目前从稳定性来看,Tailscale 比 Netmaker 略胜一筹,基本上不会像 Netmaker 一样时不时出现 ping 不通的情况,这取决于 Tailscale 在用户态对 NAT 穿透所做的种种优化,他们还专门写了一篇文章介绍 NAT 穿透的原理中文版翻译自国内的 eBPF 大佬赵亚楠,墙裂推荐大家阅读。放一张图给大家感受一下:
    img

    作者:admin  创建时间:2024-12-24 09:59
    最后编辑:admin  更新时间:2024-12-24 18:02