写在前面

之前介绍过nps内网穿透,这次介绍的ZeroTierTailscale这两种服务相比nps,frp这些程序更方便,更适合小白以及没有服务器的用户。
注意:并不是所有情况下都能实现p2p穿透,如果无法进行p2p穿透,ZeroTier&Tailscale都将默认使用流量转发的方式实现内网穿透(由于这两种服务只有境外服务器,在国内使用效果很差)。另外,国内相同运行商之间p2p穿透成功率较高(比如电信<==>电信),不同运行商之间成功率较低(比如电信<==>联通),具体情况需要自行测试。下面会分别介绍两种服务的安装以及使用(基本原理差不多)。


zerotier

Connect team members from anywhere in the world on any device.
ZeroTier creates secure networks between on-premise, cloud, desktop, and mobile devices.

1.注册

非常简单不赘述,免费套餐能连接 100 个设备。

2.创建网络

创建虚拟网络
创建一个新的网络之后,我们得到一个 Net­work ID,这个在后面的设备连接时需要用到,点击刚刚创建的网络我们可以设置更多选项。强调一下不懂的不要乱设置默认就好。
查看ID

3.设备加入虚拟网络

① openwrt(flippy大的固件已经编译直接启动即可)
② linux

[root@5b88595860bc /]# curl -s https://install.zerotier.com/ | bash
[root@5b88595860bc /]#/usr/sbin/zerotier-cli join <Net­work ID>
200 join OK
[root@5b88595860bc /]# /usr/sbin/zerotier-cli listnetworks        
200 listnetworks      
[root@5b88595860bc /]# /usr/sbin/zerotier-cli listnetworks
200 listnetworks   
#一些可能需要的命令
#获取地址和服务状态
zerotier-cli status
#加入、离开、列出网络
zerotier-cli join <Network ID>
zerotier-cli leave <Network ID>
zerotier-cli listnetworks

③ ios国区没有此软件,需要使用外区账户搜索ZeroTier one
④ 其他客户端可以去官方下载页面查看

4.允许设备连接到虚拟网络

返回到刚刚创建的network详细页面,找到下方Members,如果上述设备成功加入,这里会看到设备ID,默认是不允许连接到虚拟网络的,我们点击设备ID前面的√进行Auth。
Auth设备

5.测试连接

主要使用ping命令查看是否能连接到创建的虚拟网络,以及是否使用p2p传输,这里只介绍使用linux进行查看。

#在linux服务器上ping虚拟网络设备内的ip地址,注意这个ip是zerotier分配的,不是设备本身的ip
ping xxx.xxx.xxx.xxx

通过ttl以及time可以判断是否p2p,对于使用国内linux服务器<==>家里内网通讯,延时time不应该过高,对于linux服务器,ttl=64可以估计仅经过1层路由,每减小1,表示经过一层路由。例如下面的示例就表明p2p打洞成功。
p2p打洞成功

6.自动允许客户端 NAT(可选)

通过前面的教程,已经可以在外部环境连接家里openwrt(或其他设备),但是我们可以更进一步,通过这一台设备与外部互联达到访问家里全部设备的目的。

  • ①勾选允许客户端NAT,其他设备参考官方文档
  • ②查询内网网段,linux通过ifconfig,windows通过cmd使用ipconfig查询网卡ip,一般家里ip都是192.168.x.x,那么网段可以写成192.168.x.0/24
  • ③在zerotier的Advanced-Managed Routes中添加内网网段,via后面填写zerotier为openwrt分配的虚拟网络ip
    自动允许客户端 NAT

7.开始使用

然后就可以通过手机,或者其他设备连接到家里这台设备(比如openwrt),连接成功后直接输入内网ip就可以直接访问内网设备,就和在家一样,非常方便!


tailscale

A secure network that just works Zero config VPN. Installs on any device in minutes, manages firewall rules for you, and works from anywhere.

1.注册

