2023年11月

非典型程序员不是每天都累成狗,天天”996"甚至”007“。可能,面临着上班摸鱼没事干,下班躺尸打游戏的无聊境况。那么,如果你也是这样的程序员,有没有什么安排可以打发时间?

闲着还不如挣钱~心情好的时候搞搞兼职,既是打发时间,也是塞满腰包的技巧。程序员自由职业兼职找网上平台接私活,又挑花了眼,不知如何下手。不要紧,万事开头难,找准方向、找对方法,一切都水到渠成!

自由职业者驻场、兼职职位众包、项目整包,是三种目前程序员的主要兼职方向。其薪酬从按小时计费、到几千几万不等,与付出的劳动质量成正比。

搜罗网上海量信息、整合大量数据,并结合相关经验,整理了以下接单平台的相关,相信如果能认真看完,应该会对大家接单、接私活有些帮助。(诚推+避坑)亲选37个平台,需要的自取尝试。

一、国内接单平台

绿灯区

1.程序员客栈

程序员的经纪人,定位于中高端程序员、知名度高;讲求对接效率,订单较多;拥有程序员展示模块,帮助新手程序发展潜在客户;智慧推荐、平台派单形式多样,最大程度保证程序员的时间和空间自由;IT垂直度高、团队专业,价格透明。

2.解放号

由中软国际支持,平台采用“云+众包”模式;属于垂直软件领域,提供的服务贯穿IT服务全流程,致力于打造"多快好省‘的良心平台;主打定制化,针对企业方,比较靠谱。

3.码市

是Coding旗下的软件外包服务平台,截至目前已有30w+注册开发者,成交项目数量达2w+。主要以外包为主,平台竞争较为激烈,也侧面说明平台还不错。

4.英选

是一个独立开发者短期雇佣平台,找兼职是对口的。对甲方的工作做得较为到位,对自由职业者来说省去了更多的麻烦,而且平台的技术力量是过硬的。

5.开发邦

IT垂直度高,服务范围极其明确,客户的需求也相对较为明确。在原先的开发工程师分享社区基础上,现已有十余年成功的软件开发外包服务经验;除了接私活挣钱,平台内还有许多高质知识分享。

6.云沃

垂直于数字化领域的远程工作平台,同样服务范围极广。自动化客户支持,高效数据分析助力程序员接单!

7.猿查查

8.人人开发

9.1024work

10.一品威客

11.实现网

12.智城外包网

08年成立,在外包界小有名气,软件团队和公司都还比较多,平台上需求较大。

13.

我爱方案网

14.

我要外包网

15.

外包大师

16

.快码众包

17.

码易众包

18.

开源众包

19.

电鸭社区

黄灯区:

20.

甜薪工场

比较小众,经营范围还是比较广的,平台根据企业需求进行智能推荐,按件、按月两种方式接单。一翻评论区,吐槽没有结款和交付低效率低的倒是不少。估计是平台太小了,还不太完善。

21.猪八戒

成立时间比较长,项目内容比较杂。名气比较大,网上用户吐槽的也比较多,可能黑红也是红吧。相对更适合新手,不过接单的话还是建议谨慎。

二、国外接单平台

1

.Freelancer

一个拥有中文版、世界上最大的自由职业者和众包市场,市场广阔。但是”林子大了什么鸟都有“,所以单子的质量差距比较大,需要仔细斟酌。

2

.Upwork

全球最大的、最规范的综合类外包平台,是全球最严谨规范的自由职业市场。有一说一,平台相对的卷。

3.

Devnors

国外新兴的接单平台,采用区块链支付,竞争相对较小,可以淘淘金。

4.

Stackoverflow

5.Toptal

6.

Remoteok

7.Fiverr

8.Topcoder

9.We work remotely

10.Peopleperhour

11.Guru

12.Envato

13.Crossover

总结:

世上平台千千万,最适合自己的才是最好的。建议大家可以多试试,多了解一下。而且刚开始接单的话要有耐心,慢慢积累自己的口碑会比较容易小有成就。

其次,是在接单兼职中,大家可以考虑一下自己的沉默成本。大多数平台,是需要缴纳一定的费用的,而且接单过程中也存在跑路的风险。大家要做好评估、擦亮双眼,留好心眼。

希望大家可以快乐兼职、自由赚钱。全年无bug,一生有钱花;头发多多,身体健康~

以上是全部内容,整理总结不易,如果觉得有用的话,可以点赞+关注+收藏=便捷哦~感谢!!!


前言

之前写过 Zerotier 搭建私有根服务器及创建虚拟局域网,阿蛮君也是一直在使用自建的 zerotier,但是为什么还要折腾 headscale 呢?最大的原因是 zerotier 创建根服务器只能使用 ip,这对迁移不是非常方便,并且自己也想了解下 headscale,所以折腾了几天总算有了结果。

一、搭建headscale服务端

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# 这将修改以下几个地方,其中server_url还需要另外修改# 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

另外因为server_url是对外访问和登录的地址,如果你需要使用域名并开启https,那么照我如下配置。如果你仅仅使用ip,那么这个地址修改为ip+端口的方式即可。

域名填自己的

sed -i 's#http://0.0.0.0:8080#https://headscale.amjun.com#g' /home/docker/headscale/config/config.yaml

修改 dns 配置文件,如果不进行修改,那么登录时选择接受服务器的 dns 地址就会出现域名无法解析的情况。注意,这里的 dns 地址可以有多个,如果有需要自行添加即可。

sed -i 's/1\.1\.1\.1/114.114.114.114/g' /home/docker/headscale/config/config.yaml

客户端可以通过 主机名 + 用户 + 基础域名 访问任意一台终端,所以这里修改下基础域名,根据自己的实际域名进行填写。

域名填自己的

