tailscale自建headscale和derp中继

tailscale自建headscale和derp中继

Tailscale 官方的 DERP 中继服务器全部在境外,在国内的网络环境中不一定能稳定连接,所以有必要建立自己的 DERP 服务器的。

准备工作:

  • 需要有自己的云服务器,本示例为阿里云轻量服务器
  • 需要有自己的域名,本示例为阿里云域名
  • 云服务器已经安装 docker 运行环境

准备两个子域名:

  • derper.example.com
  • headscale.example.com

在这里插入图片描述

创建docker网络

创建名为headscale的docker网络,用于不同容器直接通过名称互访。

docker network create headscale

部署tailscale客户端

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

为derper容器提供tailscale.sock套接字,用于后续部署derp时指定-v tailscale:/var/run/tailscale参数.

docker run -d --name tailscaled --restart always \-v tailscale:/var/run/tailscale \-v /var/lib:/var/lib \-v /dev/net/tun:/dev/net/tun \--network=host --privileged \tailscale/tailscale tailscaled

部署derp中继服务器

docker run -d --name derper \--restart always \-p 8443:8443 -p 3478:3478 \-e DERP_ADDR=:8443 \-e DERP_DOMAIN=derper.example.com \-e DERP_CERT_MODE=letsencrypt \-e DERP_VERIFY_CLIENTS=true \--net headscale \-v tailscale:/var/run/tailscale \docker.io/fredliang/derper:latest

参数说明:

  • 3478 端口不要修改
  • 8443 端口可以按照自己的喜好来改,DERP_ADDR 变量后面的端口需要与该端口保持一致,冒号不能丢
  • DERP_VERIFY_CLIENTS=true,DERP 会验证连接的客户端是否与本机的客户端为同一个账号下,从而避免其他客户端白嫖服务器
  • -v tailscale:/var/run/tailscale 将tailscale.sock套接字接口挂载进容器中

浏览器访问derper域名:https://derper.example.com/ ,显示以下内容,说明derp服务端运行正常:

在这里插入图片描述

部署headscale

创建headscale目录

mkdir -p /data/headscale/config
touch /data/headscale/config/db.sqlite

下载headscale配置文件

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

修改headscale配置文件,以下仅显示修改部分,其他保持默认

$ vim /data/headscale/config/config.yaml
server_url: https://headscale.example.com
listen_addr: 0.0.0.0:8080
metrics_listen_addr: 0.0.0.0:9090
private_key_path: /etc/headscale/private.key
noise:private_key_path: /etc/headscale/noise_private.key
derp:urls:#  - https://controlplane.tailscale.com/derpmap/defaultpaths:- /etc/headscale/derp.yaml
dns_config:override_local_dns: truenameservers:- 223.5.5.5- 223.6.6.6

创建derp配置文件

$ vim /data/headscale/config/derp.yaml 
regions:900:regionid: 900regioncode: aliyunregionname: aliyund-derpnodes:- name: 900aregionid: 900hostname: derper.example.comstunport: 3478stunonly: falsederpport: 8443

配置说明:

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

部署headscale

docker run -d --name headscale \--restart always \-p 8080:8080 -p 9090:9090 \--net headscale \-v /data/headscale/config:/etc/headscale \headscale/headscale:latest-alpine headscale serve

部署caddy-server

创建caddy配置文件目录

mkdir -p /data/caddy

创建caddy配置文件

cat >/data/caddy/Caddyfile<<EOF
https://headscale.cloudcele.com {reverse_proxy * http://headscale:8080
}
https://derper.cloudcele.com {reverse_proxy * http://derper:8443
}
EOF

部署caddy-server

docker run -d --name caddy \--restart always \-p 80:80 -p 443:443 \--net headscale \-v /data/caddy/Caddyfile:/etc/caddy/Caddyfile \docker.io/caddy/caddy:latest

headscale服务端配置

创建一个命名空间:

docker exec headscale \headscale namespaces create defaultns

生成用于客户端注册的认证key

docker exec headscale \headscale --namespace defaultns preauthkeys create --reusable --expiration 24h

tailscale 注册

docker exec -it tailscaled \tailscale up --accept-dns=false --accept-routes=true \--auth-key=90e20f91f2497c518144254b0fe66cc0619ae5571e8a2e5c \--force-reauth --login-server=https://headscale.example.com --reset

windows客户端注册

1、安装tailscale windows客户端

2、浏览器访问以下链接,下载页面中的reg注册表文件并执行

https://headscale.example.com/windows

点击下载页面中的reg注册表文件并执行
在这里插入图片描述

3、注册客户端到headscale控制端

打开CMD执行以下命令

tailscale up --accept-dns=false --accept-routes ^--login-server=http://headscale.example.com ^--auth-key=90e20f91f2497c518144254b0fe66cc0619ae5571e8a2e5c ^--force-reauth --unattended --reset ^--advertise-routes=192.168.12.0/24,192.168.13.0/24

