内⽹穿透⼯具对⽐FRP+NPS+Zerotier与NAT服务器测试
中展⽰了私有云盘的搭建⽅式,但仅能本地访问肯定⽆法满⾜有私有云⽤户的需求,于是笔者尝试了多个流⾏的内⽹穿透⼯具,⾸先说明⼀下笔者⽬前的配置情况,可道云是通过树莓派挂载的,到达公⽹前⾄少有两次NAT,服务器有⼀个⾹港的普通服务器( 30M 带宽)和两个江苏的NAT服务器( 100M 带宽),笔者将分别在两种服务器上使⽤三个软件,并介绍安装和配置⽅法以及注意事项
⾸先解释⼀下NAT服务器,与普通服务器不同的是,NAT服务器是多个⽤户共⽤ IP 的,仅能使⽤⼗个⾄⼏⼗个端⼝,有的是直接划分好端⼝段( OLVPS ),服务器上⽤防⽕墙打开对应端⼝即可使⽤,有的可以⾃⾏设定端⼝映射( CloudIPLC ),但是在公⽹上只能打开 1 万以上的端⼝号,且可能已经被占⽤
FRP 和 NPS 的原理都相近,⼀个主(Server)多个从(Client),通过⼀个端⼝(TCP复⽤)使多个从服务器的端⼝映射到主服务器上,使得访问主服务器端⼝时,能获得访问从服务器对应端⼝的⽬的。以本⽂的需求为例,假如我在树莓派的 5000 端⼝上挂载了⼀个⽹页服务,想通过公⽹访问,则可以将树莓派的 5000 端⼝映射到公⽹服务器的 6000 端⼝,然后访问公⽹服务器的6000端⼝即可访问⽹页,其他的可以⼀⼀映射,如5100到6001,5200到6002,如下图所⽰
NAT 服务器稍有不同,即多了⼀层映射,需要将 NAT 服务器的内⽹端⼝映射到公⽹端⼝上,假设需求和上图相同,则需要将树莓派的 5000、 5100 和 5200 端⼝映射到 NAT 服务器的 6000 、 6001 、 6002 端
⼝上,数据沟通端⼝则填写 37000 ⽽不是 7000 ,然后⽤户通过访问36000 、 36001 和 36002 可获得相同效果,如下图所⽰
那么下⾯进⼊部署阶段
FRP
⼀个由 go 语⾔实现的内⽹穿透⼯具,优点是下载即⽤,不需要安装,可以在不同服务器间拷贝,直接运⾏即可,缺点是官⽅提供的 WebUI ⾮常鸡肋,可以直接忽略,本⽂使⽤的是 0.34.1 版本
github/fatedier/frp
普通服务器
Server端
笔者⼀般先部署 Server 端,因为调试逻辑会更加简单,⾸先去官⽹下载 Release 包,注意区别服务器系统版本,解压压缩包之后给予 frps ⽂件执⾏的权限,当然最简单的⽅式就是整个⽬录递归赋予777权限(笔者通过 WinSCP 操作的),然后修改frps.ini,笔者使⽤的设置为
[common]
bind_port = 7000
kcp_bind_port = 7000
token =服务器间通信密码
dashboard_port = 7001
dashboard_user =⽤户名
dashboard_pwd = WebUI密码
log_file = /root/log/frps.log
log_level = info
log_max_days = 7
其中含有 dashboard 的⼏个变量都是和 WebUI 相关的,不使⽤该功能的话可以直接删掉,然后切换到⽬录下运⾏看是否报错(记得先创建log ⽂件夹,不知道为什么这些软件连创建⽂件夹都不会),如果未正常开启可以在 log ⽂件中查看⽇志并修正
./frps -c ./frps.ini
Client端
解压后修改配置⽂件frpc.ini,注意和上⾯的区别,别修改或运⾏错了
[common]
server_addr =服务器ip
server_port = 7000
token =服务器间通信密码
protocol = kcp
log_file = /root/log/frpc.log
log_level = info
log_max_days = 7
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
[web]
type = tcp
local_ip = 127.0.0.1
local_port = 80
remote_port = 6001
将服务器 ip 和密码设置好后就可以运⾏了,如果使⽤的是 kcp 协议,需要放⾏通信端⼝(如上⽂中的 7
000 端⼝)的 udp 协议,也可以使⽤默认的 tcp 协议,下⽅模块的 type 中的协议不需要更改,更多协议可以参考官⽅⽂档
./frpc -c ./frpc.ini
这时建议先两边都⽤ ssh 客户端直接运⾏命令开启服务并验证是否可以连通,如果⼀切正常再使⽤其他⽅式后台运⾏,如果⽆法连接,下⾯列出了⼏个常见的解决思路
1、查看 log ⽇志的报错信息,其中 log ⽇志所在的⽬录需要提前创建,然后根据错误信息来排查问题
2、查看是否端⼝已经被占⽤ netstat -lnp|grep 端⼝号
3、查看两侧防⽕墙是否均放⾏所有相应的端⼝的 tcp 协议,其中 kcp 需要放⾏沟通端⼝(如上⽂中的7000)的 tcp + udp 协议
4、从外部查看端⼝是否开放(测服务器的),需要开启服务后即有程序监听端⼝后查看, coolaf/tool/port
5、frpc.ini 配置⽂件⾥⾯的模块是否重名,可能因为复制粘贴忘记修改⽽重名以⾄⽆法开启服务
NAT服务器
Server端
和上⾯完全相同,如果是⼿动开启映射的服务器,记得在使⽤ kcp 协议的时候,增加⼀条 udp 的映射
Client端
稍有不同的是需要将 server_port 改为映射后的端⼝,如上图中的 37000 ,server_addr 实测⽀持填写域名
NPS
⼀个同样由 go 实现的内⽹穿透⼯具,但官⽅提供了更好的 WebUI ,并且可以直接操作 Server 端就能完成映射,在增减映射的时候不⽤重启服务,避免了想重启服务但关闭服务导致 ssh 掉线然后服务⽆法开启因此失联的尴尬局⾯,当然,为了更保险起见,笔者同时开了 FRP 和 NPS 服务,防⽌掉线后⽆法重连的尴尬,当然,后⾯加⼊了 ZeroTier  实现了三重保险,本⽂使⽤的是 0.26.9 版本
github/ehang-io/nps
普通服务器
Server端
下载Release包,解压然后进⼊⽬录,安装
./nps install
默认情况下,服务会安装到  /etc/nps  ⽂件夹中,编辑配置⽂件  /etc/nps/f
⼀般情况下修改这四⾏内容即可
http_proxy_port=未被占⽤的端⼝
https_proxy_port=未被占⽤的端⼝
web_username=⽤户名
web_password=密码
因为很可能服务器的80和443端⼝已经⽤来开启其他服务⽐如被 Nginx 监听了,所以直接运⾏会报错,因此需要修改成未被占⽤的端⼝,并填写后台管理⽤的⽤户名和密码,在放⾏ 8080 端⼝后开启服务就可以访问到后台了
nps start
点击客户端 - 新增 - 新增使⽤默认配置新增⼀个服务器,可以⾃⾏选择是否加密和压缩,然后点击隧道 - 新增新增⼀个映射,以上图为例,则服务器端⼝填写 6000 ,⽬标 (IP:端⼝)  填写路由器下内⽹:5000或者127.0.0.1:5000
然后返回客户端列表点击服务器左侧加号,可以得到⼀条如下所⽰的客户端命令,复制后配置客户端时使⽤,记得放⾏防⽕墙端⼝
./npc -server=服务器IP:端⼝(默认8024) -vkey=⾃动⽣成的密钥 -type=tcp
如果需要修改默认端⼝ 8024 ,可以修改  bridge_port  后重启⽣效(理论上,笔者未测试),卸载可以执⾏  nps uninstall  后通过whereis nps  到残留⽂件删除即可
Client端
⾸先防⽕墙放⾏相应端⼝,然后解压压缩包然后进⼊⽬录并执⾏上⾯复制的客户端命令,理论上,刷新后台即可看到客户端状态均变为绿⾊,因为是直接⽤ ssh 执⾏的命令,因此如果未正常连接,可以通过⽇志来查错和修正,基本的排查错误的思路和 FRP 相同
NAT服务器
Server端
和上⾯完全相同
Client端
稍有不同的是需要将客户端命令改为映射后的端⼝,如上图中的 37000 ,服务器IP  实测⽀持填写域名
ZeroTier
如果阅读了上⾯两个⼯具的 Github 页⾯或者官⽅⽂档,就会发现,⾥⾯都提到了⼀个 P2P 的连接⽅式,但是笔者尝试后会发现存在诸多问题且很多时候⽆法连接,官⽅也表名并不稳定,那么,有没有⼀个专门做 P2P 连接的⼯具呢,这个就是了,⼀个使⽤ CPP 和 C 实现的内⽹穿透⼯具,并且组建的是局域⽹,本⽂使⽤的是 1.4.6 版本
github/zerotier/ZeroTierOne
Leaf 节点(叶⼦节点)
这⾥⾯的概念发⽣了⼀些变化,因为这个的⽬的是将所有⽤户连接起来形成⼀个局域⽹,因此所有⽤户都是平等的,也就没有服务端和客户端的区别了,增加⼀个⽤户相当于增加了⼀个 Leaf 节点,可以使⽤⼀键安装包, Windows ⽤户去下载 exe ⽂件安装即可,如果 debian 系统下提⽰没有 sudo 同时已经在 root ⽤户下,去掉 sudo 即可
curl -s ier | sudo bash
如果安装时提⽰  NO_PUBKEY 1657198823E52A61  ,则需要添加公钥,这种情况⼀般是使⽤了第三⽅的镜像导致的,⽐如清华源、阿⾥源
apt-key adv --keyserver keyserver.ubuntu --recv-keys 1657198823E52A61
安装完后就可以通过  zerotier-cli  配置服务器了,⾸先,开启服务并设置开机⾃启
systemctl start zerotier-one
systemctl enable zerotier-one
打开官⽹创建账号然后新增⽹络
my.zerotier/network
然后获得⼀个  Network ID  ,所有节点加⼊⽹络都使⽤相同的命令,Windows 下就使⽤管理员权限的 CMD 来执⾏
zerotier-cli join ID
如果成功则会返回
200join success
然后打开防⽕墙 9993 的 udp 协议,Windows 下⾃动打开了,⽆需⼿动操作
然后在官⽹中打开该⽹络的设置页⾯,在  Members  中就会多出⼀个成员,即 Leaf 节点,左侧打钩即可同意加⼊⽹络,同时会显⽰版本号和公⽹ IP 并分配⼀个内⽹ IP ,当有超过两个节点之后,就可以通过内⽹IP  Managed IPs  相互连通了,这个页⾯似乎是会进⾏ ajax 刷新的,所以不需要⼿动刷新
Moon节点(⽉亮节点)
但如果连接国外 Planet 节点(⾏星节点)的效果不够好怎么办,可以⾃⾏搭建 Moon 节点当中转站,⾸先,将 Moon 节点按上⾯⽅法加⼊⽹络并授权,然后新增 Moon 配置
cd /var/lib/zerotier-one
zerotier-idtool initmoon identity.public > moon.json
修改配置⽂件  moon.json  ,在括号内填⼊服务器的公⽹ IP 和端⼝,注意需要双引号,同时复制ID,位于  ["id": "18fasd2319"] 内,后⾯让其他 Leaf 节点加⼊时使⽤
"stableEndpoints": ["公⽹IP/9993"]
在该⽬录下⽣成 Moon ⽂件,⽂件名类似于
zerotier-idtool genmoon moon.json
新增 moons.d ⽂件夹,即  /var/lib/zerotier-one/moons.d/  ,将 ⽂件移⼊,然后重启服务
systemctl restart zerotier-one
其他节点绑定 moon 节点的⽅式都是输⼊以下命令, ID 需要改为上⾯复制的 ID
zerotier-cli orbit 18fasd231918fasd2319
重启服务后查看是否添加成功
zerotier-cli listpeers
zerotier-cli listmoons
listpeers 列出了局域⽹内所有的节点,包括官⽅的⾏星中转节点 Planet 、所有⽤户的叶⼦节点 Leaf 以及⾃建的⽉亮中转节点 Moon ,⼀⾏为⼀个节点,如果没有看到 Moon 节点则添加失败, listmoons 如果返回为空则失败
当然 Linux 下可以新建⽬录  /var/lib/zerotier-one/moons.d/  ,然后复制⽣成的 moon ⽂件到⽂件夹下,重启服务后查看是否⽣效
Windows下的默认⽬录在  C:\ProgramData\ZeroTier\One\moons.d\  ,新建该⽂件夹然后复制进去,重启(停⽌然后启动)服务(打开开始菜单然后搜索服务即可到)即可,如果执⾏ zerotier-cli 的命令时出现missing authentication token,则需要⽤管理员⾝份启动 CMD ,如果出现了服务不正常的情况,⽐如右键状态栏中图标发现没有节点,可以尝试⼿动重启服务或重启电脑
两个 Leaf 节点如果打通则通过 9993 端⼝的 UDP 协议连接,速度取决于两端的带宽和延时,与中转节点⽆关,如果两个 Leaf 节点之间未能成功打通,则会⾛服务器中转
NAT服务器对⽐
⽆论如何都要选择 KVM 架构的服务器,⼀般都有标明的,这个可玩性才⾼,⼀般情况下价格也不会⾼很多服务器
CloudIPLC
www.cloudiplc/
需要实名认证,仅能开启⼀个服务器,电信移动联通均有,最便宜的 1C+384M+4G+600G ,价格为30元⼀个⽉,这个⼤⼩的内存如果重装纯净版,仅能安装 Debian9 , CentOS 和 Debian10 都是装不上的,512M 的内存可以装 Debian10 ,具体的重装教程请阅读下⼀篇⽂章
需要⼿动映射内⽹端⼝到公⽹端⼝上,TCP和UDP分开映射,考虑 ssh 端⼝占⽤⼀条,则可以配置额外⼗条映射规则
如果使⽤ FRP 的 KCP 模式,通信端⼝占⽤ TCP + UDP 两条映射规则,则可以映射 8 个额外的端⼝
如果使⽤ NPS ,通信和 WebUI 占⽤两个端⼝,同样有额外 8 个端⼝可⽤,如果使⽤纯⽂本配置,则多⼀个,但是会⿇烦很多,⽤ NPS 就是看上了他的 WebUI
如果使⽤ ZeroTier,emmmmmm,为什么要为⼀个中转功能开⼀个 NAT 服务器啊淦,随便开个普通的服务器就好了,或者直接⽤官⽅的节点
不过不太能够理解的是,因为不明原因,在穿透可道云的时候,加载含⼤⽂件的⽂件夹时百分百会出现 
Ajax Error ,且⽆法打开  AriaNG,在重装清华源 Debian9 、开启 BBR 、检查 MTU 、⼿动部署 Nginx-1.14.2 、⼿动部署 PHP7.3-FPM 、提⾼所有超时和⼤⼩限制、开启UDP 之后问题依旧,服务器提供商表⽰问题你们⾃⼰解决,可道云开发者表⽰不关我事,遂放弃。不过在下载时,速度⽐较稳定,能长期维持 5MB/s 的速度,因为百兆是进出⼝带宽,在中转的时候同时进出,所以满速就是 5MB/s 左右,如果有 dalao 能解决上述问题,欢迎评论区留⾔和讨论
OLVPS
olvps/
不需要实名认证,能开启多个服务器,电信移动联通均有,最便宜的仅有 256M 内存,考虑到上⾯的经历,尝试了下 512M 内存的服务器,价格稍贵,读者可以尝试更便宜的那⼀款,进去后成功重装清华源的 Debian10
固定开启⼀个端⼝段,需要在使⽤的时候将端⼝改到相应的端⼝段内,不过好处是 TCP 和 UDP 可以同时开启,直接在防⽕墙上放⾏即可,因此最多有 10 个端⼝(相当于20 条映射规则)
测试可道云穿透和 AriaNG 穿透均正常,不过速度不是很稳定,经常会掉到⼏百 K ,在开启 BBR 之后情况依旧,那么,有什么理由让我不使⽤ ZeroTier 呢

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。