1、环境变量的设置
sudo vi /root/.bashrc
在最下面加入,然后保存
export GOROOT=/usr/local/go
export GOBIN=$GOROOT/bin
export GOPATH=$HOME/go
export GOARCH=amd64
export GOOS=linux
export GOPKG=$GOROOT/pkg/tool/linux_amd64
export PATH=.:$PATH:$GOBIN:$GOPKG
export NGROK_DOMAIN="ngrok.luckln.com"(此域名为基本二级域名)
重新加载 profile 文件,加载环境变量到内存
source /root/.bashrc
sudo yum update
sudo yum install mercurial git bzr subversion epel-release
2、安装Golang
以1.7.6版本为例子下载go1.7.6.linux-amd64.tar.gz安装包,
官方下载地址:http://www.golangtc.com/download
将文件go1.7.6.linux-amd64.tar.gz复制到/usr/local/下
使用tar命令将安装包解压到/usr/local目录下:
sudo tar -C /usr/local/ -zxf go1.7.6.linux-amd64.tar.gz
验证安装结果,在任意目录查看安装版本:执行以下命令
go version
3、下载ngrok源码
此处使用非官方地址,修复了部分包无法获取(摘自网络)(rm -rf /root/ngrok2 移除)
git clone https://github.com/inconshreveable/ngrok.git ngrok
4、生成自签名证书
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 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通过bindata将ngrok源码目录下的assets目录(资源文件)打包到可执行文件(ngrokd和ngrok)中 去,assets/client/tls和assets/server/tls下分别存放着用于ngrok和ngrokd的默认证书文件,我们需要将它们替换成我们自己生成的:(因此这一步务必放在编译可执行文件之前)
cp -r rootCA.pem assets/client/tls/ngrokroot.crt
cp -r device.crt assets/server/tls/snakeoil.crt
cp -r device.key assets/server/tls/snakeoil.key
使用命令工具 go-bindata,将go-bindata复制到ngrok/bin下
sudo yum install golang-go
go get -u github.com/jteeuwen/go-bindata/...
cp /usr/local/go/bin/go-bindata ./bin
5、#编译ngrokd(服务器端)
make release-server
编译成功后会在bin目录下找到ngrokd
6、启动服务端
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 443 -j ACCEPT
sudo /usr/local/go/bin/ngrokd -domain="$NGROK_DOMAIN" -httpAddr=":80" -httpsAddr=":443"
查看80端口是否被占用
sudo netstat -naop | grep 80
kill 进程,杀死进程
httpAddr、httpsAddr 分别是 ngrok 用来转发 http、https 服务的端口,可以随意指定。ngrokd 还会开一个 4443 端口用来跟客户端通讯(可通过 -tunnelAddr=”:xxx” 指定)。由于微信限制不能出现端口号,因此这个使用了80、443端口。
7、编译客户端
#编译Linux客户端
由于go 1.5版以后的编译安装需要1.4版本go
cd /root/ngrok
git clone https://github.com/golang/go.git
cd go
git branch
git checkout release-branch.go1.4
git branch
#给Go编译器加上交叉编译windows/amd64程序的功能
cd /root/ngrok/go/src
GOOS=windows GOARCH=amd64 ./make.bash
#在ngrok下执行如下命令编译Windows 64位客户端
cd /root/ngrok
卸载go
rm -rf go
重新执行一下
sudo tar -C /usr/local/ -zxf /usr/local/go1.7.6.linux-amd64.tar.gz
unset GOBIN
GOOS=windows GOARCH=amd64 make release-client
#以上GOARCH=amd64指的是编译为64位版本,如需32位改成GOARCH=386即可
ngrok/bin/windows_amd64下ngrok.exe拷贝到本地
8、设置本地客户端
(1)在同级目录下新建一个配置文件ngrok.cfg
server_addr: "ngrok.luckln.com:4443"
trust_host_root_certs: false
(2)同级目录下新建一个启动脚本startup.bat
@echo OFF
ngrok -config=ngrok.cfg -subdomain wx 7002
PAUSE
goto TUNNEL
其中,-config指向配置文件,-log存放日志文件位置,-subdomain为自定义的域名前缀。8080为端口号。
(3)启动,点击启动脚本startup.bat完成启动。
9、设置为系统程序,并后台运行。
服务器在运行ngrok时,如果关闭会话窗口,会导致服务中断,很显然这不是我们想要的结果,我们需要服务不断的在后台运行,当需要的时候在停止。
在/etc/systemd/system/目录下创建服务ngrok.service,内容为
[Unit]
Description=ngrok
After=network.target
[Service]
ExecStart=/usr/local/go/bin/ngrokd -domain="ngrok.luckln.com" -httpAddr=":80" -httpsAddr=":443"
[Install]
WantedBy=multi-user.target
其中要根据自己的实际目录修改相对应的目录。
启动服务。
sudo systemctl start ngrok.service
终止正在运行的服务,需要执行systemctl stop命令。
停止服务
sudo systemctl stop ngrok.service
有时候,该命令可能没有响应,服务停不下来。这时候就不得不"杀进程"了,向正在运行的进程发出kill信号。
sudo systemctl kill ngrok.service
此外,重启服务要执行systemctl restart命令。
sudo systemctl restart ngrok.service