Tailscale+OpenWrt 异地组网实现
tailscale
首先当然是注册Tailscale的账户,这我就不多展示了
客户端安装
客户端的安装的话这里就介绍一下OpenWrt的安装方式(其他都只需要安装包安装就行了)
注意:我这里OpenWrt是作为主路由使用的
首先是安装软件包需要安装如下软件包:
- iptables-nft(如果OpenWrt20.3之后的版本需要安装)
- tailscale
- tailscaled
安装完毕之后进入到命令行界面输入
tailscale up --netfilter-mode=off --advertise-routes=192.168.1.0/24,10.200.2.0/24 --accept-routes --advertise-exit-node --reset
解释一下上面的命令:
--netfilter-mode
自己管理防火墙--advertise-routes=192.168.1.0/24,10.200.2.0/24
启用子网,这些子网配置正常就可以在整个Tailscale网络中访问--accept-routes
启用路由--advertise-exit-node
配置为Tailscale网络的可选流量出口节点--reset
如果需要更新之前的配置就需要带上这个参数
输入完毕的话,如果是第一次up就会打印出一个URL
将上面的那串URL复制到浏览器访问,登陆你的账号,等命令行界面打印除了Success
就说明这个机器进入网络了。我们可以在Machines - Tailscale看到
哦,对了别忘记将需要的节点配置为Expiry disabled,防止密钥过期需要重新登陆
然后就是需要配置一下OpenWrt的防火墙策略(我这里的GUI是luci)
- 在 网络 —> 接口 中添加接口。接口选择
tailscale0
,协议选择不配置协议,名称随意 - 在刚创建的接口中配置防火墙,创建(自定义)一个名为
tailscale
的防火墙 - 在 网络 —> 防火墙 中配置刚才创建的防火墙,配置如图:
配置完毕之后,来到Web管理界面。选择节点,修改节点配置:选择Edit route settings
开启子网路由
然后测试使用手机热点模拟外网,访问路由器的内网IP(如192.168.1.1
),如果可以成功访问就说明配置成功了(可能会有点慢)
DERP服务器搭建
上面搭建完网络环境之后,外面会发现,访问网络当中的设备是很慢的。我这里的话差不多有300多ms的延迟(主要原因是Tailscale服务器在国外,访问比较困难)。如何改善这种情况呢?
我这里来简单表述一下Tailscale的大致原理。Tailscale的网络中有三种角色,分为:
- 协调服务器:分发配置,同步可访问节点信息,更新中转服务器的信息
- 节点:在这里就是我们网络中的设备
- 中转服务器(DERP):节点会通过中转服务器进行协商节点间最短路径的访问方式
- 最短路径:我理解的是可以直接通过 公共的网关 互相访问
- 协商失败:通过中转服务器互访,会卡一点
这里直接关系到网络流畅程度的就是 中转服务器。由于我们默认使用的是Tailscale在国外的公共DERP服务器,所以一般都挺卡的
Tailscale也提供了私人搭建DERP服务器的方案,我们可以根据这个方案来搭建自己的DERP服务器,加速网络的访问速度
我使用的DERP搭建方案的环境需求:
- 自己的域名(不需要备案)
- SSL证书
- 云服务器(可以是NAT)
- Golang
搭建环境
域名的话直接阿里云买一个,然后绑定到服务器上就可以了
主要是SSL证书,这里使用到了acme来获取SSL证书,安装方式如下
Install in China · acmesh-official/acme.sh Wiki (github.com)
第一步,绑定域名
这一步执行完会让你加一条TXT记录在你的域名上
acme.sh --issue -d <域名> --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please --log-level 2
第二部,申请证书
acme.sh --renew -d <域名> --yes-I-know-dns-manual-mode-enough-go-ahead-please --log-level 2
完成之后会提示你证书存放的位置
报错的话可以执行
export ACME_USE_WGET=1
试试看
然后需要使用openssl
将PEM格式的.cer
证书转化为.crt
格式,命令如下
openssl x509 -inform PEM -in xxx.cer -out xxx.crt
Golang的安装教程我这里就不说了,注意要添加proxy加速国内下载
DERP安装和启动
安装命令如下:
go install tailscale.com/cmd/derper@main
启动命令如下
derper -hostname <域名> -certmode manual -certdir <证书存放目录> -http-port -1 -a :<https端口> -stun-port <stun端口>
可以选择加上-verify-clients选项,这样不在你网络中的设备就无法使用这个DERP服务器了
尝试访问https端口,如果出现下图的效果,就说明启动成功了(记得开云服务器防火墙)
配置DERP服务器到节点
首先进入Web控制台 —> Access controls,编辑如下配置
{
"acls": [
{"action": "accept", "src": ["*"], "dst": ["*:*"]},
],
"ssh": [
{
"action": "check",
"src": ["autogroup:member"],
"dst": ["autogroup:self"],
"users": ["autogroup:nonroot", "root"],
},
],
"derpMap": {
"OmitDefaultRegions": true,
// Regions 记录了有哪些 DERP 区域, Tailscale 是按区域划分 DERP 服务器组的
"Regions": {
// 900 是这个区域的区域 ID, 只能填数字, 且范围只能在 900-999 以内(包括头尾)。
"900": {
// 与区域 ID 相同.
"RegionID": 900,
// 区域的代号名, 纯英文.
"RegionCode": "xxx",
// 区域的名字, 不建议太长.
"RegionName": "xxx-xxx",
// 区域的节点列表.
"Nodes": [
{
// 节点名称, 会显示在日志里, 但不会显示在 netcheck 中.
"Name": "1",
// 与所在区域 ID 相同.
"RegionID": 900,
// DERP 服务器域名.
"HostName": "xxx.xxx.xxx",
// 如果使用了非标准 HTTPS 端口, 那么可以将 HTTPS 端口设置在此.
"DERPPort": xxxx,
// 如果 STUN 指定了非 3478 端口, 那么可以将 STUN 端口设置在此.
"STUNPort": xxxx,
// 下面的字段一般不用设置, 属于高级操作.
// 如果域名没有解析到服务器, 那么可以在这里指定.
"IPv4": "x.x.x.x",
"InsecureForTests": true,
// 如果服务器有 IPv6, 但没有设置域名 DNS 记录的话, 可以在这里指定.
// "IPv6": "xxx::xxx",
// 如果服务器使用的证书与域名不符, 可以在这里指定
// 用于 HTTPS 握手的域名地址.(SNI 域名地址)
// "CertName": "xxx.com"
},
// ...
],
},
},
},
}
保存后,进入客户端的命令行界面输入tailscale netcheck
查看当前DERP服务器信息,如果出现了你配置的服务器,并且延迟正常,就说明成功了!
如果没变化可以尝试tailscale up
和tailscale down
命令重启试试看
现在ping一下网络中的设备就会发现延迟一下子变低了!
分享这篇文章