type
status
date
slug
summary
tags
category
icon
password

Ⅰ、VPN & TailScale

1、What is VPN

VPN: Virtual Private Network
  • Network: 连接不同设备的网络
  • Private: 私有,安全的信道
  • Virtual: 虚拟,不是真实的物理网络

2、Why need VPN

VPN 可以用来做什么?
  1. 在不安全的网络环境中创建加密信道
  1. 在公网环境中接入某个内网
  1. 突破地域限制
对公场景(2)用处比较多,比如远程办公时接入办公环境,或者打通多个隔离的子网。
对私场景(1、3)最常见,比如抗审查、突破地域限制等。

3、传统的 VPN 拓扑

notion image
  • 一台中心服务器,扮演网关和转发服务器(relay)的角色。
  • 所有的客户端都接入这台中心网关,所有的数据也流经这个中心网关。
  • 数据平面和控制平面都在这台中心网关上。
最显著的缺点就是,两台客户端可能离得非常近,但是流量却需要通过遥远的中心网关来转发。
notion image
切身之痛的经历:
之前我在一家网络环境控制的很严格的公司。办公区域的网线和 wifi 处于不同的隔离域。我喜欢远程开发,有一台台式机作为开发机,还有一台笔记本作为 UI。都插着网线的时候还好,但是一旦笔记本接入 wifi 开会,就和台式机断开了。后来只能在两台设备上都拨入 VPN。但是公司的 VPN 网关在北京,我的两台设备相距不超过 1m,然而每一个比特都需要去北京跑一个来回。

4、Mesh VPN

那能不能引入 P2P 的思维,让距离比较近的客户端之间直接通信呢?
这个思想就是 Mesh VPN 了,其中的代表就是 WireGuard
notion image
WireGuard 虽然非常强大,但是配置极其繁琐。每一个结点都需要能够感知到其他结点的存在,完全依赖于手动配置结点信息和证书文件。
我们很懒,能不能开箱即用?于是有了 Tailscale。

5、Tailscale

Tailscale 的底层依赖于 WireGuard,但是在此基础上,分离了控制平面和数据平面。
  • 引入中心化的 Coordinator 作为控制平面,管理每个租户名下的所有结点。每个结点都会以 long polling(comet)的方式挂载到 coordinator,随时拉取最新的配置更新。
  • Coordinator 只负责下发配置,不负责转发数据流量,所以不会成为单点瓶颈。
  • 数据平面 则以底层的 WireGuard 为基础,扩充实现了多种 NAT 穿透协议和基于 UDP/TCP 的 relay 转发机制。
在强大的 NAT 穿透之外,以 relay 转发为最终的 fallback 保底方案,实现了强大的网络连通性。
其核心功能还包括:tunnel 外网 HTTPS 暴露、ACL 管理、taildrop 文件传送、tailssh 远程登录、taillock 零信任结点锁等等。

Ⅱ、NAT

1、什么是 NAT

IPv4 一共有 43 亿个地址,其中还有 6 亿的地址是不可用于公网的保留地址。而世界上的人口已经超过了 70 亿,IPv4 的地址事实上是不够用的。为了解决这个问题,人们引入了 NAT。
NAT 位于公网和内网的交界处,它可以将内网的 ip:port 映射为公网 IP 上的一个端口,以打通内网主机和外网的通讯。理论上,每一台和互联网相连的内网主机仅会占用公网的一个端口,而不再需要占用一个独立的公网 IP,从而大大节省了公网 IP 的使用。
notion image

2、What is stateful firewall

直接让内网主机和公网通讯会带来安全问题。在传统的护城河安全模型(Castle and Moat)中,所有的内网机器都被防火墙保护。NAT 上同时也运行着一个 stateful 防火墙。
Stateful 防火墙会监听 NAT 上的所有流量,记录下内网和公网端口的映射关系,并据此来决定是否允许从公网前来的数据包进入内网。
notion image
Stateful 的功能: 防火墙可以记录最近的出站流量,并放行来自同一个 destination 的入站流量。
notion image

3、为什么需要穿透

  • 在传统的中心化 VPN 服务器时代,NAT 并不是问题,因为 VPN 服务器暴露在公网。
notion image
  • 在 Mesh VPN 时代,为了让结点互联,NAT 成了严重的问题。
  • 虽然结点可以从 coordinator 获知自己和对方的公网 IP,但是无法知道对方端口,且 stateful 防火墙会阻断对方发来的请求。
notion image

Ⅲ、NAT 穿透

1、UDP 与打洞的基础原理

已知:
  • UDP 是一种无连接的协议。
  • Stateful firewall 会记录出站流量,并放行同 dst 的入站流量。
  • NAT 会为出站流量创建一个公网端口。