sed -i 's/example.com/amjun.com/' /home/docker/headscale/config/config.yaml

设置客户端随机端口,这里是听见有说不开机随机端口可能出现只能加入一台客户端的情况,为了保险还是选择开启。

sed -i 's/randomize_client_port: false/randomize_client_port: true/' /home/docker/headscale/config/config.yaml

启用内嵌的derp

当然你可以使用官方提供的 derp 服务器,但如果你想搭建自己的 derp 服务器,又不想另外搭建一个 derp 服务器,那么这是有必要的。

注意:使用此 derp 服务器,需要有域名并配置 ssl,否则请参考:Docker 搭建中继服务器 derp - 纯 IP 实现 。

# /home/docker/headscale/config/config.yamlderp:server:# xxxenabled: true# xxxregion_id: 999# xxxregion_code: "headscale"region_name: "Headscale Embedded DERP"# xxxstun_listen_addr: "0.0.0.0:3478"

enabled 选项默认为 false,需要设置为 true。

3.启动headscale服务端

docker run -d \--name headscale \--restart always \-v /home/docker/headscale/config:/etc/headscale/ \-v /home/docker/headscale/data:/var/lib/headscale \-p 8080:8080 \-p 9090:9090 \-p 3478:3478/udp \--restart always \headscale/headscale:0.22.3 \headscale serve

下面是一些相关的命令:

以前是 namespace 的概念,现在似乎改为 user 了。

# 查看用户docker exec -it headscale headscale users ls# 创建用户docker exec -it headscale headscale users create hz# 生成apikeydocker exec -it headscale headscale apikey create# 查询apikeydocker exec -it headscale headscale apikey ls

二、搭建web-ui

这一步是搭建 headscale 的 web-ui 界面,这不是必要的,因为阿蛮君更多使用命令,这只是有助于更好的查看相关信息。

docker run -d \--name headscale-webui \--restart always \-v /home/docker/headscale/config:/etc/headscale/:ro \-v /home/docker/headscale/web-ui/data:/data \-u root \-p 5000:5000 \-e HS_SERVER=https://headscale.amjun.com \-e DOMAIN_NAME=https://headscale.amjun.com \-e SCRIPT_NAME=/admin \-e AUTH_TYPE=Basic \-e BASIC_AUTH_USER=admin \-e BASIC_AUTH_PASS=admin \-e KEY="2uHP6BSVocX+wcWU5mzuXA7JvnZA70UaTadB8L1heOo=" \--restart always \ifargle/headscale-webui:latest

其中 /home/docker/headscale/config 为上面服务端的映射目录,这两个目录需要一致。HS_SERVER 和 DOMAIN_NAME 填写自己的域名1。KEY 是用来加密待会需要保存的 apikey 的字符串,使用命令 openssl rand -base64 32 生成。

接下来需要创建 headscale 服务器的 api-key,这里设置一个比较久的过期时间。

三、配置nginx和web-ui

1.配置nginx

如果前面server_url没有配置 ssl 加密,那这一步也不是必要的。

添加如下配置:


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;

}

保存配置后重启 nginx,如果配置正确,那么通过 https://域名/admin 应该可以访问到 web-ui 界面,输入容器启动时配置的用户名密码即可进入。

Docker 搭建 headscale 异地组网完整教程

2.配置web-ui

上面提示输入 apikey,这个需要 headscale 服务端生成,这里设置一个比较长的时间,根据自己的需要即可。

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

运行命令后将生成的 key 输入,点击 save 即可,概览页面如下:

Docker 搭建 headscale 异地组网完整教程

四、创建用户和授权密钥

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

这里记得记录好授权密钥,下面将会用到。

五、客户端安装

headscale 相当于是重新实现了 tailscale 的服务端,客户端基本还是用的 tailscale。

tailscale 客户端下载地址:https://tailscale.com/download/

1. windows

1.1 安装客户端

下载 windows 客户端并进行安装。

1.2 安装注册表

访问 https://headscale.amjun.com/windows,可以看见配置的教程。

提示需要修改注册表,这里可以直接 curl https://headscale.amjun.com/windows/tailscale.reg 下载文件后,双击运行文件进行安装即可。

1.3 登录

在 tailscale 的安装目录下使用 cmd 打开,输入命令:

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

这里的 authkey 是第四步生成的,然后在服务器使用命令查看。

docker exec -it headscale headscale nodes ls

2. linux

2.1 脚本安装

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

这里仅仅安装方式不同,登录的命令完全一样。

2.2 docker安装

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

执行以下命令:

# 防止探测ip6tablesudo modprobe ip6table_filter

3. 安卓

3.1 安装并配置

目前官方暂不可以自定义登录链接,需要下载可以自定义登录链接的安卓客户端,阿蛮君这里提供了一份可以使用的客户端,链接放在后面。

安装后,点击右上角三个设置自定义登录地址:

Docker 搭建 headscale 异地组网完整教程

点击保存并重启,再点击 sign in,将看见如下内容。

Docker 搭建 headscale 异地组网完整教程

3.2 服务端注册

根据提示在服务端运行命令:

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

注意这里的 USERNAME 需要修改为自己刚刚创建的用户名。

下载地址

 此处含有隐藏内容,请提交评论并审核通过刷新后即可查看!

提醒:本文发布于149天前,文中所关联的信息可能已发生改变,请知悉!


一、内网穿透简述

由于国内网络环境问题, 普遍家庭用户宽带都没有分配到公网 IP(我有固定公网 IP, 嘿嘿); 这时候一般我们需要从外部访问家庭网络时就需要通过一些魔法手段, 比如 VPN、远程软件 (向日葵…) 等; 但是这些工具都有一个普遍存在的问题: 慢 + 卡!

1.1、传统星型拓扑

