异地组网:免域名免备案自建Tailscale DERP节点

无论是远程办公需要访问公司内网资源,还是想要在外出时轻松管理家中的设备,甚至只是想绕过NAT限制直接连接到另一台主机,异地组网都是一个理想的解决方案。本文将介绍一种不需要域名、无需备案的方法来建立自己的私有网络,特别适合国内环境下的技术爱好者和专业人士。

1 异地组网的目的与好处

想象这样一个场景:李华是一名开发者,他在家里有一台NAS用于娱乐,公司有一台性能强劲的PC作为开发环境,同时在云端租了一台服务器用于部署项目。他经常需要在星巴克充当气氛组或是出差时工作,使用的是一台环保的MacBook。如果没有异地组网,李华每次在外工作或访问家里的电脑,可能需要设置复杂的端口转发规则,担心家庭网络的安全性,还得记住不断变化的家庭IP地址。而想要在本地直接调试部署在云服务器上的应用,又必须开放服务器端口,增加了安全风险。

通过建立异地组网,李华只需要登录到私有网络,就像所有设备都在同一个局域网内一样。他可以从咖啡厅直接访问到NAS、开发环境,在笔记本上进行开发,然后无缝地部署到云服务器上。整个过程安全、高效,无需担心复杂的网络配置和安全风险。

异地组网为我们带来了多方面的好处:首先是便捷访问,无论身处何地,都能像在本地网络一样访问远程设备和服务;其次是保障了数据安全,通过加密通道传输数据,有效避免敏感信息在公共网络中泄露;同时,它能突破各种网络限制,绕过NAT、防火墙等障碍,实现真正的点对点连接;最后,它提供了统一管理的可能,让分散在不同地点的设备整合到一个虚拟网络中,便于集中管理和维护。

现代异地组网解决方案通常部署迅速,只需几分钟就能完成设置;提供低延迟体验,在良好的网络环境下几乎感受不到距离带来的延迟;且大多支持Windows、MacOS、Linux、iOS、Android等多种操作系统,让你的所有设备都能加入到这个私有网络中;更重要的是,它们简化了传统VPN的复杂配置,普通用户也能轻松上手使用。

2 异地组网的常见方案对比

市场上有多种异地组网解决方案,每种都有其独特的特点和适用场景。下面我们通过一个综合对比来了解几种主流方案:

方案 核心特点 优势 局限性 适用场景
Tailscale 基于WireGuard的P2P VPN 高性能、简单易用、支持P2P直连、开源核心组件 免费版设备数量有限(100个)、官方DERP中继在国内不稳定 个人使用、小型团队、需要高安全性的场景
ZeroTier 全球虚拟网络 灵活的网络拓扑、可创建多个网络、多平台支持 免费版设备数量有限(10个)、中继节点在国内不稳定、配置略复杂 需要复杂网络结构、多个虚拟网络的场景
FRP 反向代理工具 完全开源、灵活配置、无设备限制 非组网工具、需要公网服务器、配置复杂 特定服务端口转发、内网穿透
Cloudflare Tunnel 云端隧道服务 强大基础设施、不需公网IP、CDN加速 非P2P连接、主要针对Web服务、免费版功能有限 Web服务暴露、需要CDN加速的场景

虽然表格提供了直观的对比,但选择合适的方案还需结合具体使用场景进行考量。对于追求简单易用且希望建立真正点对点连接的用户,Tailscale通常是最佳选择。它简化了传统VPN的复杂性,同时保留了高性能和安全性。ZeroTier则适合那些需要构建更复杂网络拓扑的用户,它提供了更多的网络结构定制可能性。

如果您只是想解决特定应用的端口转发问题,FRP作为一个轻量级工具可能更为适合。而对于主要需要暴露Web服务的场景,特别是希望享受CDN加速的用户,Cloudflare Tunnel则提供了独特的优势。

