搭建ngrok服务器

锻炼耐心之旅。

Echowxsy 写于 2017年02月19日

安装git

首先检查git的版本,如果版本小于1.7.9.5会在之后的编译中遇到一个坑。

git --version
#git version 2.6.0

如果版本小于1.7.9.5,那么首先卸载git,再通过源码安装:

#卸载git
yum remove git
#安装依赖
yum -y install zlib-devel openssl-devel perl hg cpio expat-devel gettext-devel curl curl-devel perl-ExtUtils-MakeMaker hg wget gcc gcc-c++
#下载git-2.6.0源码
wget https://www.kernel.org/pub/software/scm/git/git-2.6.0.tar.gz
tar zxvf git-2.6.0.tar.gz
cd git-2.6.0
#编译安装
./configure --prefix=/usr/local/git
make && make install
echo "export PATH=\$PATH:/usr/local/git/bin" >> /etc/profile
source /etc/profile

安装go

#32位
wget http://www.golangtc.com/static/go/1.4.2/go1.4.2.linux-386.tar.gz
tar -C /usr/local/ -zxf ./go1.4.2.linux-386.tar.gz
#64位
wget http://www.golangtc.com/static/go/1.4.2/go1.4.2.linux-amd64.tar.gz
tar -C /usr/local/ -zxf ./go1.4.2.linux-amd64.tar.gz

echo "export GOROOT=/usr/local/go" >> /etc/profile
echo "export PATH=\$GOROOT/bin:\$PATH" >> /etc/profile

检查是否安装成功:

go version
#go version go1.4.2 linux/386

go设置编译环境

cd /usr/local/go/src
GOOS=linux GOARCH=386 ./make.bash #linux 32
GOOS=linux GOARCH=amd64 ./make.bash #linux 64
GOOS=linux GOARCH=arm ./make.bash #arm 一般是树莓派之类的平台
GOOS=linux GOARCH=mipsle ./make.bash #一般是路由器之类的平台
GOOS=darwin GOARCH=amd64 ./make.bash #osx 64
GOOS=windows GOARCH=386 ./make.bash #win 32
GOOS=windows GOARCH=amd64 ./make.bash #win 64

更多的编译参数请参考链接

编译ngrok

下载源码

cd ~
git clone https://github.com/inconshreveable/ngrok.git
cd ngrok

生成域名的自签名证书

NGROK_DOMAIN="your.domain.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
cp rootCA.pem assets/client/tls/ngrokroot.crt

编译ngrok服务端

GOOS=linux GOARCH=386 make release-server #根据需要修改GOOS和GOARCH的值

编译ngrok客户端

首先我们可以对源码做一些自定义修改,这里是可选操作

#修改默认服务地址
vim ./src/ngrok/client/model.go
#line 23
#-defaultServerAddr = "ngrokd.ngrok.com:443"
#+defaultServerAddr = "your.domain.com:4443"

#修改客户端logo
vim ./src/ngrok/client/views/term/view.go
#line 23
#-v.APrintf(termbox.ColorBlue|termbox.AttrBold, 0, 0, "ngrok")
#+v.APrintf(termbox.ColorBlue|termbox.AttrBold, 0, 0, "your logo")

#修改客户端提示信息
vim ./src/ngrok/client/client/cli.go
#line 14
#const usage2 string

编译客户端:

GOOS=windows GOARCH=386 make release-client #根据需要修改GOOS和GOARCH的值

安装ngrok

这里就比较随意,文件放哪里都可以,我的方案如下:

mkdir /usr/local/ngrok
mkdir /etc/ngrokd
cp bin/ngrokd /usr/local/ngrok/
cp device.key /etc/ngrok/
cp device.crt /etc/ngrok/
ln -s /usr/local/ngrok/ngrokd /usr/bin/

设置开机启动:

vim /etc/rc.local
#+ ngrokd -tlsKey=/etc/ngrok/device.key -tlsCrt=/etc/ngrok/device.crt -domain="your.domain.com" -httpAddr=":80" -httpsAddr=":443" &

ngrok客户端配置

创建一个配置文件ngrok.cfg,内容为:

server_addr: "your.domain.com:4443"
trust_host_root_certs: false

启动客户端参数为:

./ngrok -config=ngrok.cfg -subdomain test 8080
#-subdomain参数是自定义子域名
#8080 是本地服务的端口

常见问题

如果运行ngrokd时启动失败,一般是端口被占用,使用netstat -ntlp查看80、443、4443端口是否被占用。

如果是无法链接,一般是端口没有开放:

iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp --dport 4443 -j ACCEPT
service iptables save
/etc/init.d/iptables restart