Tailscale-基本使用

Tailscale 官方文档

介绍

Tailscale 是一个基于 WireGuard 协议, 并提供多种 SSO 认证的 VPN 服务. 其提供点对点加密连接, ACL 控制, internal DNS 等功能.

Tailscale 中创建的 peer-to-peer mesh network 称为 a tailnet.

Tailscale 通过 mesh network 中每个设备间直接通信, 避免了经过中心节点导致的高延时. 从而提高通信效率.


(官方图)

相关概念

RBAC 和 ABAC

RBAC

RBAC, Role-Based Access Control, 基于角色的访问控制.

在 RBAC 中, 每个用户被分配一个或多个角色来获取对应的权限. 核心概念包括:

  • Role, 角色, 一组相关权限的集合, 其定义了用户在系统中的职责和访问权限
  • Permission, 权限, 指对系统资源进行特定操作的许可, 权限定义了该角色可以执行的操作
  • User, 用户, 用户是系统中的实体, 每个用户可以被分配一个或多个角色
  • Authorization, 授权, 指将角色与用户关联起来

ABAC

ABAC, Attribute-Based Access Control, 基于属性的访问控制. 在 ABAC 中, 访问决策是基于一组属性和规则进行的, 而不是仅仅基于角色.

其核心概念包括:

  • Attribute, 属性, 指用于描述用户, 资源和环境的特征或条件
  • Policy, 策略, 指一组规则, 定义了在什么条件下用户可以访问系统资源
  • Subject, 访问主体, 可以是用户, 应用程序或其他实体, 通过属性来描述和区分
  • Resource, 资源, 指需要保护和控制访问的对象, 例如文件, 数据库, 网络服务等

DAC 和 MAC

DAC

DAC, Discretionary Access Control, 自主访问控制. 其基于文件或资源的所有者, 允许所有者对其资源进行授权, 并决定其他用户或组的访问权限.

MAC

MAC, Mandatory Access Control, 强制访问控制. 其使用一个中心实体 (通常是操作系统或安全策略管理器) 来定义和强制访问策略, 而不是资源的所有者.

Node advertise

这里的 “advertise” 指广播信息.

安装

在 Archlinux 上用包管理器管理为:

1
sudo pacman -S tailscale

也可以:

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

用 Docker 搭建

官方教程
Youtube 教程

拉取镜像:

1
docker pull tailscale/tailscale:latest

一些可用参数

TS_HOSTNAME

等价于 tailscale set -- hostname=.

docker-compose 示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
---
version: "3.7"
services:
tailscale:
image: tailscale/tailscale:latest
hostname: tailscale
environment:
- TS_STATE_DIR=/var/lib/tailscale
- TS_USERSPACE=false
volumes:
- ${PWD}/tailscale/state:/var/lib/tailscale
- /dev/net/tun:/dev/net/tun
cap_add:
- net_admin
- sys_module
restart: unless-stopped

直接创建的示例

1
2
3
4
5
docker run -d --name=tailscale \
--cap-add=NET_ADMIN --net=host \
-v /dev/net/tun:/dev/net/tun \
-v /var/lib/tailscale:/var/lib/tailscale \
tailscale/tailscale:latest tailscaled

启用

systemd 管理如下:

1
sudo systemctl start tailscaled

ACL 控制设置

Tailscale CLI 基本使用

Tailscale 与 CLI 相关文档

查看 help 文档

1
tailscale --help

查看子命令的文档如:

1
tailscale up --help

连接到 tailscale 网络

1
sudo tailscale up

若不用 root 用户运行, 则:

1
tailscale up --operator=$USER

(似乎会报错, 暂时不解决)

运行后会返回一个 url, 在网页上登录账号来加入网络.

可以用:

1
sudo tailscale up --ssh

在连接上的同时启用 ssh 连接.

断开连接

在一个 node 上运行:

1
sudo tailscale down

启用 ssh 连接

1
sudo tailscale set --ssh

启用数据包转发

在转发节点 (也就是用于作为代理的 node) 上运行:

1
2
3
sudo sysctl -w net.ipv4.ip_forward=1
sudo sysctl -w net.ipv6.conf.all.forwarding=1
sudo tailscale up --accept-routes --advertise-exit-node --ssh --advertise-routes=100.89.128.85/32