关于选项设置:

  • –login-server: 指定使用的中央服务器地址(必填)
  • –advertise-routes: 向中央服务器报告当前客户端处于哪个内网网段下, 便于中央服务器让同内网设备直接内网直连(可选的)或者将其他设备指定流量路由到当前内网(可选)
  • –accept-routes: 是否接受中央服务器下发的用于路由到其他客户端内网的路由规则(可选)
  • –accept-dns: 是否使用中央服务器下发的 DNS 相关配置(可选, 推荐关闭)

客户端开启IP转发,在注册表编辑器中,打开 ,将参数IPEnableRouter的值从0修改为1,然后关闭注册表编辑器并重新启动系统。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

4、headscale控制端查看注册的节点列表

docker exec -it headscale headscale nodes list

如果需要删除节点执行以下命令

headscale nodes delete -i 2

5、server端查看客户端发布的subnet

/ # headscale nodes routes list -i 2
Route           | Enabled
192.168.12.0/24 | false
192.168.13.0/24 | false

server端启用客户端发布的subnet

/ # headscale nodes routes enable -i 2 -r 192.168.13.0/24,192.168.12.0/24
Route           | Enabled
192.168.12.0/24 | true
192.168.13.0/24 | true

tailscale ping 命令

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

C:\Users\willme>tailscale ping 192.168.12.16
pong from winpc (fd7a:115c:a1e0::2) via DERP(aliyun) in 49ms
pong from winpc (fd7a:115c:a1e0::2) via DERP(aliyun) in 117ms
pong from winpc (fd7a:115c:a1e0::2) via DERP(aliyun) in 46ms
pong from winpc (fd7a:115c:a1e0::2) via DERP(aliyun) in 38ms
pong from winpc (fd7a:115c:a1e0::2) via DERP(aliyun) in 80ms
pong from winpc (fd7a:115c:a1e0::2) via DERP(aliyun) in 42ms
pong from winpc (fd7a:115c:a1e0::2) via DERP(aliyun) in 163ms
pong from winpc (fd7a:115c:a1e0::2) via DERP(aliyun) in 68ms
pong from winpc (fd7a:115c:a1e0::2) via DERP(aliyun) in 41ms
pong from winpc (fd7a:115c:a1e0::2) via DERP(aliyun) in 255ms
direct connection not established

tailscale status 命令

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

C:\Users\winpc>tailscale status
fd7a:115c:a1e0::1 win-laptop          defaultns    windows -
fd7a:115c:a1e0::2 winpc               defaultns    windows active; relay "aliyun", tx 45680 rx 49464

tailscale netcheck 命令

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

C:\Users\winpc>tailscale netcheckReport:* UDP: false* IPv4: (no addr found)* IPv6: no, but OS has support* MappingVariesByDestIP:* HairPinning:* PortMapping:* CaptivePortal: true* Nearest DERP: aliyund-derp* DERP latency:- aliyun: 126.3ms (aliyund-derp)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/151412.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring的beanName生成器AnnotationBeanNameGenerator

博主介绍&#xff1a;✌全网粉丝4W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

11.3 读图举例

一、低频功率放大电路 图11.3.1所示为实用低频功率放大电路&#xff0c;最大输出功率为 7 W 7\,\textrm W 7W。其中 A \textrm A A 的型号为 LF356N&#xff0c; T 1 T_1 T1​ 和 T 3 T_3 T3​ 的型号为 2SC1815&#xff0c; T 4 T_4 T4​ 的型号为 2SD525&#xff0c; T 2…

(高阶) Redis 7 第21讲 IO多路复用模型 完结篇

🌹 以下分享 Redis IO多路复用模型,如有问题请指教。🌹🌹 如你对技术也感兴趣,欢迎交流。🌹🌹🌹 如有对阁下帮助,请👍点赞💖收藏🐱‍🏍分享😀 IO多路复用模型是什么 I/O:网络IO 多路:多个客户端连接(连接即套接字描述符,即socket或channel),指…

leetcode 49. 字母异位词分组

2023.10.7 根据字母异位词的定义&#xff0c;可知&#xff1a;所有字母异位词经过排序之后得到的字符串相同&#xff0c;所以可以定义一个哈希表&#xff0c;将排序后的字符串当作哈希表的键&#xff0c;哈希表的值则用来存储该字母异位词对应的所有字符串&#xff0c;最后将哈…

HDLbits: Shift18

先补充一下算术移位寄存器和按位移位寄存器&#xff1a; SystemVerilog具有按位和算术移位运算符。 按位移位只是将向量的位向右或向左移动指定的次数&#xff0c;移出向量的位丢失。移入的新位是零填充的。例如&#xff0c;操作8’b11000101 << 2将产生值8’b00010100…

【数据结构-二叉树 八】【遍历求和】:求根到叶子节点数字之和

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是【遍历求和】&#xff0c;使用【二叉树】这个基本的数据结构来实现&#xff0c;这个高频题的站点是&#xff1a;CodeTop&#xff0c;筛选条件为&am…

练[SUCTF 2019]CheckIn

[SUCTF 2019]CheckIn 文章目录 [SUCTF 2019]CheckIn掌握知识解题思路关键paylaod 掌握知识 ​ .user.ini文件上传利用–需要上传目录有一个php文件(index.php)&#xff0c;文件头绕过&#xff0c;文件内容<&#xff1f;检测 解题思路 打开题目链接&#xff0c;发现又是一…

