利用Tailscale构建自己的NAT网络方案:

Tailscale 是一个用户友好的 VPN 服务,允许用户在不同设备之间创建安全的网络连接。它利用 WireGuard 协议的高效性和安全性,提供了一个易于配置和管理的虚拟专用网络,它通过简化网络配置和增强安全性,使得创建和管理虚拟网络变得更加高效和便捷。

主要特点

  1. 易于设置
    • Tailscale 的安装和配置非常简单。用户只需在设备上安装客户端应用程序,并通过一个简单的登录过程即可连接到网络。
  2. 自动化网络配置
    • Tailscale 自动处理网络配置和防火墙设置,用户无需手动配置复杂的网络参数。
  3. 跨平台支持
    • 支持多种操作系统,包括 Windows、macOS、Linux、iOS 和 Android,使得不同设备之间的连接变得无缝。
  4. 安全性
    • 基于 WireGuard 协议,Tailscale 提供了强大的加密和安全性,确保数据在传输过程中的安全。
  5. 去中心化架构
    • Tailscale 使用点对点连接,减少了对中心服务器的依赖,提高了连接速度和可靠性。
  6. 访问控制
    • 提供细粒度的访问控制,用户可以轻松管理谁可以访问网络中的哪些资源。

使用场景

  • 远程工作:帮助分布式团队安全地访问公司内部资源。
  • 家庭网络:在家庭设备之间创建安全连接。
  • 开发者环境:为开发者提供安全的测试和开发环境。

并且对于个人用户来说是免费的:

image-20241017234516754

这是来自于官方手册,为了良好的使用,可以将服务器开启允许IP转发,如果您的 Linux 系统有一个/etc/sysctl.d目录,请使用:

1
2
3
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
sudo sysctl -p /etc/sysctl.d/99-tailscale.conf

否则使用:

1
2
3
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p /etc/sysctl.conf

启动IP转发后可以使用命令来启动子网路由,

1
sudo tailscale up --advertise-routes=192.168.233.0/24
  • --advertise-routes=192.168.233.0/24: 这个选项用于指定当前节点将向 Tailscale 网络中的其他节点“广告”或“广播”的路由。广告路由的作用是 其他 Tailscale 节点可以通过这个节点访问这两个子网中的设备。这通常用于连接不同的网络或子网,使得它们可以通过 Tailscale 网络进行通信。

使用方法

使用邮箱注册登录账号,下载符合自己平台的安装程序:

image-20241018090828145

安装好后,可以点击自己的admin console,我喜欢这个界面风格设计:

image-20241018091416751

要添加设备,可以点击右上角Add device,这里选择添加服务器,因为服务器可以选择做出口节点,这里只是赋予服务器可以用来做出口节点的属性:

image-20241018101204183

随后点击下边的生成脚本:

image-20241018101309776

复制命令到服务器上执行,安装完成后会自动启动。如果要将服务器作为出口IP,拿windows举例,右键任务栏的图标里即可切换出口节点:

image-20241019010124252

linux用户可以在启动时候添加命令:

1
sudo tailscale set --exit-node=<exit-node-ip>

要取消出口节点设置就在命令中添加空:

1
sudo tailscale up --exit-node=

自建节点

Tailscale在某些地区是没有节点的,会导致延迟特别的大,约等于不能用,官方有一篇自建节点的文章:

1
https://tailscale.com/kb/1118/custom-derp-servers

但是给我看的云里雾里的,首先默认需要所要搭载节点环境的服务器开放80,443,3478分别用来监听运行HTTP、HTTPS、STUN服务,可以自定义,但暂时不考虑自定义,先默认配置跑起来再说,首先安装derper,需要golang环境,而且比较新,我这里装的是1.23.3:

1
https://go.dev/doc/install
1
go install tailscale.com/cmd/derper@latest

然后启动服务,需要一个域名,官方文档里需要一个域名,但是据说也能用IP,我有域名,不过我推荐用域名,毕竟域名还可以CDN加速的:

1
sudo derper --hostname=your-hostname.com --verify-clients

装好之后会在服务器443端口开放一个web服务:

image-20241114231036567

然后应该是在tailscale官方管理面板,我一直以为是自己服务器会开一个管理面板,然而它并不是。在用户Access Controls面板中:

image-20241114231156182

仿照以下格式添加您自定义的节点:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
"derpMap": {
"OmitDefaultRegions": false, // 可以设置为 true,这样不会下发官方的 derper 节点,测试或者实际使用都可以考虑打开
"Regions": {
"900": {
"RegionID": 900, // tailscale 900-999 是保留给自定义 derper 的
"RegionCode": "myderp",
"RegionName": "myderp", // 这俩随便命名
"Nodes": [
{
"Name": "1",
"RegionID": 900,
"IPv4": "domain", // 你的域名
"InsecureForTests": true, // 因为是自签名证书,所以客户端不做校验
},
],
},
},
},

注意末尾的逗号,官方文档中没有”,”,需要自己添加,否则会报错。编辑完成后同样在官方管理面板中点击添加设备,一路按自己要求选择,然后添加设备,操作如上一样。

开启自启

创建服务:

1
sudo nano /etc/systemd/system/derper.service 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[Unit]
# 服务名字
Description=Tailscale DERP Server
# 在网络服务启动后启动这个服务
After=network.target

[Service]
# 改成你的用户名
User=admin
# 总是自动重新启动
Restart=always
# 重启前等待5秒
RestartSec=5
# 启动derper的命令,跟上面测试用的命令一样
ExecStart=/usr/local/bin/derper --hostname=derp.mydomain.com -verify-clients

[Install]
WantedBy=multi-user.target

载入服务变更:

1
sudo systemctl daemon-reload

启动服务:

1
sudo systemctl start derper

创建开机启动:

1
sudo systemctl enable derper