前几天决定搞个内网穿透,想找现成的ngrok来用但是最终决定自己搭建ngrok服务器...(别人的ngrok要钱啊!有免费的但是限制太大啊!)ngrok传送门Github
第一步搞到一台服务器。
我用centOS6,emmm,ubuntu什么的都行,大同小异。
第二部搞一个域名。
推荐FreeNom,免费的顶级域名,但是不支持泛解析,也不能在国内备案(反正ngrok也用不到这个)
第三部,由于ngrok需要编译,而且源码是go语言,所以要先配置go环境。
go要安装1.1以上的版本。代码如下:
yum install golang
如果没有权限,请使用 sudo 安装,安装完成之后,执行 go version 看到如下信息,证明安装成功:
go version go1.7.3 linux/amd64
同时需要配置go环境变量。这一步很坑,经常配置错。
在当前shell的配置文件中添加如下内容:
export GOPATH=$HOME/go
PATH=$PATH:$HOME/.local/bin:$HOME/bin:$GOPATH/bin
export GOBIN= $ GOROOT/bin
然后source一下立即生效。
第四部,安装Git。
跟简单,yum install git
第五步,下载ngrok源码。
新建一个文件夹,在文件夹中执行:git clone https://github.com/inconshreveable/ngrok.git
然后当前文件夹就会出现一个ngrok的文件夹了,里边就是ngrok源码。
目前最新的ngrok文件已经把googlecode替换成GitHub地址了,如果仍然是googlecode,则把 src/ngrok/log/logger.go 文件
中的:code.google.com/p/log4go
修改为:github.com/alecthomas/log4go
第六步,生成证书。
证书生成过程中会用到环境变量NGROK_DOMAIN,所以要先export一下。代码如下(以下代码应在ngrok文件夹下进行):
NGROK_DOMAIN="www.aiesst.com" ;注意替换为自己的域名
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 device.key 2048
openssl req -new -key device.key -subj "/CN=$NGROK_DOMAIN" -out device.csr
openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000
之后会在 ngrok 目录下生成 root,device 等六个文件。 然后需要拷贝到配置的目录中,在编译的时候会使用这些文件。
copy命令如下(以下代码应在ngrok文件夹下进行):
cp rootCA.pem assets/client/tls/ngrokroot.crt -f
cp device.crt assets/server/tls/snakeoil.crt -f
cp device.key assets/server/tls/snakeoil.key -f
第七步,编译生成客户端文件和服务端文件。
首先需要知道,ngrokd 为服务端的执行文件,ngrok为客户端的执行文件。
接下来我们来编译ngrokd,在ngrok目录下,执行如下命令:
GOOS=linux GOARCH=amd64 make release-server ;在linux 64位环境下执行这个
GOOS=linux GOARCH=386 make release-server;在linux 32位环境下执行这个
GOOS=linux GOARCH=arm make release-server ;在arm平台执行这个(比如树莓派)
由于第一次生成需要自动git一些依赖包,时间可能稍长,稍安勿躁。失败的话多尝试几次就好。
接下来生成客户端:
GOOS=linux GOARCH=amd64 make release-client
GOOS=windows GOARCH=amd64 make release-client
GOOS=linux GOARCH=arm make release-client
执行完之后,会在ngrok/bin中生成各自对应的文件。可以用sz命令把客户端拖到本地。
附录:
Linux 平台 32 位系统:GOOS=linux GOARCH=386
Linux 平台 64 位系统:GOOS=linux GOARCH=amd64
Windows 平台 32 位系统:GOOS=windows GOARCH=386
Windows 平台 64 位系统:GOOS=windows GOARCH=amd64
MAC 平台 32 位系统:GOOS=darwin GOARCH=386
MAC 平台 64 位系统:GOOS=darwin GOARCH=amd64
ARM 平台:GOOS=linux GOARCH=arm
第八步,启动服务端。
命令如下:
./ngrokd -domain=$YOUR_DOMAIN -httpAddr=":6060" -httpsAddr=":6061" -tunnelAddr=":6062"
HttpAddr 是访问普通的http使用的端口号
httpsAddr 是访问的https使用的端口号,同上,只不过是需要https的服务访问才用这个端口
tunnelAddr 是通道的端口号,这个端口是Ngrok用来通信的,所以这个端口在服务器上和客户端上设置必须要对应才可以正常的链接,默认不填是4443
一定要注意防火墙是否允许你的端口通过!!!还有就是若果是用的是国外服务器,端口有极大的可能被封堵!!!
第九步,开启客户端。
ngrok文件放到客户机。需要建立配置文件ngrok.cfg,存放如下内容:
server_addr: YOUR_DOMAIN:SERVER_LINTENING_PORT
trust_host_root_certs: false
然后执行:
ngrok -subdomain demo -config=./ngrok.cfg 4000
如果成功,客户机如下图所示:
如此,如果访问源域名:httpport,就会访问到客户机的4000端口提供的服务了。(4000可换成其他)
预祝各位搭建成功!