内网穿透想必开发过微信的同志都很了解,大部分人选择网上寻找各种现成的,比如ngrok官网、ittun-ngrok、sunny-ngrok或者花生壳之类的。但是世界上没有免费的午餐,要不就是收费,要不就是免费但不太稳定(当然大多数时间是没有问题的)。
偶然,正在测试微信的某些功能,但是正在使用的ittun-ngrok连接失败了。导致测试无法进行,最终萌生出自己搭建一个ngrok服务器的想法。
1、必要条件
(1)服务器,用来搭建ngrok的服务器,必须有公网ip,并且可以正常访问(本次测试使用的是ubuntu 16.04 64位)。
(2)域名,用来生成访问域名。
2、安装git 和golang
apt-get install build-essential golang mercurial git
golang,go语言支持,因为ngrok是基于go语言编写的
3、下载源码,当然也可以不安装git,但是需要手动上传代码到需要的位置。
此处使用非官方地址,修复了部分包无法获取(摘自网络)
git clone https://github/tutumcloud/ngrok.git ngrok
下载下来的目录结构
4、生成自签名证书
使用ngrok官方服务时,我们使用的是官方的ssl证书。自建ngrokd服务,如果不想买ssl证书,我们需要生成自己的自签名证书,并编译一个携带该证书的ngrok客户端。
证书生成过程需要一个ngrok_base_domain。 以ngrok官方随机生成的地址xxx.ngrok为例,其ngrok_base_domain就是“ngrok”,如果你要提供服务的地址为“example.ngrok.xxx”,那ngrok_base_domain就应该 是“ngrok.xxx”。本次测试,由于没有多余的域名,我替换成自己的二级域名“weixin.yangjiace.xyz”。
cd ngrok
ngrok_domain=weixin.yangjiace.xyz
openssl genrsa -out base.key 2048
openssl req -new-x509-nodes-key base.key -days10000-subj/cn=$ngrok_domain-out base.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 base.pem -cakey base.key -cacreateserial-days10000-out server.crt
执行完成后需要替换证书
cp base.pem assets/client/tls/ngrokroot.crt
5、编译
make release-server release-client
编译成功后会在bin目录下找到ngrokd和ngrok这两个文件。其中ngrokd 就是服务端程序了。
6、启动服务端
./bin/ngrokd -tlskey=server.key -tlscrt=server.crt -domain=weixin.yangjiace.xyz-httpaddr=:80-httpsaddr=:443
httpaddr、httpsaddr 分别是 ngrok 用来转发 http、https 服务的端口,可以随意指定。ngrokd 还会开一个 4443 端口用来跟客户端通讯(可通过 -tunneladdr=”:xxx” 指定)。由于微信限制不能出现端口号,因此这个使用了80、443端口。
7、编译客户端
(1)windows
goos=windows goarch=amd64 make release-client
(2)mac
goos=darwin goarch=amd64 make release-client
执行对应的命令会在bin目录下生成相对应的windows、mac目录,ngrok.exe就存放在对应目录下。将对应的ngrok.exe下载到本地。
8、设置本地客户端
(1)在同级目录下新建一个配置文件ngrok.cfg
server_addr: weixin.yangjiace.xyz:4443
trust_host_root_certs: false
(2)同级目录下新建一个启动脚本startup.bat
@echo on
cd %cd%
#ngrok-proto=tcp 22
#ngrok start web
ngrok -config=ngrok.cfg -log=ngrok.log-subdomain=yjc 8080
其中,-config指向配置文件,-log存放日志文件位置,-subdomain为自定义的域名前缀。8080为端口号。
(3)启动,点击启动脚本startup.bat完成启动。
9、设置为系统程序,并后台运行。
服务器在运行ngrok时,如果关闭会话窗口,会导致服务中断,很显然这不是我们想要的结果,我们需要服务不断的在后台运行,当需要的时候在停止。
在/etc/systemd/system/目录下创建服务ngrok.service,内容为
[unit]
description=ngrok
after=network.target
[service]
execstart=/myweb/ngrok/bin/ngrokd -tlskey=/myweb/ngrok/server.key -tlscrt=/myweb/ngrok/server.crt -domain=weixin.yangjiace.xyz -httpaddr=:80 -httpsaddr=:443
[install]
wantedby=multi-user.target
其中要根据自己的实际目录修改相对应的目录。
这样我们就可以了通过systemctl start ngrok.service启动服务。然后就可以愉快的玩耍了。
csdn论坛:http://blog.csdn/yjc_1111/article/details/79353718