就我个人而言,可以将上面的方案分为两类:前两者为SDN类,后两者为FRP类,两类正好是互补的关系。对于大多数情况,我的服务只需要在SDN类构建的局域网中访问即可;但对于某些特殊服务,还是需要Cloudflare Tunnel来打洞,即与他人分享的服务(正好Cloudflare Tunnel的鉴权访问做得非常完善)以及无root权限的机器。

异地组网拓扑示意图

在本文中,我们将重点探讨如何优化Tailscale在国内的使用体验,特别是通过自建DERP节点来提高连接质量,这对于国内用户来说是一个至关重要的改进。

3 Tailscale详解

Tailscale是近年来迅速崛起的新一代VPN解决方案,它巧妙地融合了传统VPN的安全性和P2P网络的直接连接优势,为用户提供了一种便捷、高效的异地组网方式。

3.1 什么是Tailscale?

Tailscale本质上是一个基于WireGuard协议的网状VPN(Mesh VPN)服务,它将复杂的网络配置简化为几次点击操作。与传统VPN不同,Tailscale采用了分布式架构,大多数情况下可以实现直接的点对点连接,无需所有流量经过中心服务器。这种设计既提高了数据传输效率,又降低了服务器负载和中心节点故障的风险。例如在上面的拓扑图中,四个节点间可以实现两两(P2P)直连。

Tailscale的魅力在于它极致的简化理念。用户无需深入了解网络配置,也不需要固定IP地址或是复杂的防火墙规则设置,只需在设备上安装客户端并登录,就能自动加入到安全的私有网络中。这种"零配置"的体验使得即使是非技术背景的用户也能轻松使用。

3.2 Tailscale的工作原理

理解Tailscale的工作原理,需要先了解几个核心概念:

WireGuard协议是Tailscale的基础,这是一个现代化的VPN协议,相比OpenVPN等传统方案,它代码量更小、性能更高、更易于审计。WireGuard提供了底层的加密通信能力,确保数据在传输过程中的安全性。

Tailscale采用了控制平面与数据平面分离的架构。控制平面负责设备认证、密钥交换、网络配置等管理功能,由Tailscale的服务器处理;而数据平面则负责实际的数据传输,尽可能地在设备间直接进行,无需经过中央服务器。

当两台设备需要通信时,Tailscale会首先尝试通过各种NAT穿透技术建立直接的P2P连接。这包括使用STUN协议发现设备的公网地址,以及尝试UDP打洞等技术。在大多数情况下,这些技术能够成功建立直接连接。

然而,在一些严格的网络环境下(如对称型NAT、企业防火墙、运营商级NAT等),直接的P2P连接可能无法建立。这时,Tailscale会退而求其次,使用DERP(Designated Encrypted Relay for Packets)服务作为数据中继。DERP是Tailscale开发的一种中继协议,它会在无法直连的情况下,帮助转发加密后的数据包。

3.3 Tailscale的优势与局限性

Tailscale凭借其独特的设计,在异地组网领域具有显著优势。首先是其卓越的性能表现,基于WireGuard协议,Tailscale比传统VPN解决方案如OpenVPN快得多,延迟更低,适合各种实时应用场景。其次是极简的用户体验,几分钟内就能完成全部配置,后续几乎零维护,大大降低了用户的使用门槛和运维成本。

安全性方面,Tailscale提供端到端加密,支持多种身份验证方式,包括与Google、Microsoft等身份提供商的集成,适合企业环境使用。跨平台支持也是Tailscale的一大亮点,它几乎支持所有主流操作系统,包括Windows、macOS、Linux、iOS、Android等,甚至还支持各种路由器固件如OpenWRT,让用户可以将所有设备纳入同一个私有网络。

然而,Tailscale也存在一些局限性。最突出的问题是官方DERP节点在国内连接不佳,由于众所周知的网络原因,官方提供的中继服务器在中国大陆地区的表现往往不尽如人意,影响了用户体验。此外,免费版本的设备限制(最多100台设备)对于个人用户通常足够,但对于较大规模的组织可能会成为制约。最后,一些高级功能如子网路由、多用户组织等需要付费计划支持,这也是使用Tailscale需要考虑的成本因素。

