1.使用场景

将闲置的电脑变成服务器,在家中联网的电脑由于没有固定的IP,所以不能从外网访问;而个人购买的便宜的云主机可能因为配置低,在搭建网站时备受局限,这时使用ngrok搭建个人服务器就有用武之地了。将云服务器做为具有固定IP的代理,个人电脑作为部署网站的服务器,以后在更换云服务器时也特别方便。

2. 必备物料

  • a. 云服务器或VPS:如阿里云,腾讯云。即云服务器会有一个固定IP,在该服务器上搭建ngrok服务端。
  • b. 一个备案的域名。将域名解析到云服务器。剩下的就交给ngrok和nginx了。

3.环境准备

  • a. centos的基础环境
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
  • b. go语言环境
//请下载合适自己的go语言包  我是centos 7 64 所以选择以下包
wget https://storage.googleapis.com/golang/go1.8.3.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.8.3.linux-amd64.tar.gz
vim /etc/profile
//添加以下内容
export PATH=$PATH:/usr/local/go/bin
source /etc/profile
//检测是否安装成功go
go version

4. 搭建ngrok服务器

  • a. 下载ngrok源码包
cd /usr/local
cd /usr/local
git clone https://github.com/inconshreveable/ngrok.git
  • b. 生成证书 生成并替换源码里默认的证书,注意域名修改为你自己的。 (之后编译出来的服务端客户端会基于这个证书来加密通讯,保证了安全性)
cd /usr/local/ngrok
NGROK_DOMAIN="kzone.top"
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
  • c. 替换原证书
Yes|cp base.pem /usr/local/ngrok/assets/client/tls/ngrokroot.crt
yes|cp server.crt /ngrok/ngrok/assets/server/tls/snakeoil.crt
yes|cp server.key /ngrok/ngrok/assets/server/tls/snakeoil.key
  • d. 编译生成ngrok
go env //查看环境
GOOS=linux GOARCH=amd64 make release-server

如果一切正常,ngrok/bin 目录下应该有 ngrok、ngrokd 两个可执行文件。 ngrokd 为服务器端使用的,ngrok 是 linux 客户端使用的

  • e. 运行测试 注意将域名替换为自己的
./bin/ngrokd -tlsKey="assets/server/tls/snakeoil.key" -tlsCrt="assets/server/tls/snakeoil.crt" -domain="kzone.top"  -httpAddr=":8081" -httpsAddr=":8082" -tunnelAddr=":8083"
#参数说明:
#-domain 访问ngrok是所设置的服务地址生成证书时那个
#-httpAddr http协议端口 默认为80
#-httpsAddr https协议端口 默认为443 (可配置https证书
#-tunnelAddr 通道端口 默认4443

在浏览器中输入网址 http://www.kzone.top:8081 就可以访问到 ngrok 提供的转发服务。(为了使用方便,建议把域名泛解析到 VPS 上,这样能方便地使用不同子域转发不同的本地服务。)如果浏览器中显示Tunnel liyuans.com:8081 not found,这说明ngrok服务器都已经正常启动了。下面就可以准备ngrok客户端了。

5. 添加到systemctl 服务

cd  /usr/lib/systemd/system/

在文件夹下创建 ngrok.service 文件

[Unit]
Description=Share local port(s) with ngrok
After=syslog.target network.target

[Service]
PrivateTmp=true
Type=simple
Restart=always
RestartSec=1min
StandardOutput=null
StandardError=null
ExecStart=/usr/local/ngrok/bin/ngrokd -tlsKey=/usr/local/ngrok/assets/server/tls/snakeoil.key -tlsCrt=/usr/local/ngrok/assets/server/tls/snakeoil.crt -domain=kzone.top -httpAddr=:8081 -httpsAddr=:443 -tunnelAddr=:4443 %i
ExecStop=/usr/bin/killall ngrok

