写在前面
之前介绍过nps内网穿透,这次介绍的ZeroTier&Tailscale这两种服务相比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.创建网络
创建一个新的网络之后,我们得到一个 Network ID,这个在后面的设备连接时需要用到,点击刚刚创建的网络我们可以设置更多选项。强调一下不懂的不要乱设置默认就好。
3.设备加入虚拟网络
① openwrt(flippy大的固件已经编译直接启动即可)
② linux
[root@5b88595860bc /]# curl -s https://install.zerotier.com/ | bash
[root@5b88595860bc /]#/usr/sbin/zerotier-cli join <Network 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。
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打洞成功。
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
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,登录后会看到如下页面。
2.安装并加入虚拟网络
OpenWrt
SSH 终端进入 OpenWrt ,下载 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*
版本更新:
在这里找到适应平台架构的包文件,下载解压替换 OpenWrt 中的 /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
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 异地组建虚拟局域网