[SWPUCTF 2021 新生赛]easy_sql - 联合注入||报错注入||sqlmap

[SWPUCTF 2021 新生赛]easy_sql 一、思路分析二、解题方法解法一&#xff1a;手注解法二&#xff1a;报错注入解法三&#xff1a;sqlmap 一、思路分析 这题可以直接参考&#xff1a;[NISACTF 2022]join-us - 报错注入&无列名注入 网站标题提示&#xff0c;参数是wllm ?…

day25--JS进阶(递归函数,深浅拷贝,异常处理,改变this指向,防抖及节流)

目录 浅拷贝 1.拷贝对象①Object.assgin() ②展开运算符newObj {...obj}拷贝对象 2.拷贝数组 ①Array.prototype.concat() ② newArr [...arr] 深拷贝 1.通过递归实现深拷贝 2.lodash/cloneDeep实现 3.通过JSON.stringify()实现 异常处理 throw抛异常 try/catch捕获…

Linux TCP协议通信 (流程 三次握手 四次挥手 滑动窗口)

TCP通信流程 Socket函数 TCP通信实现&#xff08;服务器端&#xff09; #include <stdio.h> #include <arpa/inet.h> #include <unistd.h> #include <string.h> #include <stdlib.h> int main() {//1.创建socketint lfd socket(AF_INET, SOCK_…

kafka的请求处理机制

目录 前言&#xff1a; kafak是如何处理请求的&#xff1f; 控制请求与数据类请求 参考资料 前言&#xff1a; 无论是 Kafka 客户端还是 Broker 端&#xff0c;它们之间的交互都是通过“请求 / 响应”的方式完成的。比如&#xff0c;客户端会通过网络发送消息生产请求给 B…

四位十进制频率计VHDL,DE1开发板验证,仿真和源码

名称&#xff1a;四位十进制频率计VHDL&#xff0c;DE1开发板验证 软件&#xff1a;Quartus 语言&#xff1a;VHDL 要求&#xff1a; 数字频率计设计要求 1、四位十进制数字显示的数学式频率计,其频率测量范围为10~9999khz,测量单位为kHz。 2、要求量程能够转换。即测几十…

蓝桥杯每日一题2023.10.8

题目描述 七段码 - 蓝桥云课 (lanqiao.cn) 题目分析 所有的情况我们可以分析出来一共有2的7次方-1种&#xff0c;因为每一个二极管都有选择和不选择两种情况&#xff0c;有7个二极管&#xff0c;但是还有一种都不选的情况需要排除&#xff0c;故-1 枚举每个方案看是否符合要…

【图像处理】【应用程序设计】加载,编辑和保存图像数据、图像分割、色度键控研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

MongoDB数据库网站网页实例-编程语言Python+Django

程序示例精选 PythonDjangoMongoDB数据库网站网页实例 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《PythonDjangoMongoDB数据库网站网页实例》编写代码&#xff0c;代码整洁&#xff0c;…

【ONE·Linux || 多线程(二)】

总言 多线程&#xff1a;生产者消费者模型与两种实现方式&#xff08;条件变量、信号量&#xff09;、线程池。 文章目录 总言4、生产者消费者模型4.1、基本概念4.2、基于BlockingQueue的生产者消费者模型&#xff08;理解条件变量&#xff09;4.2.1、单生产者单消费者模式&am…

golang gin——中间件编程以及jwt认证和跨域配置中间件案例

中间件编程jwt认证 在不改变原有方法的基础上&#xff0c;添加自己的业务逻辑。相当于grpc中的拦截器一样&#xff0c;在不改变grpc请求的同时&#xff0c;插入自己的业务。 简单例子 func Sum(a, b int) int {return a b }func LoggerMiddleware(in func(a, b int) int) f…

一文搞懂UART通信协议

目录 1、UART简介 2、UART特性 3、UART协议帧 3.1、起始位 3.2、数据位 3.3、奇偶校验位 3.4、停止位 4、UART通信步骤 1、UART简介 UART&#xff08;Universal Asynchronous Receiver/Transmitter&#xff0c;通用异步收发器&#xff09;是一种双向、串行、异步的通信…

常用排序算法详解

1.冒泡排序原理示例代码实现 2.快速排序原理示例代码实现 3.插入排序原理示例代码实现 4.希尔排序原理示例代码实现 5.选择排序原理示例代码实现 6.堆排序原理示例代码实现 7.归并排序原理示例代码实现 本文讲述了常见的排序算法的执行过程&#xff0c;有详细实现过程举例 1.冒…

论文阅读--Cell-free massive MIMO versus small cells

无蜂窝大规模MIMO与小蜂窝网络 论文信息 Ngo H Q, Ashikhmin A, Yang H, et al. Cell-free massive MIMO versus small cells[J]. IEEE Transactions on Wireless Communications, 2017, 16(3): 1834-1850. 无蜂窝大规模MIMO中没有小区或者小区边界的界定&#xff0c;所有接入…