正是由于官方DERP节点在国内连接不佳的问题,自建DERP节点成为了提升国内Tailscale使用体验的关键解决方案,这也是本文接下来将重点讨论的内容。

4 自建Tailscale DERP节点

针对国内用户面临的最大问题——官方DERP节点连接不稳定,我们可以通过在国内服务器上自建DERP节点来解决。这种方法不需要域名和备案,只需要一台拥有公网IP的国内服务器,就能大大提升Tailscale在国内的使用体验。

4.1 DERP服务简介

DERP(Designated Encrypted Relay for Packets)是Tailscale专门开发的中继服务。当两台设备因为网络环境限制无法直接建立P2P连接时,DERP会作为中间人帮助转发加密数据包。这种情况常见于严格的NAT环境下,如校园网、移动网络、企业防火墙等场景。

需要强调的是,虽然DERP服务会中转数据,但这些数据在发送前已经被端到端加密,DERP服务器本身无法解密或查看数据内容,因此安全性不受影响。当然,使用DERP中继会增加一定的网络延迟,并受限于DERP服务器的带宽和地理位置。

默认情况下,Tailscale提供了遍布全球的DERP节点网络,包括美国、欧洲、亚洲多个地区,但遗憾的是没有中国大陆地区的节点。这导致国内用户在需要使用DERP中继时,往往需要连接到距离较远的节点,如香港、新加坡、日本等地,造成较高的延迟和不稳定的连接。

4.2 准备工作

在开始自建DERP节点前,您需要准备以下资源:

  1. 一台拥有公网IP的国内服务器,推荐配置至少1核2GB内存,带宽建议10Mbps以上,系统可以是常见的Linux发行版如Ubuntu、CentOS等。
  2. 服务器上已安装Docker和Docker Compose,这将极大简化我们的部署流程。如果尚未安装,可以参考Docker官方文档进行安装。
  3. 已注册的Tailscale账号,用于管理您的私有网络和DERP节点。

值得注意的是,虽然许多教程建议使用域名和SSL证书来部署DERP服务,但本文将介绍一种不需要域名和备案的简化方法,特别适合个人用户或小团队使用。

4.3 在DERP节点服务器上安装Tailscale客户端

首先,我们需要在服务器上安装Tailscale客户端。这一步骤至关重要,它是防止他人未经授权使用我们DERP节点的关键机制。由于DERP服务本身不验证客户端身份,我们需要借助Tailscale客户端的身份验证机制来实现访问控制。

在服务器上执行以下命令安装Tailscale客户端:

1
2
3
4
5
# 使用官方脚本安装Tailscale客户端
curl -fsSL https://tailscale.com/install.sh | sh

# 登录Tailscale
tailscale login

执行登录命令后,终端会显示一个URL链接。使用浏览器访问这个链接,按照提示完成身份验证流程。认证成功后,服务器就会成为您Tailscale网络中的一个节点。

您可以通过tailscale status命令验证登录状态,确保服务器已经成功连接到您的Tailscale网络。

4.4 使用Docker部署DERP服务

接下来,我们将使用yangchuansheng开发的Docker镜像来部署DERP服务。这个镜像封装了DERP服务的配置和运行环境,大大简化了部署过程。

首先,创建一个新的目录用于存放Docker配置文件:

1
mkdir -p ~/derp && cd ~/derp

然后,创建docker-compose.yml文件:

1
nano docker-compose.yml

将以下内容复制到文件中:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
services:
  derper:
    image: ghcr.io/yangchuansheng/ip_derper:latest
    container_name: derper
    restart: always
    ports:
      - "12345:12345" # 将12345改为您想使用的端口
      - "3478:3478/udp" # STUN端口,建议保持不变
    volumes:
      - /var/run/tailscale/tailscaled.sock:/var/run/tailscale/tailscaled.sock # 映射本地Tailscale客户端以验证连接
    environment:
      - DERP_ADDR=:12345 # 与上面端口保持一致
      - DERP_CERTS=/app/certs
      - DERP_VERIFY_CLIENTS=true # 防止未授权使用的关键参数

