情景需求
你现在在开发一个有关微信公众号的web服务,现在在开发阶段,但是也需要运行起来小测一波,但是微信公众号的测试号的必要条件是微信服务器能访问到你的本地服务。
当然你也可以本地开发,服务器运行,jetbrains新出的远程开发对服务器性能要求极高,IDEA的java远程环境每次都需要上传大量jar包,即使使用rsync进行上传,也不咋好用,运行效果确实不咋地(也有可能是我哪里设置有问题。。)
当然如果你写python的话,可以完全的远程快速运行,Pycharm可以直接服务器部署,用服务器的远程python环境运行,以达到公网可以访问
如果你写的是JAVA,那么你就得进行内网穿透,但是第三方的内网穿透服务,例如花生壳,一是域名太丑,二是有流量和连接数量的的限制,如果你可以直接映射到你自己的公网服务器,那么流量的问题就可以解决,带宽的话看你服务器的带宽。
特别鸣谢
本文大部分思路与代码来自于B站UP主韩风Talk
以下为部分视频,是相当优质的内容,欢迎大家来三连
必要条件
一台有公网IP的服务器(下文演示的系统为Ubuntu)
一个解析到服务器的域名(不必要)
各个设备安装zerotier
服务器内安装zerotier
首先在服务器上安装zerotier-cli
sudo apt update
curl -s 'https://install.zerotier.com/' | sudo bash
可能会稍微较慢,安装结束之后会出现一个唯一的设备ID
将这个ID复制出来,我们先进行一下用一下官方的节点控制器创建网络
Windows安装zerotier
进入官网网站(点击这里进入官方网站下载(zerotier.com))选择对应的系统进行下载
然后下一步,下一步。。。
官方节点控制器创建虚拟网络
登录官方网站
官网节点控制器(ZeroTier Central),进行登录,进入之后是如下界面
创建虚拟网络
点击Create A NetWork,下方出出现一个新的id,点击进入
进入之后可以在name处修改备注名,Access Control不需要进行更改,复制出来NetWork ID
各个设备加入虚拟网络
Linux服务器加入虚拟网络
将下面的”Network ID“替换为你自己的虚拟网络ID
zerotier-cli join "NetWork ID"
例如:
zerotier-cli join abfd31bd47562d14
正常加入的会出现:200 join OK
windows加入虚拟网络
安装完成打开之后,右下角(或者在倒三角里面)会出现一个zerotier的图标,点击它,会出现
点击Join New Network,在弹出的窗口填入虚拟网络ID,点击Join
官方节点控制器网站内进行设置
回到节点控制器网站,向下滑动,会出现members,将前面的方框内打上对勾
可以在short-name那块写备注名,在打完对勾一会之后将会在ManagedIPs出现这个设备的内网虚拟ip,version是该设备的zerotier版本,Physical IP是该设备的真实IP
在出现ManagedIPs时就可以尝试互相进行ping,查看是否成功组网
windows下ping命令
ping -t "要ping的ip"
例如
ping -t 172.24.166.112
这时如果出现:来自***的回复,时间=多少ms,就代表组网成功
服务器ping命令
直接
ping "要ping的ip"
端口转发实现我们需要的服务穿透
服务器配置
这里我们最好去你服务器厂商搜索一下端口转发的限制
例如华为云就需要在控制台手动关闭一个选项才可以正常转发
最重要的还有,在安全组放行对应的端口
(2024-05-26更新)
一键化脚本
bash <(curl -fsSL https://raw.githubusercontent.com/dong-dong6/PortToolsCollection/main/forward.sh)
使用里面的3,里面的1,进行添加转发规则
出现一个数字就代表成功设置端口转发,我在本地跑一个springboot的服务,我可以直接用服务器IP+8080在公网访问到。(为防止有不良风险,公网IP稍微打个码)
默认组网效果较差
经过较长时间的一个互ping,我们可以发现,虽然完成了,组网,但是我们延迟普遍大于400ms
而且有不小的丢包率
具体的原因,可以去看韩风TalkUP的视频更深一步的理解
我们直接说解决办法,就是自建Moon服务器和planet节点控制器
moon服务器配置
直接上代码,在安装zerotier的服务器上
cd /var/lib/zerotier-one
zerotier-idtool initmoon identity.public >>moon.json
这时,我们需要进行修改一下这个moon.json
你可以使用代码的方式进行修改,也可以直接用ssh终端的文件编辑器进行修改,建议使用文件编辑器,比命令行的更加清爽,将stableEndpoints后面的中括号内写成["你服务器的公网IP/9993"]
此时你需要在服务器安全组里放行9993端口的UDP流量
zerotier-idtool genmoon moon.json
如果出现报错,检查一下填的内容,一定是一个英文分号下ip+“/”+9993,这时会出现一个0000开头的moon文件
复制一下那个文件名
mkdir /var/lib/zerotier-one/moons.d
将下面的那个文件名换成你自己刚刚复制的文件名
cp 000000bf89d708e7.moon ./moons.d/
移动这个文件,然后重启服务
systemctl restart zerotier-one
这时候,你就拥有了一个moon服务器,你需要将你的其他设备也加入这个moon服务器
Linux下加入moon
运行这个命令,moon服务器ID其实也就是云服务器刚刚的设备ID。
zerotier-cli orbit "moon服务器ID" "moon服务器ID"
windows下加入moon
直接将服务器的那个moon文件下载下来,放到windows的这个目录下(C:\ProgramData\ZeroTier\One\moons.d),其中ProgramData为隐藏文件夹,要手动打开一下,在放置完之后需要重启
我们这时候再进行互Ping操作,就已经可以发现,延迟已经下降了很多很多
丢包率也从15%+降为0%
但是我们可以再进一步的优化,就是创建本地的节点控制器
planet节点控制器
我们可以通过自建planet节点控制器的方法让我们的流量完全在墙内流通
直接上代码(代码来自于韩风Talk的改良版)
curl -O https://s3-us-west-1.amazonaws.com/key-networks/deb/ztncui/1/x86_64/ztncui_0.8.14_amd64.deb
dpkg -i ztncui_0.8.14_amd64.deb
sh -c "echo ZT_TOKEN=sudo cat /var/lib/zerotier-one/authtoken.secret > /opt/key-networks/ztncui/.env"
sh -c "echo HTTP_ALL_INTERFACES=yes >> /opt/key-networks/ztncui/.env"
sh -c "echo NODE_ENV=production >> /opt/key-networks/ztncui/.env"
chmod 400 /opt/key-networks/ztncui/.env
chown ztncui.ztncui /opt/key-networks/ztncui/.env
systemctl enable ztncui
systemctl restart ztncui
然后安全组里放行3000端口的tcp,用ip:3000就可以访问到这个本地的节点控制器
点击右上角的登录,默认账号为admin,密码为password,登录之后会要求重新修改密码
显示修改成功之后,点击Add Network,写上这个虚拟网络的名字(不是让你编ID,这个相当于备注名)
创建成功之后,会出现之下的界面,备注名之后就是网络ID
点击Easy setup,点击Generate network address,会自动设置网段
之后可以用同样的方法将服务器和本地设备加入这个网络之中,服务器会在这里显示为CONTROLLER(控制器 ),将Authorized打勾
这样你就可以将服务器的3000端口关闭(如果服务器内部有防火墙,需要放行指定IP(也就是你的本地设备的虚拟内网ip)允许访问3000),用这个虚拟内网IP+3000访问,例如我这个就可以用10.124.38.71:3000访问这个web系统
使用服务器的节点控制器,就可以实现互相ping的延迟会进一步的降低,虽然降低的效果不怎么明显
再删除之前的端口转发规则
sudo iptables -F
再简单配置一下端口转发,就可以进行低延迟的内网服务的外网测试
绑定自己的域名
很简单,域名解析到服务器就可以,如果想达到去端口访问,你可以套一个CDN域名