0x00 为啥会想到用ngrok
国内有个出名的厂商叫花生壳,说是用内网动态域名,价格不算便宜而且用了感觉体验挺差的。最近正好看到ngrok的文章,索性自己搭建一个。其实也可以直接用客户端使用ngrok官方的服务端,但是被墙了,还不如自己动手。ngrok介绍跟原理我就不班门弄斧了,谷歌有好多大神写的文章。
0x01 环境配置
因为ngrok是go语言开发的,所以环境肯定要有go。
我在腾讯云的机器上装了ubuntu16.04LTS的系统,不重要,系统影响几乎不存在。
装一波必要的软件包:
sudo apt-get install build-essential golang mercurial git
获取ngrok代码:
git clone https://github.com/inconshreveable/ngrok.git ngrok git clone https://github.com/tutumcloud/ngrok.git ngrok #因为google被墙,上面地址下在后需修改log4go的地址,下面地址已经修改好
生成证书并且替换自带的证书,因为要用自己服务器的域名和地址:
NGROK_DOMAIN="doubledoge.cn" openssl genrsa -out base.key 2048 openssl req -new -x509 -nodes -key base.key -days 10000 -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 -days 10000 -out server.crt cp base.pem assets/client/tls/ngrokroot.crt cp server.crt assets/server/tls/snakeoil.crt cp server.key assets/server/tls/snakeoil.key
基于刚才生成的证书进行服务器端和客户端的可执行文件的编译:
#因为服务器端在本机完成编译,所以不需要加参数 make release-server #针对各版本的系统进行客户端的编译 GOOS=linux GOARCH=amd64 make release-client GOOS=windows GOARCH=amd64 make release-client GOOS=darwin GOARCH=amd64 make release-client #GOARCH是系统对应架构,386(32位)、amd64(64位)、arm #bin目录下出现ngrok和各系统的文件夹里有ngrokd就说明编译成功
0x02 服务器端和客户端的运行测试
服务器端:
#两个端口分别对应http跟https的端口 sudo ./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="doubledoge.cn" -httpAddr=":6060" -httpsAddr=":6061" -tunnelAddr=":6062"
运行成功如图所示:
打开任何一个子域名的6060端口可以看到如下:
客户端:
我在我的win7上运行
要写一个简单的配置文件例如ngrok.cfg
server_addr: "www.aiesst.com:6062" trust_host_root_certs: false
运行客户端可执行文件
#-log参数可以得到连接时遇到的问题,便于发现问题 ngrok.exe -log=ngrok_log.txt -subdomain=abc -config="ngrok.cfg" 80
连接成功后会出现online和forwarding字样。
0x03 有可能遇到的一些问题
1.域名的泛解析: 登录域名控制台,会有提示主机记录添加一条为*的即可
2.连接报错:大概就是无法解析域名的意思,当时很奇怪,然后突然发现要解析的事doubledoge.cn这个域名,所以添加主域名的解析即可
3.默认tunnel端口4443连接不上: 运行服务器端时自定义tunnel端口,就如上文所写即可
其实就算问题应该也没啥的。加个log参数好处就是不怕找不到错误了,日志在手,天下我有。
大黑阔,你好。