究其根本因素在于, 在传统架构中如果两个位于多层 NAT(简单理解为多个路由器)之后的设备, 只能通过一些中央 (VPN / 远程软件) 中转服务器进行链接, 这时网络连接速度取决于中央服务器带宽和速度; 这种网络架构我这里简称为: 星型拓扑

从这张图上可以看出, 你的 “工作笔记本” 和 “家庭 NAS” 之间通讯的最大传输速度为 Up/Down: 512K/s; 因为流量经过了中央服务器中转, 由于网络木桶效应存在, 即使你两侧的网络速度再高也没用, 整体的速度取决于这个链路中最低的一个设备网速而不是你两端的设备.

在这种拓扑下, 想提高速度只有一个办法: 加钱! 在不使用 “钞能力” 的情况下, 普遍免费的软件提供商不可能给予过多的资源来让用户白嫖, 而自己弄大带宽的中央服务器成本又过高.

1.2、NAT 穿透与网状拓扑

本部分只做简述, 具体里面有大量细节和规则可能描述不准确, 细节部分推荐阅读 How NAT traversal works.

既然传统的星型拓扑有这么多问题, 那么有没有其他骚操作可以解决呢? 答案是有的, 简单来说就是利用 NAT 穿透原理. NAT 穿透简单理解如下: 在 A 设备主动向 B 设备发送流量后, 整个链路上的防火墙会短时间打开一个映射规则, 该规则允许 B 设备短暂的从这个路径上反向向 A 设备发送流量. 更通俗的讲大概就是所谓的: “顺着网线来打你”

搞清了这个规则以后, 我们就可以弄一台 “低配” 的中央服务器, 让中央服务器来帮助我们协商两边的设备谁先访问谁 (或者说是访问规则); 两个设备一起无脑访问对方, 然后触发防火墙的 NAT 穿透规则 (防火墙打开), 此后两个设备就可以不通过中央服务器源源不断的通讯了. 在这种架构下我们的设备其实就组成了一个非标准的网状拓扑:

在这种拓扑下, 两个设备之间的通讯速度已经不在取决于中央服务器, 而是直接取决于两端设备的带宽, 也就是说达到了设备网络带宽峰值. 当然 NAT 穿透也不是百分百能够成功的, 在复杂网络情况下有些防火墙不会按照预期工作或者说有更严格的限制; 比如 IP、端口、协议限制等等, 所以为了保证可靠性可以让中央服务器中转做后备方案, 即尽量尝试 NAT 穿透, 如果不行走中央服务器中继.

二、Tailscale 简介

第一部分是为了方便读者理解一些新型内网穿透的大致基本原理, 现在回到本文重点: Tailscale

Tailscale 就是一种利用 NAT 穿透 (aka: P2P 穿透) 技术的 VPN 工具. Tailscale 客户端等是开源的, 不过遗憾的是中央控制服务器目前并不开源; Tailscale 目前也提供免费的额度给用户使用, 在 NAT 穿透成功的情况下也能保证满速运行.

不过一旦无法 NAT 穿透需要做中转时, Tailscale 官方的服务器由于众所周知的原因在国内访问速度很拉胯; 不过万幸的是开源社区大佬们搓了一个开源版本的中央控制服务器 (Headscale), 也就是说: 我们可以自己搭建中央服务器啦, 完全 “自主可控” 啦.

三、搭建 Headscale 服务端

以下命令假设安装系统为 Ubuntu 22.04, 其他系统请自行调整.

3.1、宿主机安装

Headscale 是采用 Go 语言编写的, 所以只有一个二进制文件, 在 Github Releases 页面下载最新版本即可:

# 下载
wget https://github.com/juanfont/headscale/releases/download/v0.16.4/headscale_0.16.4_linux_amd64 -O /usr/local/bin/headscale

# 增加可执行权限
chmod +x /usr/local/bin/headscale

复制

下载完成后为了安全性我们需要创建单独的用户和目录用于 Headscale 运行

# 配置目录
mkdir -p /etc/headscale

# 创建用户
useradd \ --create-home \ --home-dir /var/lib/headscale/ \ --system \ --user-group \ --shell /usr/sbin/nologin \
 headscale

复制

为了保证 Headscale 能持久运行, 我们需要创建 SystemD 配置文件

# /lib/systemd/system/headscale.service[Unit]Description=headscale controller
After=syslog.target
After=network.target[Service]Type=simple
User=headscale
Group=headscale
ExecStart=/usr/local/bin/headscale serve
Restart=always
RestartSec=5# Optional security enhancements
NoNewPrivileges=yes
PrivateTmp=yes
ProtectSystem=strict
ProtectHome=yes
ReadWritePaths=/var/lib/headscale /var/run/headscale
AmbientCapabilities=CAP_NET_BIND_SERVICERuntimeDirectory=headscale[Install]WantedBy=multi-user.target

复制

3.2、配置 Headscale

安装完成以后我们需要在 /etc/headscale/config.yaml 中配置 Headscale 的启动配置, 以下为配置样例以及解释 (仅列出重要配置):

---# 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 configdb_type: sqlite3db_path: /var/lib/headscale/db.sqlite

# 使用自动签发证书是的域名tls_letsencrypt_hostname: ""# 使用自定义证书时的证书路径tls_cert_path: ""tls_key_path: ""# 是否让客户端使用随机端口, 默认使用 41641/UDPrandomize_client_port: false

复制

3.3、证书及反向代理