--advertise-routes= 用于指明要转发谁的.

在另一个 node 上运行:

1
sudo tailscale up --exit-node=100.97.209.7

--exit-node= 指明转发节点.
(这个功能还没搞明白)

随记

Tailscale 主要由三部分组成:

  • 节点, 也就是终端设备
  • 协调服务器, 用于给节点进行授权, 分配虚拟 IP (注意是 100 开头的), 保证 IP 唯一, 实时同步可访问的其他节点信息, 下发并更新可用中转服务器信息, 以及节点之间的访问策略等, 同一账号下的节点可以相互访问, 不同账号下的节点不能相互访问
  • 中转服务器

Tailscale 的网络连接基础, 是需要中转服务器来达成的. 节点需要知道它可以连接的中转服务器在哪里.

当终端得到中转服务器信息 (以及协调服务器分配的信息) 后, 节点会跟它可用的中转服务器进行连接并创建一个加密隧道, 而这个隧道就会成为节点之间最基础的互访通道, 当节点想要访问另一个节点时, 因为节点本身有另一个节点的信息, 所以他会直接通过中转服务器的通道跟另一个节点进行连接, 以保证两个节点是可连接的.

此时, 两个节点会同时再向中转服务器发出请求, 告诉中转服务器他们可以直连的 IP 和端口, 中转服务器的 STUN 服务会发挥中介作用, 告诉双方可以的连接方式, 双方就会进行直连的尝试, 当可以直连的时候, 那么节点之间的流量就不会从中转服务器再进行传输了. 他们会直接进行连接, 但当节点之间的直连出现不可持续情况的时候, 那么节点之间的连接就会退回到中转服务器的加密隧道中.

节点之间的连接协议是 WireGuard 协议. 其通过 UDP 协议传输. 中转状态下, tailscale 创建了一个 TCP 的加密隧道, 让 WireGuard 协议的流量通过其中进行传输.

MOON 转发的流量不是 TCP 中转流量, 而是 UDP 中转流量.

搭建 MOON (ZeroTier) 或 DERP (Tailscale), 也就是搭建国内中转.

Tailscale 客户端是全平台支持自定义的中转服务器, 这个功能实际上是通过协调服务器下发并更新中转服务器来实现的.

UDP 可能会被 QoS 问题. 在不同的运营商之间, 会有 QoS 存在.

因此, 节点需要保证其与协调服务器和中转服务器都能有效的进行连接.

一般协调服务器连接的稳定性还行, 因为其只负责少量信息传输, 且都是允许的内容, 并没有流量转发的功能. 但国内 ipv4 环境下的中转服务器的连接情况不太行 (因为 tailscale 提供的大部分中转服务器都是国外的, 只有几个在香港), 都会受到防火墙的影响. 因为其中转流量的指纹特征都比较明显, 中转后可能被阻断.

但 ipv6 不太存在这个问题, 在 ipv6 情况下, 大部分都是公网 IP, 节点之间只会有少量中转流量, 比较容易进行直连, 这样就不会有太多的加密流量通过中转服务器进行传输, 也就不太会被防火墙阻断.

每一台设备安装 tailscale, 再加入到自己账号的网络中, 成为节点. 这样设备就能够互相访问了.

默认有密钥过期, 此时需要重新登录再进行授权. 可以登录管理界面, 修改节点选项, 确认其中的 Disable key expiry

似乎是添加一个子网:

1
tailscale up --netfilter-mode=off --advertise-routes=192.168.11.0/24 --accept-routes

(login.tailscale.com) 为 Web 登录域名.

在客户机上运行:

1
tailscale set --ssh

之后节点间就可以直接用 ssh 登录了.

在客户机上运行:

1
tailscale set --advertise-exit-node

Exit node 指一个在 tailscale 网络中有公共互联网连接的节点 (指连接上了互联网的节点), 用来转发流量. (此时其相当于正向代理)

Linux Web

运行:

1
tailscale up

Tailscale-基本使用
http://example.com/2024/04/02/Tailscale-基本使用/
作者
Jie
发布于
2024年4月2日
许可协议