由于大多数网络设备存在与路由器的背后,并不具有公网IP,因此要访问这些内网中的设备,就需要内网穿透方案。理想状态是内网穿透后实现P2P通信,但如果双方的路由器设备不支持,就只能通过具有公网IP的服务器做数据中转了。网上有很多内网穿透方案,引用wslzy007的发言:
1 、如果是共享需求(外网–》内网)访问建议 frp 吧( https://github.com/fatedier/frp )
2 、如果非共享需求(内网–》内网),只是希望安全穿透访问私有资源,首选 smarGate,支持 P2P ( https://github.com/lazy-luo/smarGate )
3 、如果想异地组网,选择类 vpn 解决方案,如 tinc/zerotier/openvpn 等
我之前常用frp来访问家里的电脑等设备,最近由于在折腾Moonlight串流游戏,就又转向了组建虚拟局域网的ZeroTier。上面说的smarGate,我看了介绍,还是不太清楚其优点,就先搁置。因此这里简单说下frp,重点做一下ZeroTier的笔记。
一、frp
frp是反向代理软件,需要内网设备和中转服务器分别安装软件,而访问内网资源的设备不需要安装软件。最近也支持了P2P,但成功率不高而且不够智能。
官网:https://github.com/fatedier/frp
官方文档比较全面,而且使用简单,我就写基本教程了。
二、ZeroTier
用于组建虚拟局域网,使用ZeroTier做软交换机,需要各个终端都安装软件(创建虚拟网卡)。各个设备虽然可能处于不同的物理内网之中,但它们之间会尝试通过P2P直连,如果直连失败则通过服务器进行数据中转。ZeroTier官方免费提供单个虚拟局域网支持高达50台设备的服务。
使用方式:在ZeroTier官网注册,创建一个虚拟局域网。然后各个设备安ZeroTier软件,分别申请加入这个虚拟局域网,创建者在官网同意即可完成 。
如果能顺利建立P2P连接自然是好,但如果不能,则通过ZeroTier官方服务器进行数据中转的延迟就比较大了。这时我们就需要利用具有公网IP的服务器来替代官方服务器,官方文档:https://docs.zerotier.com/self-hosting/introduction。有两种方案,一是部署moon,二是部署planet。这俩的区别在于,moon是仅提供数据中转服务,而planet则是提供包括数据中转、权限管理等所有服务(完全绕开官方服务)。一般的,部署moon即可。
服务器部署moon
官方文档:https://docs.zerotier.com/zerotier/moons/
1、安装ZeroTier
curl -s https://install.zerotier.com/ | sudo bash
2、加入ZeroTier局域网
执行命令:zerotier-cli join<network id>
,例如
zerotier-cli join b23333333333333
3、生成moon配置文件
cd /var/lib/zerotier-one
zerotier-idtool initmoon identity.public > moon.json
编辑moon.json文件,修改”stableEndpoints”字段为服务器的公网IP。9993是Moon默认服务端口(UDP),记得放开防火墙设置。例如:"stableEndpoints": [ "123.123.123.123/9993" ]
保存后,执行:
zerotier-idtool genmoon moon.json
会在/var/lib/zerotier-one
文件夹下生成一个类似0000001a12a3c998.moon
的文件。
在/var/lib/zerotier-one
文件夹下新建moons.d文件夹,并将刚才生产的文件放进去。
4、重启ZeroTier
service zerotier-one restart
客户端使用moon
1、复制配置文件
将配置文件(0000001a12a3c998.moon
)存放入ZeroTier安装路径的moons.d文件夹(需要新建)下,各个平台的安装路径如下:
- Windows:
C:\ProgramData\ZeroTier\One
- Macintosh:
/Library/Application Support/ZeroTier/One
- Linux:
/var/lib/zerotier-one
- FreeBSD/OpenBSD:
/var/db/zerotier-one
2、执行zerotier-cli orbit命令
语法是zerotier-cli orbit <zerotierID> <zerotierID>
,其中zerotierID是服务器的ID,配置文件去掉前面的六个0就是。例如:
zerotier-cli orbit 1a12a3c998 1a12a3c998
接下来通过执行zerotier-cli listpeers
命令查看连接是否有MOON标记,例如:
由于官方安卓端不支持使用moon,因此可以选择第三方客户端:https://github.com/kaaass/ZerotierFix
服务器部署plant
ZeroTier官方服务器在国内虽然延迟有点儿高,但还是是可以正常访问的,因此部署plant不是很有必要。网上有一些文章,我自己没有做测试,仅供参考: