Centos丨Linux 下ngrok编译安装教程内附免费客户端

准备环境

  1. 准备一台centos7服务器
  2. 安装必要的软件包
    1
    2
    3
    4
    sudo yum remove git
    sudo yum install epel-release
    sudo yum install https://centos7.iuscommunity.org/ius-release.rpm
    sudo yum -y install git2u golang mercurial openssl bzr subversion

下载ngrok资源

1
git clone https://github.com/inconshreveable/ngrok.git

生成tunnelAddr的证书

tunnelAddr是ngrok客户端用来链接ngrok服务端的‘server_addr’的域名

1
2
3
4
5
6
7
8
9
cd ngrok/
openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=mm860.com" -days 5000 -out rootCA.pem
openssl genrsa -out tunnel.key 2048
openssl req -new -key tunnel.key -subj "/CN=mm860.com" -out tunnel.csr
openssl x509 -req -in tunnel.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out tunnel.crt -days 5000
cp rootCA.pem assets/client/tls/ngrokroot.crt
cp tunnel.crt assets/server/tls/snakeoil.crt
cp tunnel.key assets/server/tls/snakeoil.key

编译ngrok服务端和客户端

执行命令

1
2
3
4
5
6
7
8
9
10
11
12
# 编译生成linux 64bit版本
GOOS=linux GOARCH=amd64 make release-all
# 编译生成mac 64bit版本
GOOS=darwin GOARCH=amd64 make release-all
# 编译生成linux 32bit版本
GOOS=linux GOARCH=386 make release-all
# 编译生成linux arm版本
GOOS=linux GOARCH=arm make release-all
# 编译生成windows 64bit版本
GOOS=windows GOARCH=amd64 make release-all
# 编译生成windows 32bit版本
GOOS=windows GOARCH=386 make release-all

至此便生成了几乎所有的ngrok的服务端客户端

启动ngrokd

1
./bin/ngrokd -domain mm860.com

启动ngrok

编写ngrok客户端配置文件 “debug.yml”

1
2
3
4
5
6
7
8
server_addr: mm860.com:4443
trust_host_root_certs: false
#or
server_addr: mm860.com:4443
tunnels:
test:
proto:
http: 8080

然后用以下任一命令运行ngrok

1
2
./bin/ngrok -config=debug.yml -log=ngrok.log start test
./bin/ngrok -config=debug.yml -log=ngrok.log -subdomain=test 3006

控制台输出正常连接的日志,至此你便可以配置dns解析,然后把bin目录的各个平台资源发布到对应平台上使用了。

HTTPS证书

如果直接使用https访问的话,浏览器会出现警告,这里说明一下如何让网站支持https而浏览器不拒绝。

  1. 首先去买一个ssl证书,或者申请一个免费的(我之前有文章说怎么申请免费证书),比如我最喜欢的Lets Encrypt证书。然后把你的证书上传到ngork服务端所在的服务器。 (我的证书是一个crt和一个key文件)

  2. 将你的域名泛解析到你的服务器。

  3. 使用下面的命令运行服务端:

    1
    nohup ngrokd -domain=ngrok.xncoding.com -tlsKey="/path/ngrok/your.key" -tlsCrt="/path/ngrok/your.crt" -httpAddr=:5442 -httpsAddr=:5443 &

    其实就是在你原先的命令上加tlskey和tlscrt的路径,这两个就是你的证书所在路径.

  4. 客户端cfg文件里,使用hostname+https的方式启动客户端(hostname就是你证书的域名)
    然后在客户端第二行设置如下参数:

    1
    trust_host_root_certs: true
  5. 确认服务端的启动参数-domain以及客户端cfg文件中的server_addr和证书的域名是同一个,否则会报错误证书的错误。

  6. 如果你申请的是免费的证书,可能crt文件不带中间商和根证书,这时需要你去网站上把所有证书合在一起, 否则在linux上使用客户端会出现certificate signed by unknown authority的错误, 参考http://m.ithao123.cn/content-2350159.html

到此如果没有什么问题,你的网站就可以用https访问了,而且浏览器也不会再提示是不安全的网站了。

至此,ngrok内网穿透成功实现,幸福的汗水。