本文仅为技术交流分享,部署时请遵守当地网络法规!

WireGuard协议

Tailscale代理服务基于WireGuardVPN协议。后者是下一代现代VPN协议,其设计目标为简单、安全、高性能,且已被集成到Linux Kernel中,广泛被应用于服务器、云网络和个人VPN服务中。WireGuard本质上是“基于UDP的加密隧道协议”,其网络通信流程如下:

  1. 客户端发送数据
  2. WireGuard对数据包加密
  3. 加密后报文使用UDP封装
  4. 发送到接收端
  5. 接收端解密并恢复原始IP报文

WireGuard协议加密

WireGuard只使用一组固定的现代加密算法,且采用AEAD(Authenticated Encryption with Associated Data)加密模式。其通过组合使用ChaCha20 + Poly1305算法同时提供加密和完整性校验服务。

功能 算法
密钥交换 Curve25519
加密 ChaCha20
数据认证 Poly1305
哈希 BLAKE2s
密钥派生 HKDF

WireGuard网络模型

WireGuard本质上为三层VPN架构,运行时会创建一个虚拟网卡(eg,wg0),类似

1
2
3
4
5
6
$ ifconfig
eh0
lo
wg0

# 通信链路:10.0.1->wg0->Internet->wg0->10.0.0.2

Tailscale代理服务

Linux使用官方源安装:

1
2
3
4
5
6
7
8
9
10
11
12
# 官方安装源
$ curl -fsSL https://tailscale.com/install.sh | sh
# 启动服务
$ sudo tailscale up [options]
--reset 重置所有设置
--accept-dns=false 不使用 Tailscale DNS
--accept-routes=false 不接受路由
--exit-node=<IP> 使用出口节点

#系统会返回一个登录URL:
To authenticate, visit:
https://login.tailscale.com/a/xxxx

登陆后查看服务状态,可以查看目前账号所有tailscale服务节点状态。正常情况下,已经可以使用tailscale分配的IP进行VPN通信。

1
$ tailscale status

Tailscale exit-node服务

为了使云服务器可以访问本地内网,或某些被过滤的网站,可以使用Tailscale的代理转发服务。云服务器使用Ubuntu操作系统,本地平台使用Windows操作系统。

Windows平台

查看本地tailscale状态无误后,开启本机exit-node转发功能。

1
2
3
4
5
6
7
8
9
$ tailscale status
$ tailscale set --advertise-exit-node
# 同时登陆tailscale控制台,手动确认exit-node
$ tailscale status
# 可以查看本机状态(exit-node)
$ curl.exe ip.sb
# 查看本地设备外访问互联网时使用的公网 IP 地址
$ tailscale set --advertise-exit-node=false
# 关闭exit-node服务

如果需要使用其他VPN代理服务,可以开启代理的TUN(虚拟网卡)模式,同时查询云服务器SSH连接路由表后设置转发规则,以免开启TUN后SSH连接断开(请求报文和回复报文路由路径不同)

Ubuntu平台

开启Tailscale服务并查看节点状态无误后,可开启指定节点转发服务:

1
2
3
4
5
6
7
8
9
$ tailscale up
$ tailscale status
$ tailscale set --exit-node=100.xxx.xxx.xxx
$ curl ip.sb
# 查看本地设备外访问互联网时使用的公网 IP 地址,应该和Win平台一致
$ curl -L https://xxxx.com
# 检查代理状态
$ tailscale set --exit-node=
# 关闭代理

如果最初SSH连接的是云服务器公网IP,在开启exit-node服务后,由于路由路径改变(云服务器所有流量强制由Tailscale虚拟网卡走本地转发),SSH连接会断开,因此推荐换到Tailscale分配的虚拟IP连接。

Tailscale Router服务

启用Tailscale的exit-node服务,会让云服务器端所有流量都由exit-node转发。若仅仅想让一部分流量被转发,官方推荐Subnet Router + routes方法

使用云端作为流量转发服务器,使本地终端访问其内网网段(192.168.1.0/24),相关步骤如下

在Ubuntu中开启IP转发(IP Forwarding),让系统从 “终端主机(Host)”模式 变成 “路由器(Router)”模式,允许内核转发不是发给本机的数据包。

1
2
3
4
5
6
7
# 开启流量转发
$ sudo sysctl -w net.ipv4.ip_forward=1
# 开启广播子路由
$ sudo tailscale set --advertise-routes=192.168.1.0/24
# 进入Tailscale控制台批准其路由转发功能
# 查看结果
$ ip route

本地客户端只需要接受该路由

1
2
3
$ tailscale set --accept-routes=true
# 查看路由
$ route print