免费账户无法使用邮箱注册,国内用户建议使用Microsoft登录,免费套餐能连接 20 个设备。
注意:tailscale使用的是相同邮箱登录绑定的自动加入同一个内网,所以,不需要network id,登录后会看到如下页面。
tailscale设备

2.安装并加入虚拟网络

  • OpenWrt
    SSH 终端进入 Open­Wrt ,下载 openwrt-tailscale-enabler -> Releases 发布页面

    # 进入 root 目录
    cd /root
    # 下载 openwrt-tailscale-enabler 
    #建议查看releases页面下载最新版本
    wget -4 https://github.com/adyanth/openwrt-tailscale-enabler/releases/download/v1.18.2-fed5960-autoupdate/openwrt-tailscale-enabler-v1.18.2-fed5960-autoupdate.tgz

    提取文件覆盖到系统根目录:

    #文件名称换成刚刚下载的,不要照抄
    tar x -zvC / -f openwrt-tailscale-enabler-v1.18.2-fed5960-autoupdate.tgz

    安装依赖:

    # 更新包列表
    opkg update
    # 安装依赖
    opkg install libustream-openssl ca-bundle kmod-tun

    首次运行:

    # 启动 tailscale 守护进程
    /etc/init.d/tailscale start
    # 屏幕打印 tailscale 登录地址,进行授权登录
    tailscale up --accept-dns=false

    完成后可以通过ping检查是否穿透成功
    开机启动:

    # 加入开机启动
    /etc/init.d/tailscale enable
    # 验证是否成功加入开机启动项:
    ls /etc/rc.d/S*tailscale*

    版本更新:
    这里找到适应平台架构的包文件,下载解压替换 Open­Wrt 中的 /usr/bin/tailscale 和 /usr/bin/tailscaled 这两个文件。

  • Docker
    使用官方的dockerfile自行build
  • ios国区没有此软件,需要使用外区账户搜索Tailscale
  • 其他平台查看官方文档

3.设备禁用密钥过期(可选)

Tailscale 为了安全,每隔 6 个月会要求重新进行身份验证。为避免发生这种情况时访问中断,访问 管理面板 在 Machines(设备列表)中找到需要禁用的设备,并选择 Disable Key Expiry (禁用密钥过期),让设备免受中断的长期使用下去。
设备禁用密钥过期

4.自动允许客户端 NAT(可选)-->官方文档

与zerotier一样,不再赘述

  • ①查询内网网段,不赘述
  • ②在对应的内网机器上,开启自动允许客户端 NAT,linux使用下面命令

    #替换自己的内网网段
    tailscale up --advertise-routes=192.168.1.0/24 --accept-dns=false
  • ③在tailscale管理页面开启Subnet routes
    开启Subnet routes

5.开始使用

写在最后

这两种程序基本原理差不多,如果能实现p2p自然是很方便,如果无法p2p打洞就使用服务器流量转发,效果很差。我体验下来,zerotier在我的网络环境下好用很多,tailscale完全连不上服务器。

最后再多嘴一句

注意:这种内网穿透的方式,只对添加的客户端NAT有效,按照上面的例子就是只有访问192.168.1.0/24网段才会走虚拟网卡p2p穿透,访问正常的网页等都是走本机网络,可以在连接上vpn后使用ipip.net查询本机ip就可以理解!

[root@server ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.17.63.253   0.0.0.0         UG    0      0        0 eth0
10.147.19.0     0.0.0.0         255.255.255.0   U     0      0        0 ztrf2zdtw6
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
192.168.1.0     10.147.19.197   255.255.255.0   UG    0      0        0 ztrf2zdtw6
##通过查看路由表,对于来自192.168.1.0的数据通过虚拟网卡,然后走本机网络出,对于来自0.0.0.0(任意)走本机(也就是eth0)出,这种方式的优点就是不影响网络,而且可以和在家一样,使用内网服务!

参考文章

ZeroTier 无公网IP实现内网穿透详细教程(P2P高效传输)
Tailscale:基于 WireGuard 异地组建虚拟局域网

最后修改:2024 年 05 月 28 日
如果觉得我的文章对你有用,请随意赞赏