如果您的服务器在国内,可能会遇到拉取国外Docker镜像缓慢的问题,这时可以使用国内镜像源:

1
2
3
4
services:
  derper:
    image: ghcr.nju.edu.cn/yangchuansheng/ip_derper:latest
    # 其余配置保持不变

保存文件后,启动DERP服务:

1
docker compose up -d

通过查看容器日志,可以确认服务是否正常启动:

1
docker logs derper

如果看到类似"DERP server is up and running"的消息,说明服务已成功启动。

4.5 配置Tailscale使用自建DERP节点

现在,我们需要告诉Tailscale网络使用我们自建的DERP节点。这需要修改Tailscale的ACL(访问控制列表)配置。

  1. 登录Tailscale管理控制台:https://login.tailscale.com/admin/acls/file

  2. 在编辑器中,找到或添加derpMap部分,配置自建的DERP节点信息:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
  // 其他ACL配置...
  
  "derpMap": {
    "OmitDefaultRegions": false, // 设置为true可禁用官方DERP节点
    "Regions": {
      "900": {
        "RegionID": 900,
        "RegionCode": "chn1",
        "RegionName": "China1",
        "Nodes": [
          {
            "Name": "cn-derp1",
            "RegionID": 900,
            "IPv4": "1.2.3.4", // 替换为您服务器的公网IP
            "DERPPort": 12345, // 与docker-compose中配置的端口一致
            "InsecureForTests": true // 使用自签名证书时需要设置为true
          }
        ]
      }
    }
  }
}

注意事项:

  • RegionID在900-999之间是预留给自定义DERP节点的,避免与官方节点冲突
  • RegionCodeRegionName可以自定义,建议使用有意义的名称
  • IPv4必须是服务器的公网IP地址
  • DERPPort必须与Docker配置中暴露的端口一致
  • InsecureForTests设置为true是因为我们使用了自签名证书
  1. 保存配置后,Tailscale控制面板会自动将新的DERP配置推送到所有连接的设备。这个过程可能需要几分钟时间,具体取决于设备数量和网络状况。

4.6 验证DERP节点是否工作

成功部署后,我们需要验证DERP节点是否正常工作。有两种主要的验证方法:

方法一:使用网络连接测试

在任何一台已连接到Tailscale网络的设备上,运行以下命令:

1
tailscale netcheck

这个命令会检测当前设备能够连接到哪些DERP节点,以及它们的延迟情况。在输出结果中,应该能看到我们自建的DERP节点信息,如果显示延迟数值(而不是超时),说明节点连接正常。

方法二:使用Ping测试

当两台设备无法直接建立P2P连接时,Tailscale会自动通过DERP节点中继流量。我们可以通过ping测试来验证:

1
tailscale ping 另一台设备的Tailscale IP

如果在输出中看到类似via DERP(cn-derp1)的信息,说明流量正在通过我们自建的DERP节点中继,证明配置成功。

中继前后对比

我的测试结果如上图所示,左侧是使用自建服务器之前,右侧是使用自建中转节点之后。其中第一条命令的机器porser是国内异地,都是先中转再打洞成功,明显看到使用自建DERP节点后,中转的时间显著下降。第二条命令的测试机器nerd是美国节点,经过自建DERP中转甚至比直连更快。第三调命令显示我们的DERP节点(sh)延迟只有15ms,比之前官方提供的最近节点(70ms)有了显著提升。

在实际使用中,您可能会注意到,当两台设备位于不同的网络环境时(如一台在家庭网络,一台在移动网络),它们很可能会通过DERP节点通信。而当设备在同一网络环境时,Tailscale会尽可能建立直接的P2P连接,不使用DERP中继。

5 常见问题与解决方案

在部署和使用自建DERP节点的过程中,您可能会遇到各种问题。以下是一些常见问题及其解决方案:

问题:无法连接到DERP节点

这通常是由网络配置或服务器设置导致的。首先,检查服务器防火墙是否开放了DERP服务使用的端口(在我们的例子中是12345和3478/UDP)。大多数云服务商除了操作系统防火墙外,还有额外的安全组或网络ACL设置,确保这些也已正确配置。

其次,确认docker-compose.yml中的配置是否正确,特别是端口映射和环境变量设置。可以通过docker logs derper查看容器日志,寻找可能的错误信息。

最后,验证服务器上的Tailscale客户端是否正常登录,可以通过tailscale status命令查看。如果客户端未登录或状态异常,可能会导致DERP服务无法正常工作。

问题:连接DERP成功但设备之间无法通信

这种情况通常与Tailscale的访问控制设置有关。首先,检查ACL配置是否正确,确保相关设备有互相访问的权限。Tailscale的ACL功能非常强大,可能需要仔细检查是否有意外的访问限制规则。

其次,确认设备间的子网路由设置。如果涉及到访问设备所在的子网(而不仅是设备本身),需要在Tailscale客户端启用子网路由功能,并在ACL中授权相应的子网访问权限。

使用tailscale status命令可以查看当前网络中所有设备的连接状态,包括它们是否通过P2P直连或DERP中继通信。这有助于诊断具体的连接问题。

问题:DERP连接速度较慢

DERP中继的性能受多种因素影响,包括服务器硬件配置、网络带宽、地理位置等。如果发现连接速度不理想,可以考虑以下优化方案:

升级服务器配置,特别是网络带宽。DERP服务对CPU和内存要求不高,但带宽是关键因素,尤其是当多台设备同时通过中继通信时。

优化服务器的网络配置,如调整TCP/IP参数,开启BBR等拥塞控制算法,这可能会提高网络吞吐量。

如果条件允许,可以在不同地理位置或使用不同ISP的服务器上部署多个DERP节点,通过derpMap配置让Tailscale网络使用距离最近或延迟最低的节点。

问题:服务器重启后DERP服务不自动启动

确保Docker服务配置为开机自启动:

1
systemctl enable docker

同时,在docker-compose.yml中已经设置了restart: always参数,这应该能确保Docker容器在服务重启后自动启动。如果仍有问题,可以创建一个系统服务或启动脚本,确保在系统启动时自动启动DERP服务。

6 总结与展望

我们已经成功在国内环境下建立了自己的Tailscale DERP节点,而且不需要域名和备案,大大提升了Tailscale的使用体验。这种方案不仅适用于个人用户,也适合小型团队或企业内部使用,能够在保证数据安全的同时,提供稳定、高效的异地组网服务。

自建DERP节点的方案解决了国内用户使用Tailscale面临的最大痛点——官方DERP节点连接不稳定的问题。通过国内服务器中继,不仅大幅降低了网络延迟,还提高了连接的稳定性和可靠性,让Tailscale这款优秀的组网工具在国内环境下发挥出应有的价值。

展望未来,随着网络技术的不断发展,我们可能会看到更多适合国内环境的P2P连接解决方案。Tailscale本身也在不断改进NAT穿透技术,增强直接P2P连接的成功率。但在当前阶段,自建DERP节点仍然是解决Tailscale在国内使用问题的最佳方案之一。

值得一提的是,除了本文介绍的方法外,还有其他一些改进Tailscale使用体验的方式,如使用Headscale作为自托管的控制服务器,以进一步增强网络的自主性和定制性。对于有更高要求的用户,这些方案也值得探索。

最后,感谢开源社区的贡献,尤其是yangchuansheng开发的ip_derper项目,让自建DERP节点变得如此简单。

7 参考资料

Buy me a coffee~
Tim 支付宝支付宝
Tim 贝宝贝宝
Tim 微信微信
0%