中展⽰了私有云盘的搭建⽅式,但仅能本地访问肯定⽆法满⾜有私有云⽤户的需求,于是笔者尝试了多个流⾏的内⽹穿透⼯具,⾸先说明⼀下笔者⽬前的配置情况,可道云是通过树莓派挂载的,到达公⽹前⾄少有两次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 版本
https://github.com/fatedier/frp
普通服务器
Server端
笔者⼀般先部署 Server 端,因为调试逻辑会更加简单,⾸先去官⽹下载 Release 包,注意区别服务器系统版本,解压压缩包之后给予 frps⽂件执⾏的权限,当然最简单的⽅式就是整个⽬录递归赋予 777 权限(笔者通过 WinSCP 操作的),然后修改 frps.ini ,笔者使⽤的设置为[common]bind_port = 7000kcp_bind_port = 7000token = 服务器间通信密码dashboard_port = 7001dashboard_user = ⽤户名dashboard_pwd = WebUI密码log_file = /root/log/frps.loglog_level = infolog_max_days = 7
其中含有 dashboard 的⼏个变量都是和 WebUI 相关的,不使⽤该功能的话可以直接删掉,然后切换到⽬录下运⾏看是否报错(记得先创建log ⽂件夹,不知道为什么这些软件连创建⽂件夹都不会),如果未正常开启可以在 log ⽂件中查看⽇志并修正./frps -c ./frps.iniClient端
解压后修改配置⽂件 frpc.ini,注意和上⾯的区别,别修改或运⾏错了[common]
server_addr = 服务器ipserver_port = 7000token = 服务器间通信密码protocol = kcp
log_file = /root/log/frpc.loglog_level = infolog_max_days = 7[ssh]type = tcp
local_ip = 127.0.0.1local_port = 22remote_port = 6000[web]type = tcp
local_ip = 127.0.0.1local_port = 80remote_port = 6001
将服务器 ip 和密码设置好后就可以运⾏了,如果使⽤的是 kcp 协议,需要放⾏通信端⼝(如上⽂中的 7000 端⼝)的 udp 协议,也可以使⽤默认的 tcp 协议,下⽅模块的 type 中的协议不需要更改,更多协议可以参考官⽅⽂档./frpc -c ./frpc.ini
这时建议先两边都⽤ ssh 客户端直接运⾏命令开启服务并验证是否可以连通,如果⼀切正常再使⽤其他⽅式后台运⾏,如果⽆法连接,下⾯列出了⼏个常见的解决思路
1、查看 log ⽇志的报错信息,其中 log ⽇志所在的⽬录需要提前创建,然后根据错误信息来排查问题2、查看是否端⼝已经被占⽤ netstat -lnp|grep 端⼝号
3、查看两侧防⽕墙是否均放⾏所有相应的端⼝的 tcp 协议,其中 kcp 需要放⾏沟通端⼝(如上⽂中的7000)的 tcp + udp 协议4、从外部查看端⼝是否开放(测服务器的),需要开启服务后即有程序监听端⼝后查看, http://coolaf.com/tool/port5、frpc.ini 配置⽂件⾥⾯的模块是否重名,可能因为复制粘贴忘记修改⽽重名以⾄⽆法开启服务
NAT服务器
Server端
和上⾯完全相同,如果是⼿动开启映射的服务器,记得在使⽤ kcp 协议的时候,增加⼀条 udp 的映射Client端
稍有不同的是需要将 server_port 改为映射后的端⼝,如上图中的 37000 ,server_addr 实测⽀持填写域名
NPS
⼀个同样由 go 实现的内⽹穿透⼯具,但官⽅提供了更好的 WebUI ,并且可以直接操作 Server 端就能完成映射,在增减映射的时候不⽤重启服务,避免了想重启服务但关闭服务导致 ssh 掉线然后服务⽆法开启因此失联的尴尬局⾯,当然,为了更保险起见,笔者同时开了 FRP和 NPS 服务,防⽌掉线后⽆法重连的尴尬,当然,后⾯加⼊了 ZeroTier 实现了三重保险,本⽂使⽤的是 0.26.9 版本
https://github.com/ehang-io/nps
普通服务器
Server端
下载Release包,解压然后进⼊⽬录,安装./nps install
默认情况下,服务会安装到 /etc/nps ⽂件夹中,编辑配置⽂件 /etc/nps/conf/nps.conf ⼀般情况下修改这四⾏内容即可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 后通过 whereisnps 找到残留⽂件删除即可Client端
⾸先防⽕墙放⾏相应端⼝,然后解压压缩包然后进⼊⽬录并执⾏上⾯复制的 客户端命令 ,理论上,刷新后台即可看到客户端状态均变为绿⾊,因为是直接⽤ ssh 执⾏的命令,因此如果未正常连接,可以通过⽇志来查错和修正,基本的排查错误的思路和 FRP 相同
NAT服务器
Server端和上⾯完全相同Client端
稍有不同的是需要将 客户端命令 改为映射后的端⼝,如上图中的 37000 , 服务器IP 实测⽀持填写域名
ZeroTier
如果阅读了上⾯两个⼯具的 Github 页⾯或者官⽅⽂档,就会发现,⾥⾯都提到了⼀个 P2P 的连接⽅式,但是笔者尝试后会发现存在诸多问题且很多时候⽆法连接,官⽅也表名并不稳定,那么,有没有⼀个专门做 P2P 连接的⼯具呢,这个就是了,⼀个使⽤ CPP 和 C 实现的内⽹穿透⼯具,并且组建的是局域⽹,本⽂使⽤的是 1.4.6 版本
https://github.com/zerotier/ZeroTierOne
Leaf 节点(叶⼦节点)
这⾥⾯的概念发⽣了⼀些变化,因为这个的⽬的是将所有⽤户连接起来形成⼀个局域⽹,因此所有⽤户都是平等的,也就没有服务端和客户端的区别了,增加⼀个⽤户相当于增加了⼀个 Leaf 节点,可以使⽤⼀键安装包, Windows ⽤户去下载 exe ⽂件安装即可,如果 debian 系统下提⽰没有 sudo 同时已经在 root ⽤户下,去掉 sudo 即可curl -s https://install.zerotier.com | sudo bash
如果安装时提⽰ NO_PUBKEY 1657198823E52A61 ,则需要添加公钥,这种情况⼀般是使⽤了第三⽅的镜像导致的,⽐如清华源、阿⾥源
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 1657198823E52A61安装完后就可以通过 zerotier-cli 配置服务器了,⾸先,开启服务并设置开机⾃启systemctl start zerotier-onesystemctl enable zerotier-one打开官⽹创建账号然后新增⽹络https://my.zerotier.com/network
然后获得⼀个 Network ID ,所有节点加⼊⽹络都使⽤相同的命令,Windows 下就使⽤管理员权限的 CMD 来执⾏zerotier-cli join ID如果成功则会返回200 join 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 ⽂件,⽂件名类似于 00000018fasd2319.moonzerotier-idtool genmoon moon.json
新增 moons.d ⽂件夹,即 /var/lib/zerotier-one/moons.d/ ,将 00000018fasd2319.moon ⽂件移⼊,然后重启服务systemctl restart zerotier-one
其他节点绑定 moon 节点的⽅式都是输⼊以下命令, ID 需要改为上⾯复制的 IDzerotier-cli orbit 18fasd2319 18fasd2319
重启服务后查看是否添加成功zerotier-cli listpeerszerotier-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
https://www.cloudiplc.com/
需要实名认证,仅能开启⼀个服务器,电信移动联通均有,最便宜的 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
https://olvps.com/
不需要实名认证,能开启多个服务器,电信移动联通均有,最便宜的仅有 256M 内存,考虑到上⾯的经历,尝试了下 512M 内存的服务器,价格稍贵,读者可以尝试更便宜的那⼀款,进去后成功重装清华源的 Debian10
固定开启⼀个端⼝段,需要在使⽤的时候将端⼝改到相应的端⼝段内,不过好处是 TCP 和 UDP 可以同时开启,直接在防⽕墙上放⾏即可,因此最多有 10 个端⼝(相当于20 条映射规则)
测试可道云穿透和 AriaNG 穿透均正常,不过速度不是很稳定,经常会掉到⼏百 K ,在开启 BBR 之后情况依旧,那么,有什么理由让我不使⽤ ZeroTier 呢
BBR
NAT 服务器的内存普遍偏⼩,不适合直接安装 CentOS 系统,当然服务商提供的系统是没问题的,经过了⼀定的精简,可以顺利装上,如果⽤户直接从清华源安装会报内存不⾜的错误,不过,⽆论使⽤哪个系统,都可以开启 BBR 加速Debian 在内核版本⼤于 4.9 时可以直接通过以下命令开启并应⽤设置,现在的系统基本都符合要求echo \"net.core.default_qdisc=fq\" >> /etc/sysctl.conf
echo \"net.ipv4.tcp_congestion_control=bbr\" >> /etc/sysctl.confsysctl -p
然后检测是否开启成功,返回值中含有 bbr 或者 fq 即开启成功sysctl net.ipv4.tcp_available_congestion_controlsysctl net.ipv4.tcp_congestion_controlsysctl net.core.default_qdisclsmod | grep bbr
也可以安装 BBR - PLUS ,readme ⾥⾯有安装说明https://github.com/Xaster/bbrplus-debian
CentOS 则需要安装相应的编译好的内核,有⼀键脚本可以使⽤,会下载⼀个内核,如果速度太慢可以下载好传上服务器,不过需要⾃⼰修改⼀下脚本,难度很低
wget \"https://github.com/cx9208/bbrplus/raw/master/ok_bbrplus_centos.sh\" && chmod +x ok_bbrplus_centos.sh && ./ok_bbrplus_centos.sh然后可以通过与上⾯相同的命令查看是否安装成功
Supervisor守护进程
因为要开机启动和后台挂载,于是使⽤ supervisor 服务,配置教程可以参考 ,debian下安装supervisor命令稍有改变 apt-get install supervisor启动服务并设置开机启动systemctl start supervisorsystemctl enable supervisor
修改配置⽂件 /etc/supervisor/supervisord.conf ,新增 web 页⾯[inet_http_server] ; inet (TCP) server disabled by defaultport=0.0.0.0:端⼝ ; (ip_address:port specifier, *:port for all iface)username=⽤户名 ; (default is no username (open server))password=密码 ; (default is no password (open server))端⼝、⽤户名、密码需⾃⾏修改,同时记得放⾏端⼝,然后更新配置supervisorctl reload
Debian 下的任务后缀是 conf ⽽不是 ini ,在 /etc/supervisor/conf.d ⽂件夹下新增 frp.conf ,nps 则只⽤挂载客户端, zerotier 不需要[program:frp_supervisor]
stdout_logfile=/root/log/frp_supervisor.out.log
stderr_logfile=/root/log/frp_supervisor.out.errdirectory=/root/frp
command=/root/frp/frpc -c /root/frp/frpc.iniuser=rootautostart=trueautorestart=trueredirect_stderr=true
其中log路径需要⼿动创建,否则⽆法运⾏,Server 端为 frps ,不要写错,然后更新列表并在 web 上查看是否正常运⾏supervisorctl update 感谢
ZeroTier-One配置moon⼼得
https://blog.csdn.net/coldboy258/article/details/93133860centos查看实时⽹络带宽占⽤情况⽅法
https://www.cnblogs.com/agang-php/p/6210900.htmlDebian 9/10快速开启Google BBR的⽅法,实现⾼效单边加速https://www.moerats.com/archives/297/
因篇幅问题不能全部显示,请点此查看更多更全内容