原理: Alice 先向 Bob 发送一个有去无回的 UDP 包,在自己的 NAT & firewall 上打一个洞,然后 Bob 就可以通过这个洞向 Alice 发送数据包了。
notion image

2、STUN

Alice 和 Bob 在相互握手前,需要先预知对方在公网 NAT 上的 ip:port。STUN 协议就是用来干这事儿的。
STUN 是一个暴露在公网上的服务协议,客户端向 STUN 发起请求,STUN 返回客户端的公网 ip:port(即客户端在 NAT 上开的洞)。
notion image

3、TURN

TURN 是个经典的 relay 协议。一个结点去 TURN 上注册一个公网 ip:port,然后告诉对端可以通过 TURN 这个中转和自己通信。
Tailscale 实现了自己的 relay 协议,称为 DERP (Designated Encrypted Relay for Packets)。这个协议最大的特点是基于 TCP,在国内 UDP 干扰严重的环境下体验更好。
notion image

4、Hard NAT

NAT 分为多种:Full-Cone (Easy), Restricted-Cone, Port-Restricted-Cone, Symmetric (Hard) 等。
  • Easy NAT: 无视 dst ip:port,同一个 src ip:port 始终映射到同一个公网 ip:port
  • Hard NAT (Symmetric): 依赖 dst ip:port,每一个 (src ip:port, dst ip:port) 都会被映射到不同的公网 ip:port
后果:Hard NAT 导致 STUN 没用了。如果通信双方都是 Hard NAT,只能依赖 TURN/DERP 进行中转转发。
notion image

5、Hard And Easy NAT

如果通信双方仅有一方位于 Hard NAT 后,另一方位于 Easy NAT 后,还有转机。
notion image
利用 Birthday Paradox (生日悖论)
  • Hard 端往 Easy 端的 ip:port 建立 256 个连接(开 256 个洞)。
  • Easy 端往 Hard 端的 IP 遍历发包,每次使用随机不重复的 port。
如果恰好随机生成的 port 是 Hard 打过洞的 port,双方就能握手。256 次尝试能有 64% 成功率,1024 次可达 98%。

6、uPnP

Birthday Paradox 看起来像端口扫描。更好的方式是 NAT 设备允许后方结点主动注册公网端口。
协议包括 uPnP、NAT-PMP、PCP。但 uPnP 常因安全或实现缺陷被默认禁用。

7、CGNAT & Hairpinning

  • CGNAT (Carrier Grade NAT): 运营商级 NAT,多个用户共享公网 IP。
  • Hairpinning: 同一个 NAT 内部的结点直连技术。支持该技术的 NAT 发现数据包 dst 是自己的公网地址时,会将其转发给内网的对端结点。

8、ICE

Interactive Connectivity Establishment (ICE)。
Tailscale 的策略:Try everything at once, and pick the best thing that works.
首先使用 relay 保证联通,后台遍历尝试所有直连方式,成功则切换到直连。

Ⅳ、个人组网方案

1、背景

我的主要办公设备:
  • 家里:一台不关机的 Windows PC,通过 VMware Player 运行 Linux 服务器。
  • 移动:一台 MacBook Air。
  • 公网:多台全球 VPS(非必要),一台中国境内 VPS(必要,提供低延迟境内穿透)。
目的:在任何能连接公网的环境下,随身携带的 MBA 都能访问家里的 PC。

2、关于移动办公

理想的移动办公是指在任何地方、通过任何设备,都可以连接到一个统一的高性能办公环境(通常是固定的 PC),而不是背着同一个设备跑。

3、准备

  1. 给所有设备安装 Tailscale 客户端并登录同一账户。
  1. 搭建国内 DERP Server:
    1. Tailscale 默认 DERP 在国外,国内访问延迟高。为了舒适体验,需要在中国境内 VPS 上搭建自己的 DERP。
      • 可以利用 swag 自动获取 Let's Encrypt 证书。
      • 使用非 443 端口可避免备案问题(但也别用 80,切记不要用浏览器访问该端口)。

4、运行服务

Tailscale 网络内每台设备都有唯一内网 IP。可以将服务绑定到这个 IP。
Docker 服务示例:

5、远程桌面

在 Windows 上启用远程桌面服务,Mac 上通过 JumpDesktop App 访问 Windows。

6、文件共享

在 Windows 上设置文件夹共享,所有设备通过 SMB 服务访问。

Ⅴ、References

  • Slides: How NAT traversal works
  • Recent experiences with tailscale1
  • Tailscale: How NAT traversal works2
美句惨胜如败:香积寺之战与唐朝命运的思考
Loading...