可能很多人和我一样, 希望使用 ACME 自动证书, 又不想占用 80/443 端口, 又想通过负载均衡器负载, 配置又看的一头雾水; 所以这里详细说明一下 Headscale 证书相关配置和工作逻辑:

  • 1、Headscale 的 ACME 只支持 HTTP/TLS 挑战, 所以使用后必定占用 80/443

  • 2、当配置了 tls_letsencrypt_hostname 时一定会进行 ACME 申请

  • 3、在不配置 tls_letsencrypt_hostname 时如果配置了 tls_cert_path 则使用自定义证书

  • 4、两者都不配置则不使用任何证书, 服务端监听 HTTP 请求

  • 5、三种情况下 (ACME 证书、自定义证书、无证书) 主服务都只监听 listen_addr 地址, 与 server_url 没半毛钱关系

  • 6、只有在有证书 (ACME 证书或自定义证书) 的情况下或者手动开启了 grpc_allow_insecure 才会监听 grpc 远程调用服务

综上所述, 如果你想通过 Nginx、Caddy 反向代理 Headscale, 则你需要满足以下配置:

  • 1、删除掉 tls_letsencrypt_hostname 或留空, 防止 ACME 启动

  • 2、删除掉 tls_cert_path 或留空, 防止加载自定义证书

  • 3、server_url 填写 Nginx 或 Caddy 被访问的 HTTPS 地址

  • 4、在你的 Nginx 或 Caddy 中反向代理填写 listen_addr 的 HTTP 地址

Nginx 配置参考 官方 Wiki, Caddy 只需要一行 reverse_proxy headscale:8080 即可 (地址自行替换).

至于 ACME 证书你可以通过使用 acme.sh 自动配置 Nginx 或者使用 Caddy 自动申请等方式, 这些已经与 Headscale 无关了, 不在本文探讨范围内.

3.4、内网地址分配

请尽量不要将 ip_prefixes 配置为默认的 100.64.0.0/10 网段, 如果你有兴趣查询了该地址段, 那么你应该明白它叫 CGNAT; 很不幸的是例如 Aliyun 底层的 apt 源等都在这个范围内, 可能会有一些奇怪问题.

3.5、启动 Headscale

在处理完证书等配置后, 只需要愉快的启动一下即可:

# 开机自启动 并 立即启动
systemctl enable headscale --now

复制

再啰嗦一嘴, 如果你期望使用 Headscale ACME 自动申请证书, 你的关键配置应该像这样:

server_url: https://your.domain.comlisten_addr: 0.0.0.0:443tls_letsencrypt_hostname: "your.domain.com"tls_cert_path: ""tls_key_path: ""

复制

如果你期望使用自定义证书, 则你的关键配置应该像这样:

server_url: https://your.domain.comlisten_addr: 0.0.0.0:443tls_letsencrypt_hostname: ""tls_cert_path: "/path/to/cert"tls_key_path: "/path/to/key"

复制

如果你期望使用负载均衡器, 那么你的关键配置应该像这样:

server_url: https://your.domain.comlisten_addr: 0.0.0.0:8080tls_letsencrypt_hostname: ""tls_cert_path: ""tls_key_path: ""

复制

在使用负载均衡器配置时, 启动后会有一行警告日志, 忽略即可:

2022-09-18T07:57:36Z WRN Listening without TLS but ServerURL does not start with http://

复制

3.6、Docker Compose 安装

Compose 配置样例文件如下:

# docker-compose.yamlversion: "3.9"services:
  headscale:
    container_name: headscale    image: headscale/headscale:0.16.4
    ports:
      - "8080:8080"
    cap_add:
      - NET_ADMIN
      - NET_RAW
      - SYS_MODULE
    sysctls:
      - net.ipv4.ip_forward=1
      - net.ipv6.conf.all.forwarding=1
    restart: always    volumes:
      - ./conf:/etc/headscale      - data:/var/lib/headscale    command: ["headscale", "serve"]volumes:
  config:
  data:

复制

你需要在与 docker-compose.yaml 同级目录下创建 conf 目录用于存储配置文件; 具体配置请参考上面的配置详解等部分, 最后不要忘记你的 Compose 文件端口映射需要和配置文件保持一致.

四、客户端安装

对于客户端来说, Tailscale 提供了多个平台和发行版的预编译安装包, 并且部分客户端直接支持设置自定义的中央控制服务器.

4.1、Linux 客户端

Linux 用户目前只需要使用以下命令安装即可:

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

复制

默认该脚本会检测相关的 Linux 系统发行版并使用对应的包管理器安装 Tailscale, 安装完成后使用以下命令启动:

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

复制

关于选项设置:

  • --login-server: 指定使用的中央服务器地址 (必填)

  • --advertise-routes: 向中央服务器报告当前客户端处于哪个内网网段下, 便于中央服务器让同内网设备直接内网直连 (可选的) 或者将其他设备指定流量路由到当前内网(可选)

  • --accept-routes: 是否接受中央服务器下发的用于路由到其他客户端内网的路由规则 (可选)

  • --accept-dns: 是否使用中央服务器下发的 DNS 相关配置 (可选, 推荐关闭)

启动完成后, tailscale 将会卡住, 并打印一个你的服务器访问地址; 浏览器访问该地址后将会得到一条命令:

注意: 浏览器上显示的命令需要在中央控制服务器执行 (Headscale), NAMESAPCE 位置应该替换为一个具体的 Namespace, 可以使用以下命令创建 Namespace (名字随意) 并让设备加入:

在 Headscale 服务器上执行命令成功后客户端命令行在稍等片刻便会执行完成, 此时该客户端已经被加入 Headscale 网络并分配了特定的内网 IP; 多个客户端加入后在 NAT 穿透成功时就可以互相 ping 通, 如果出现问题请阅读后面的调试细节, 只要能注册成功就算是成功了一半, 暂时不要慌.

4.2、MacOS 客户端

MacOS 客户端安装目前有两种方式, 一种是使用标准的 AppStore 版本 (好像还有一个可以直接下载的), 需要先设置服务器地址然后再启动 App:

