Tailscale+OpenWrt 异地组网实现

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)

  1. 在 网络 —> 接口 中添加接口。接口选择tailscale0,协议选择不配置协议,名称随意
  2. 在刚创建的接口中配置防火墙,创建(自定义)一个名为tailscale的防火墙
  3. 在 网络 —> 防火墙 中配置刚才创建的防火墙,配置如图:

配置完毕之后,来到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 uptailscale down命令重启试试看

现在ping一下网络中的设备就会发现延迟一下子变低了!

分享这篇文章