内网穿透方案的示例

由于大多数网络设备存在与路由器的背后,并不具有公网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台设备的服务。

官网:https://www.zerotier.com/

使用方式:在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不是很有必要。网上有一些文章,我自己没有做测试,仅供参考:

留下评论