首先访问你的 Headscale 地址 https://your.domain.com/apple:

复制倒数第二行命令到命令行执行 (可能需要 sudo 执行), 然后去 AppStore 搜索 Hailscale 安装并启动; 启动后会自动打开浏览器页面, 与 Linux 安装类似, 复制命令到 Headscale 服务器执行即可 (Namespace 创建一次就行).

第二种方式也是比较推荐的方式, 直接编译客户端源码安装, 体验与 Linux 版本一致:

# 安装 go
brew install go

# 编译命令行客户端
go install tailscale.com/cmd/tailscale{,d}@main

# 安装为系统服务
sudo tailscaled install-system-daemon

复制

安装完成后同样通过 tailscale up 命令启动并注册即可, 具体请参考 Linux 客户端安装部分.

4.3、其他客户端

关于 Windows 客户端大致流程就是创建一个注册表, 然后同样安装官方 App 启动, 接着浏览器复制命令注册即可. 至于移动端本人没有需求, 所以暂未研究. Windows 具体的安装流程请访问 https://your.domain.com/windows 地址查看 (基本与 MacOS AppStore 版本安装类似).

五、中继服务器搭建

在上面的 Headscale 搭建完成并添加客户端后, 某些客户端可能无法联通; 这是由于网络复杂情况下导致了 NAT 穿透失败; 为此我们可以搭建一个中继服务器来进行传统的星型拓扑通信.

5.1、搭建 DERP Server

首先需要注意的是, 在需要搭建 DERP Server 的服务器上, 请先安装一个 Tailscale 客户端并注册到 Headscale; 这样做的目的是让搭建的 DERP Server 开启客户端认证, 否则你的 DERP Server 可以被任何人白嫖.

目前 Tailscale 官方并未提供 DERP Server 的安装包, 所以需要我们自行编译安装; 在编译之前请确保安装了最新版本的 Go 语言及其编译环境.

# 编译 DERP Server
go install tailscale.com/cmd/derper@main

# 复制到系统可执行目录
mv ${GOPATH}/bin/derper /usr/local/bin

# 创建用户和运行目录
useradd \        --create-home \        --home-dir /var/lib/derper/ \        --system \        --user-group \        --shell /usr/sbin/nologin \
        derper

复制

接下来创建一个 SystemD 配置:

# /lib/systemd/system/derper.service[Unit]Description=tailscale derper server
After=syslog.target
After=network.target[Service]Type=simple
User=derper
Group=derper
ExecStart=/usr/local/bin/derper -c=/var/lib/derper/private.key -a=:8989 -stun-port=3456 -verify-clients
Restart=always
RestartSec=5# Optional security enhancements
NoNewPrivileges=yes
PrivateTmp=yes
ProtectSystem=strict
ProtectHome=yes
ReadWritePaths=/var/lib/derper /var/run/derper
AmbientCapabilities=CAP_NET_BIND_SERVICERuntimeDirectory=derper[Install]WantedBy=multi-user.target

复制

最后使用以下命令启动 Derper Server 即可:

systemctl enable derper --now

复制

注意: 默认情况下 Derper Server 会监听在 :443 上, 同时会触发自动 ACME 申请证书. 关于证书逻辑如下:

  • 1、如果不指定 -a 参数, 则默认监听 :443

  • 2、如果监听 :443 并且未指定 --certmode=manual 则会强制使用 --hostname 指定的域名进行 ACME 申请证书

  • 3、如果指定了 --certmode=manual 则会使用 --certmode 指定目录下的证书开启 HTTPS

  • 4、如果指定了 -a 为非 :443 端口, 且没有指定 --certmode=manual 则只监听 HTTP

如果期望使用 ACME 自动申请只需要不增加 -a 选项即可 (占用 443 端口), 如果期望通过负载均衡器负载, 则需要将 -a 选项指定到非 443 端口, 然后配置 Nginx、Caddy 等 LB 软件即可. 最后一点 stun 监听的是UDP端口, 请确保防火墙打开此端口.

5.2、配置 Headscale

在创建完 Derper 中继服务器后, 我们还需要配置 Headscale 来告诉所有客户端在必要时可以使用此中继节点进行通信; 为了达到这个目的, 我们需要在 Headscale 服务器上创建以下配置:

# /etc/headscale/derper.yamlregions:
  901:
    regionid: 901
    regioncode: private-derper    regionname: "My Private Derper Server"
    nodes:
      - name: private-derper        regionid: 901
        # 自行更改为自己的域名        hostname: derper.xxxxx.com
        # Derper 节点的 IP
        ipv4: 123.123.123.123
        # Derper 设置的 STUN 端口        stunport: 3456

复制

在创建好基本的 Derper Server 节点信息配置后, 我们需要调整主配置来让 Headscale 加载:

derp:
  server:
    # 这里关闭 Headscale 默认的 Derper Server    enabled: false
  # urls 留空, 保证不加载官方的默认 Derper  urls: []
  # 这里填写 Derper 节点信息配置的绝对路径  paths:
  - /etc/headscale/derper.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

复制

接下来重启 Headscale 并重启 client 上的 tailscale 即可看到中继节点:

~ ❯❯❯ tailscale netcheckReport:
        * UDP: true
        * IPv4: yes, 124.111.111.111:58630
        * IPv6: no, but OS has support        * MappingVariesByDestIP: false
        * HairPinning: false
        * PortMapping: UPnP, NAT-PMP, PCP
        * CaptivePortal: true
        * Nearest DERP: XXXX Derper Server        * DERP latency:
                - XXXX: 10.1ms  (XXXX Derper Server)

复制

到此中继节点搭建完成.

5.3、Docker Compose 安装

目前官方似乎也没有提供 Docker 镜像, 我自己通过 GitHub Action 编译了一个 Docker 镜像, 以下是使用此镜像的 Compose 文件样例:

version: '3.9'services:
  derper:
    image: mritd/derper    container_name: derper    restart: always    ports:
      - "8080:8080/tcp"
      - "3456:3456/udp"
    environment:
      TZ: Asia/Shanghai    volumes:
      - /etc/timezone:/etc/timezone      - /var/run/tailscale:/var/run/tailscale      - data:/var/lib/derpervolumes:
  data:

复制

该镜像默认开启了客户端验证, 所以请确保 /var/run/tailscale 内存在已加入 Headscale 成功的 tailscaled 实例的 sock 文件. 其他具体环境变量等参数配置请参考 Earthfile.

六、客户端网络调试

在调试中继节点或者不确定网络情况时, 可以使用一些 Tailscale 内置的命令来调试网络.

6.1、Ping 命令

tailscale ping 命令可以用于测试 IP 连通性, 同时可以看到时如何连接目标节点的. 默认情况下 Ping 命令首先会使用 Derper 中继节点通信, 然后尝试 P2P 连接; 一旦 P2P 连接成功则自动停止 Ping:

~ ❯❯❯ tailscale ping 10.24.0.5pong from k8s13 (10.24.0.5) via DERP(XXXXX) in 14ms
pong from k8s13 (10.24.0.5) via DERP(XXXXX) in 13ms
pong from k8s13 (10.24.0.5) via DERP(XXXXX) in 14ms
pong from k8s13 (10.24.0.5) via DERP(XXXXX) in 12ms
pong from k8s13 (10.24.0.5) via DERP(XXXXX) in 12ms
pong from k8s13 (10.24.0.5) via 3.4.170.23:2495 in 9ms

复制

由于其先走 Derper 的特性也可以用来测试 Derper 连通性.

6.2、Status 命令

通过 tailscale status 命令可以查看当前节点与其他对等节点的连接方式, 通过此命令可以查看到当前节点可连接的节点以及是否走了 Derper 中继:

~ ❯❯❯ tailscale status10.24.0.8       xmac                 kovacs       macOS   -
                alivpn               kovacs       linux   active; direct 4.3.4.5:41644, tx 1264 rx 944
                aliyun               kovacs       linux   -
                bob                  kovacs       macOS   offline
                bob-imac             kovacs       macOS   offline
                company              kovacs       linux   active; direct 114.114.114.114:41642, tx 1296 rx 880

复制

6.3、NetCheck 命令

有些情况下我们可以确认是当前主机的网络问题导致没法走 P2P 连接, 但是我们又想了解一下当前的网络环境; 此时可以使用 tailscale netcheck 命令来检测当前的网络环境, 此命令将会打印出详细的网络环境报告:

