内网穿透的目的是:让外网能访问局域网内本地的应用,例如在外网访问你本地http://127.0.0.1指向的Web站点。
ngrok简介
ngrok是一个反向代理,通过在公共的端点和本地运行的Web服务器之间建立一个安全的通道。ngrok可捕获和分析所有通道上的流量,便于后期分析与响应。
开源免费
官网:https://ngrok.com/
源码:https://github.com/inconshreveable/ngrok
ngrok使用go语言开发,源代码分为客户端与服务器端。
本文需要配置有:
- 一台外网服务器A,windows或linux都行,我外网服务器是linux系统;
- 域名,如martin.com,并且解析到外网服务器A上;
- 内网本机,windows系统或linux系统都行,我本地是windows系统;
- 本机属于局域网,但可以上外网 。
开始安装ngrok服务端与客户端程序
本文外网服务器使用的是ubuntu系统,内网本机使用的是windows系统;
第一步 在外网服务器上安装必要的软件
apt-get update
sudo apt-get install make build-essential golang mercurial binutils bison gcc git
因为ngrok是Go编写的,所以需要安装Golang。
第二步 下载ngrok源码
ubuntu@ubuntu:~$ cd /tmp/
ubuntu@ubuntu:/tmp$ git clone https://github.com/inconshreveable/ngrok.git ngrok2
配置域名
需要将ngork指向你的公网ip, *.ngork执行你的二级域名ngork,也就是例子中的ngork.martin.com。
PS. ngrok名称可以任意,所以我就写了个ngork,哈哈哈
第三步 配置外网服务器
设置环境变量
ubuntu@ubuntu:/tmp/ngrok2$ export GOPATH=/usr/local/ngrok/ #设置环境变量,Go语言的安装位置
ubuntu@ubuntu:/tmp/ngrok2$ export NGROK_DOMAIN="ngork.martin.com" #设置环境变量,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 server.key 2048
openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csr
openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 5000
证书如下:
ubuntu@ubuntu:/tmp/ngrok2$ ls
assets contrib docs Makefile README.md rootCA.pem server.crt server.key
bin CONTRIBUTORS LICENSE pkg rootCA.key rootCA.srl server.csr src
拷贝证书到指定位置
cp rootCA.pem assets/client/tls/ngrokroot.crt #复制rootCA.pem到assets/client/tls/并更名为ngrokroot.crt
cp server.crt assets/server/tls/server.crt #复制server.crt到assets/server/tls/
cp server.key assets/server/tls/server.key #复制server.key到assets/server/tls/
编译服务端与客户端
# 在ngrok2目录下,编译会在ngrok2/bin目录下生成对应系统的文件夹和文件
# win x86服务端
GOOS=windows GOARCH=386 make release-server
# win x86客户端
GOOS=windows GOARCH=386 make release-client
# win x64客户端
GOOS=windows GOARCH=amd64 make release-client
# linux服务端
GOOS=linux GOARCH=386 make release-server
# linux客户端
GOOS=linux GOARCH=386 make release-client
# 编译后bin目录下文件如下:进入文件夹就是所需要的应用程序
ubuntu@ubuntu:/tmp/ngrok2/bin$ ls
go-bindata linux_386 windows_amd64
ngrok服务端部署到ubuntu服务器上
# 80是http端口
# 443是https端口
# 默认隧道端口为4443
sudo /tmp/ngrok2/bin/linux_386/ngrokd -tlsKey=/tmp/ngrok2/server.key -tlsCrt=/tmp/ngrok2/server.crt -domain="ngork.martin.com" -httpAddr=":80" -httpsAddr=":443"
这样ngrok服务端就已经搭建好了
第四步 使用windows客户端
把bin目录下的windows_amd64目录下的ngrok.exe拷贝到windows系统的d:/ngork目录下(因为我是windows 64位系统 所以使用amd64)
在ngrok.exe同目录下,创建ngrok.cfg文件并写入:
server_addr: "ngork.martincom:4443"
trust_host_root_certs: false
启动客户端:
ngrok.exe -config=ngrok.cfg -subdomain ljs 8089
运行成功会出现如下:
ngrok (Ctrl+C to quit)
Tunnel Status online
Version 1.7/1.7
Forwarding http://ljs.ngork.martin.com -> 127.0.0.1:8089
Forwarding https://ljs.ngork.martin.com -> 127.0.0.1:8089
Web Interface 127.0.0.1:4040
# Conn 2
Avg Conn Time 25.00ms
但原始版本的ngrok的server是没有身份验证功能的,也就是说任何人都可以通过ngrok 1.x的client使用我们的服务器,毕竟是私人的服务器,所以我希望给ngrok加上身份验证的功能。 这时候可以参考大神写的身份验证文章,亲测有效 :给ngrok添加身份验证
参考链接:
https://github.com/inconshreveable/ngrok/blob/master/docs/SELFHOSTING.md
https://blog.csdn.net/zhangguo5/article/details/77848658
https://prikevs.github.io/2016/12/26/add-authentication-to-ngrok/
https://www.jianshu.com/p/4b03fb532145