[Install]
WantedBy=multi-user.target
systemctl enable ngrok.service //加入开机启动
systemctl daemon-reload  //重新载入 systemd,扫描新的或有变动的单元
Systemctl start ngrok    //启动ngrok服务

6. 客户端编译和使用

  • a. 编译生成客户端程序 根据客户端操作系统环境选择生成命令,本测试电脑为 linux 64位,故使用以下命令(注意是在ngrok服务端操作哦)
GOOS=linux GOARCH=amd64 make release-client
编译成功后会在ngrok/bin/下面生成一个ngrok文件,将其拷贝到客户端电脑的/usr/local/ngrok中
#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
  • b. 配置文件ngrok.cfg 在/usr/local/ngrok中创建ngrok.cfg
server_addr: "kzone.top:4443"
trust_host_root_certs: false

tunnels:
  http:
    subdomain: "www"
    proto:
      http: "80"

  https:
    subdomain: "ssl"
    proto:
      https: "443"
  tcp:
    remote_port: 5555
    proto:
      tcp: "8001"
  mysql:
    remote_port: 8306
    proto:
      tcp: "3306"
  ssh:
    remote_port: 2222
    proto:
      tcp: "22"
  ftp:
    remote_port: 2221
    proto:
      tcp: "21"
  • c. 启动客户端服务
ngrok -config=ngrok.cfg start web  #启动web服务
ngrok -config=ngrok.cfg start tcp  #启动tcp服务
ngrok -config=ngrok.cfg start web tcp  #同时启动两个服务
ngrok -config=ngrok.cfg start-all  #启动所有服务
//出现以下内容表示链接成功:
ngrok                                         (Ctrl+C to quit)

Tunnel Status                 online                                                                              
Version                       1.7/1.7                                                                             
Forwarding                    tcp://kzone.top:2221 -> 127.0.0.1:21                                                
Forwarding                    http://www.kzone.top:8081 -> 127.0.0.1:80                                           
Forwarding                    https://ssl.kzone.top -> 127.0.0.1:443                                              
Forwarding                    tcp://kzone.top:5555 -> 127.0.0.1:8001                                              
Forwarding                    tcp://kzone.top:8306 -> 127.0.0.1:3306                                              
Forwarding                    tcp://kzone.top:2222 -> 127.0.0.1:22                                                
Web Interface                 127.0.0.1:4040
# Conn                        0.00ms
Avg Conn Time                 0.00ms

7. 添加到systemctl 服务

在 /usr/lib/systemd/system 创建ngrok.service

[Unit]
Description=Share local port(s) with ngrok
After=syslog.target network.target

[Service]
PrivateTmp=true
Type=simple
Restart=always
RestartSec=1min
StandardOutput=null
StandardError=null
ExecStart=/usr/local/ngrok/ngrok -config /usr/local/ngrok/ngrok.cfg start-all %i
ExecStop=/usr/bin/killall ngrok

[Install]
WantedBy=multi-user.target
systemctl enable ngrok.service //加入开机启动
systemctl daemon-reload  //重新载入 systemd,扫描新的或有变动的单元
Systemctl start ngrok    //启动ngrok服务

8. 总结:

ngrok服务端作为中间代理将请求的地址转发到ngrok客户端,这样就可以在外网访问到家庭局域网中的电脑啦!配合nginx功能会更强大。 技术科普

附录:

我在部署中遇到的问题,当服务端正常启动后,如果客服端无法联通时,首先检查下客户端电脑是否能上外网,

ping www.baidu.com

如果无法联通, ping一下百度的ip地址,如果能联通说明dns解析有问题,试着在配置文件中加上dns,

service network restart  #重启服务。

ngrok(version 1.7) 百度网盘地址

链接:https://pan.baidu.com/s/17sncmqO9jAZZh0UmORShdg 提取码:pw9w

版权声明:如无特殊说明,文章均为本站原创,转载请注明出处

本文链接:http://kzone.top/article/ngrok/