~ ❯❯❯ tailscale netcheck2022/10/19 21:15:27 portmap: [v1] Got PMP response; IP: 123.123.123.123, epoch: 2976712022/10/19 21:15:27 portmap: [v1] Got PCP response: epoch: 2976712022/10/19 21:15:27 portmap: [v1] UPnP reply {Location:http://192.168.11.1:39735/rootDesc.xml Server:AsusWRT/386 UPnP/1.1 MiniUPnPd/2.2.0 USN:uuid:23345-2380-45f5-34534-04421abwb7cf0::urn:schemas-upnp-org:device:InternetGatewayDevice:1}, "HTTP/1.1 200 OK\r\nCACHE-CONTROL: max-age=120\r\nST: urn:schemas-upnp-org:device:InternetGatewayDevice:1\r\nUSN: uuid:34564645-2380-45f5-b069-sdfdght3245....."2022/10/19 21:15:27 portmap: UPnP meta changed: {Location:http://192.168.11.1:39735/rootDesc.xml Server:AsusWRT/386 UPnP/1.1 MiniUPnPd/2.2.0 USN:uuid:23345-2380-45f5-b069-04421abwb7cf0::urn:schemas-upnp-org:device:InternetGatewayDevice:1}Report:
        * UDP: true
        * IPv4: yes, 123.123.123.123:5935
        * IPv6: no, but OS has support        * MappingVariesByDestIP: false
        * HairPinning: true
        * PortMapping: UPnP, NAT-PMP, PCP
        * CaptivePortal: true
        * Nearest DERP: XXXXX Aliyun        * DERP latency:
                - XXXXX: 9.5ms   (XXXXX Aliyun)
                - XXXXX: 53.1ms  (XXXXX BandwagonHost)

复制

七、其他补充

7.1、某些代理工具兼容性

MacOS 下使用一些增强代理工具时, 如果安装 App Store 的官方图形化客户端, 则可能与这些软件冲突, 推荐使用纯命令行版本并添加进程规则匹配 tailscaletailscaled 两个进程, 让它们始终走 DIRECT 规则即可.

7.2、MacOS 下 CPU 占用突然起飞

在使用一些网络代理工具时, 网络工具会设置默认路由; 这可能导致 tailscaled 无法获取到默认路由接口, 然后进入死循环并把 CPU 吃满, 同时会与 Derper 服务器产生大量上传流量. 截止本文发布此问题已修复, 请使用mian分支编译安装, 具体见 ISSUE/5879.

7.3、阿里云安装客户端后无法更新软件

Tailscale 默认使用 CGNAT(100.64.0.0/10) 网段作为内部地址分配网段, 目前 Tailscale 仅允许自己的接口使用此网段, 不巧的是阿里云的 DNS、Apt 源等也采用此网段. 这会导致阿里云服务器安装客户端后 DNS、Apt 等不可用, 解决方案目前只能修改源码删除掉这两个 DROP 规则并重新编译.

7.4、开启路由转发

大多数时候我们可能并不会在每个服务器上都安装 Tailscale 客户端, 通常只安装 2、3 台, 然后想通过这两三台转发该内网的所有流量. 此时你需要

  • 启动 tailscale 时设置正确的路由提示 --advertise-routes=192.168.1.0/24 来告诉 Headscale 服务器 “我这个节点可以转发这些地址的路由”

  • 其他节点启动时需要增加 --accept-routes=true 选项来声明 “我接受外部其他节点发布的路由”

以上两个选项配置后, 只需要 Headscale 服务器上使用 headscale node route enable -a -i XX(ID) 开启即可. 开启后目标节点 (ID) 的路由就会发布到接受外部路由的所有节点, 想要关闭的话去掉 -a 即可.

7.5、其他问题

以上也只是我个人遇到的一些问题, 如果有其他问题推荐先搜索然后查看 ISSUE, 最后不行可以看看源码. 目前来说 Tailscale 很多选项很模糊, 可能需要阅读源码以后才能知道到底应该怎么做.

链接:https://mritd.com/2022/10/19/use-headscale-to-build-a-p2p-network/


需求

  • 办公需求:
    设备:
    1、synology DS918+
    2、macbook pro m1
    3、mac mini
    问题:访问家里nas慢的问题,及工作效率能快速访问的问题

  • 公司跨机房需求:
    1、erp金蝶系统-sqlServer服务-公司内部机房
    2、采购系统-mongodb服务-阿里云服务器
    问题:采购系统上访问ERP速度慢的问题,及双流cdc的需求

设想这样一个问题:在北京和上海各有一台局域网的机器(例如一台是家里的台式机,一 台是连接到星巴克 WiFi 的笔记本),二者都是私网 IP 地址,但可以访问公网, 如何让这两台机器通信呢

既然二者都能访问公网,那最简单的方式当然是在公网上架设一个中继服务器: 两台机器分别连接到中继服务,后者完成双向转发。这种方式显然有很大的性能开销,而 且中继服务器很容易成为瓶颈。

有没有办法不用中继,让两台机器直接通信呢

那就是:跨过公网(互联网)实现端到端直连。

TailScale 是什么, Headscale又是什么

TailScale

TailScale 你可以理解为 VPN,或者说 Wireguard 外面包了一层壳子。它可以将一些设备连接起来,形成一个虚拟局域网。一个很简单的例子,你可以在星巴克里,读取家里任意电脑上的文件。

比如最常见的需求就是,公司有一个内网办公环境,当你外出办公时,也希望你的电脑能够接入办公网络。 因为外网的机器和内网的机器不能互联,所以一般会有一个中心服务器, 所有的子节点都和中心服务器相连,然后中心服务器转发所有的流量。
5Z0qxl

这样做的缺点显而易见,首先是中心服务器(hub)会成为瓶颈。 其次,某种极端情况下,如果节点 A 和 节点 B 距离非常近,但是都离 hub 很远, 这样就会导致非常高的延迟。
Rje9yw

那么我们就会想,能不能让节点间直接互联呢? 这就是 mesh VPN,其实现就是 wireguard。
pQ8X8e
wireguard 的每一个节点都会存储其他所有节点的信息,并且和其他所有的节点都建立 tls 连接。 如果涉及到内网穿透的话,那么你需要找到一台处于网关位置的节点(内外网都可达),将其设置为 coordinator, 扮演类似于 hub 的角色, 分发穿透内外网的流量。

wireguard 的缺点在于:

  • 配置比较繁琐

  • 维护也比较困难,增删节点都需要改动所有节点的配置

基于上述这些痛点,TailScale 做了一些改进:

1、在原有的 ICE、STUN 等 UDP 协议外,实现了 DERP TCP 协议来实现 NAT 穿透
2、基于公网的 coordinator 服务器下发 ACL 和配置,实现节点动态更新
3、通过第三方(如 Google) SSO 服务生成用户和私钥,实现身份认证

对我来说 Tailscale 相对于 Wireguard 最大的优势有 3 点:
1、配置简单
2、支持 P2P 和中继自动切换
3、支持自建中继节点

作为一种搭建虚拟局域网的工具,相比于传统VPN而言,所有节点之间都可以进行P2P连接,也就是全互联模式,效率更高。

为了基于wireguard实现更完美的VPN工具,现在已经出现了很多项目,如Netmaker,通过可视化界面来配置全互联模式,并支持UDP打洞、多租户等高端功能,几乎适配所有平台。然而现实世界是复杂的,无法保证所有的NAT都能打洞成功,而且Netmaker目前不支持fallback机制,如打洞失败,无法fallback中继节点。而Tailscale支持fallback,可以尽最大努力实现全互联模式,部分节点即使打洞不成功,也可通过中继节点在虚拟局域网内畅通无阻。

简而言之,我们可以认为 TailScale 是更为易用版的、功能封装更为完善的 wireguard。

Headscale

Headscale看名字就知道是和 Tailscale 对着干的,Tailscale 的客户端是不收费的,服务端是不开源的,超过 20 个设备就需要付费了,并且Tailscale的服务不在国内,我们不可能把服务端安全的交给Tailscale,私有自建才是出入。Headscale 是个第三方开源版本的 Tailscale 的服务端,除了「网站界面」之外该有的功能都有,因此我们使用Headscale自建私有服务。

解决方案

所以本次的方案:
1、阿里云服务器 部署 Headscale 服务端
2、自己的 Mac 和 Nas 上,使用 Tailscale 作为客户端

或公司,mongodb所在的服务器与sqlServer所在的服务器组网

服务端

Docker 部署

1
2
3
4
5
6
7
8
9
10
11
12
version: '3.5'
services:
 headscale:
   image: headscale/headscale:latest-alpine
   container_name: headscale
   volumes:
     - ./config:/etc/headscale
     - ./data/data:/var/lib/headscale
   ports:
     - 8080:8080
   command: headscale serve
   restart: unless-stopped

手动新建一下配置文件,放入./config

1
wget https://github.com/juanfont/headscale/raw/main/config-example.yaml -O config.yaml

编辑一下它:

  • server_url 这个东西是一个简单的「HTTP 设备认证页面」,后面需要暴露在公网上,其他设备如果想加入到你的网络里面,需要访问这个地址,拿到一个 Token。有域名的话推荐用域名+nginx/caddy 反向代理没域名的话用 ip+端口。

  • ip_prefixes 可以根据自己喜好来改,留默认的当然也行

docker-compose up -d启动 docker
下一步,创建一个「租户」,你可以理解为一个用户。进到 headscale 的 docker 里面,执行

1
headscale namespaces create SOME_NAME

SOME_NAME随意替换

客户端

并非全部客户端都支持(或全部支持)将 Headscale 作为后端,目前适配情况如下:

操作系统支持情况解决方案
Linux原生支持
Windows修改注册表
macOS需要添加描述文件
Android
iOS目前不支持

Mac 端:AppStore 版客户端

由于是使用的「非官方版控制器」,所以我们需要稍微 hack 一下,将软件里面默认的「tailscale 官方控制服务器地址」改为我们自己搭建的 Headscale 地址。

访问 http://server_url/apple,下载并安装一个描述文件。

然后打开 Tailscale,点击登录,会看到一个英文界面,里面有一行命令

1
headscale -n NAMESPACE nodes register --key SOME_HEX_VALUE

将里面的 NAMESPACE 换成你创建的租户名称,然后去服务端 docker 里面,执行它。你就会发现,你的 mac 已经登录成功了。

Linux端:Docker 版客户端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
version: '3.3'
services:
   tailscaled:
       container_name: tailscaled
       image: tailscale/tailscale
       network_mode: host
       privileged: true
       restart: always
       cap_add:
           - net_admin
           - sys_module
       volumes:
           - ./lib:/var/lib
           - /dev/net/tun:/dev/net/tun
       command: sh -c "mkdir -p /var/run/tailscale && ln -s /tmp/tailscaled.sock /var/run/tailscale/tailscaled.sock && tailscaled"

启动容器后,需要进入容器,输入这个东西进行登录:

1
2
tailscale up --login-server=http://server_url --accept-routes=true --accept-dns=false

如果没问题,那么会提示你访问一个网址,拿到 Token,回到 Server 端进行登录就好。

synology

Access Synology NAS from anywhere
Tailscale Packages

tailscale up 参数

  • –hostname 设置名称

  • –accept-routes 接受服务端配置的路由

  • –accept-dns 推荐将 DNS 功能关闭,因为它会覆盖系统的默认 DNS

  • –advertise-routes 申请路由到该节点,Tailscale 实现「出口节点」,即打通局域网内部的路由访问,这个网段的所有设备都可以被访问

  • –advertise-exit-node 可以建立数据导向节点exit node,即本机访问互联网皆通过此节点 bolean

  • –exit-node 指定出口节点,导向所有流量经这出口节点

headscale命令

通过服务端授权客户端

1
headscale -n default nodes register --key 905cf165204800247fbd33989dbc22be95c987286c45aac3033937041150d846

查看注册的节点

1
2
3
4
headscale nodes list

ID | Name | NodeKey | Namespace | IP addresses | Ephemeral | Last seen | Online | Expired
1 | coredns | [Ew3RB] | default | 10.1.0.1 | false | 2022-03-20 09:08:58 | online | no

通过 Pre-Authkeys 接入

前面的接入方法都需要服务端同意,步骤比较烦琐,其实还有更简单的方法,可以直接接入,不需要服务端同意。

首先在服务端生成 pre-authkey 的 token,有效期可以设置为 24 小时:

1
headscale preauthkeys create -e 24h -n default

查看已经生成的 key:

1
headscale -n default preauthkeys list

现在新节点就可以无需服务端同意直接接入了:

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

打通局域网

WZtD67
假设你的家庭内网有一台 Linux 主机(比如 Nas)安装了 Tailscale 客户端,我们希望其他 Tailscale 客户端可以直接通过家中的局域网 IP(例如 192.168.100.0/24) 访问家庭内网的任何一台设备。

官方文档:Subnet routers and traffic relay nodes
群辉具体操作见:headscale组网打通群辉局域网内部访问

linux 配置方法很简单,首先需要设置 IPv4 与 IPv6 路由转发:

1
2
3
echo 'net.ipv4.ip_forward = 1' | tee /etc/sysctl.d/ipforwarding.conf
echo 'net.ipv6.conf.all.forwarding = 1' | tee -a /etc/sysctl.d/ipforwarding.conf
sysctl -p /etc/sysctl.d/ipforwarding.conf

客户端修改注册节点的命令,在原来命令的基础上加上参数 --advertise-routes=192.168.100.0/24

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

在 Headscale 端查看路由,可以看到相关路由是关闭的。

1
2
3
4
5
6
7
headscale nodes list|grep nas
6 | nas | [7LdVc] | default | 10.1.0.6 | false | 2022-03-20 15:50:46 | online | no

headscale routes list -i 6
Route | Enabled

192.168.100.0/24 | false

开启路由:

1
2
3
headscale routes enable -i 6 -r "192.168.100.0/24"
Route | Enabled
192.168.100.0/24 | true

其他节点查看路由结果:

1
2
ip route
192.168.100.0/24 dev tailscale0

现在你在任何一个 Tailscale 客户端所在的节点都可以 ping 通家庭内网的机器了

为了能让headscale稳定,我们可以自建中继服务器
headscale之DERP中继服务器自建