why
很多时候我们个人电脑或内网的某个服务或资源希望可以在外网访问。
what
内网穿透服务是让外网可以访问内网应用的一种方式,类似花生壳。
where
对于程序员,本地开发的项目需供外网调试或者开发微信公众号必须要外网域名访问的,还有很多应用场景,比如个人网盘等等。
how
主要分下面几步:准备有独立IP的外网服务器,注册域名,IP绑定域名,ngrok服务器搭建。
一.准备有独立IP的外网服务器
外网服务器有很多,比如各种云服务器:阿里云等,这里我推荐大家的服务器是:板瓦工(https://www.bwh1.net/),对于经常翻墙的朋友应该不陌生,这是国外的vps服务器,价格便宜还可以用支付宝购买,大概120块钱一年,既可以翻墙有又能内网穿透还是比较划算的,具体怎么购买我这就不具体讲了,这比较简单,大家可以自行百度。
购买成功后,在my services菜单里看到购买的服务器,点击kiwiVM Control Panel按钮进如控制台。
在控制台安装操作系统,我这里安装的是Ubuntu 16.04 x86_64,安装成功后在Main controls里可以看到IP等信息。
二.注册域名
这里推荐大家没费注册域名的网站:http://www.freenom.com/zh/index.html?lang=zh,先注册,然后填写你要注册的域名
选择免费的域名购买,选择12 Months free,填写个人信息,提交就购买成功了!
在my domains可以看到购买的域名:
三.ip绑定域名
这里推荐腾讯的dnspod:https://www.dnspod.cn,先注册,可以绑定微信扫码登录
然后添加域名,填写刚刚注册的域名,点击域名进入添加记录
修改nameservers,复制域名的nameservers(f1g1ns1.dnspod.net,f1g1ns2.dnspod.net)到注册域名的网站freenom的对应域名的nameservers里
等域名红色变绿就表示绑定成功,大概要等一小时左右。
四.ngrok服务器搭建
这里是ubuntu下生成ngrok服务器与客户端应用程序,centos的大家可以自行百度
使用Putty远程登陆到服务器,如下所示:
1、安装GIT、获取ngrok:
mkdir ngrok #创建名称为ngrok的目录 apt-get update #更新包管理器 apt-get install git #安装git git clone https://github.com/inconshreveable/ngrok.git ngrok2 #将ngrok源代码克隆回本地
成功执行后如下所示:
PS. 直接在服务器上下载的话实在太慢,可以先在本地下载好,然后用ftp放到服务器上去直接用
2、安装Go语言:
apt-get install golang #安装go语言
执行结果如下:
3、设置环境变量
export GOPATH=/usr/local/ngrok/ #设置环境变量,Go语言的安装位置
export NGROK_DOMAIN="xxxx.cn" #设置环境变量,xxx.cn为你的域名
4、切换到ngrok目录下执行以下命令为域名生成证书
cd ngrok openssl genrsa -out rootCA.key 2048 openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.pem openssl genrsa -out server.key 2048 openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csr openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 5000
生成后的结果如下:
证书如下:
5、拷贝证书到指定位置
cp rootCA.pem assets/client/tls/ngrokroot.crt #复制rootCA.pem到assets/client/tls/并更名为ngrokroot.crt cp server.crt assets/server/tls/snakeoil.crt #复制server.crt到assets/server/tls/并更名为snakeoil.crt cp server.key assets/server/tls/snakeoil.key #复制server.key到assets/server/tls/并更名为snakeoil.key
6、 编译
由于go语言的特性,在编译时直接生成机器码,所以在运行过程中并不需要go的环境(非托管应用)。在ngrok目录下,运行一下命令分别生成对应的客户端与服务端。
#win服务端 GOOS=windows GOARCH=386 make release-server #win客户端 GOOS=windows GOARCH=386 make release-client #linux服务端 GOOS=linux GOARCH=386 make release-server #linux客户端 GOOS=linux GOARCH=386 make release-client
生成完成后,在工作目录的bin文件夹下,产生对应的文件。以编译windows平台为例,会产生“ngrok.exe”与“ngrokd.exe”这两个文件,前者客户端,后者需要运行在公网服务器上。
因为项目中引用了一些外部资源,生成会耗费一些时间,对网络也有一定的要求,太慢会中短,命令执行下如:
生成结果:
这里我还生成了两个运行在windows服务器与客户端的应用:
ngrok 是客户端,ngrokd 是服务端。
7、启动ngrok服务端
切换到ngrokd 服务端程序所在的目录并执行如下命令:
./ngrokd -domain xxxx.cn
xxx.cn代表你的域名
执行效果如下:
8、配置客户端
拷贝生成的ngrok.exe到本地计算机,并新建配置文件ngrok.cfg,内容为:
server_addr: "xxxx.cn:4443"
trust_host_root_certs: false
xxx.cn代表你的域名
再新建文件start.bat批处理文件,内容为:
ngrok.exe -subdomain hello -config=ngrok.cfg 8080
hello为子域名前缀,访问时格式为hello.xxx.cn
8080为本地tomcat服务器使用的端口号。
双击start.bat启动效果如下所示: