内网穿透 --- 搭建自己的ngork服务器及身份认证

martin6699 · · 1276 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

内网穿透的目的是:让外网能访问局域网内本地的应用,例如在外网访问你本地http://127.0.0.1指向的Web站点。

ngrok简介

ngrok是一个反向代理,通过在公共的端点和本地运行的Web服务器之间建立一个安全的通道。ngrok可捕获和分析所有通道上的流量,便于后期分析与响应。

开源免费
官网:https://ngrok.com/
源码:https://github.com/inconshreveable/ngrok

ngrok.png

ngrok使用go语言开发,源代码分为客户端与服务器端。

本文需要配置有:

  1. 一台外网服务器A,windows或linux都行,我外网服务器是linux系统;
  2. 域名,如martin.com,并且解析到外网服务器A上;
  3. 内网本机,windows系统或linux系统都行,我本地是windows系统;
  4. 本机属于局域网,但可以上外网 。

开始安装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
配置域名
image.png

需要将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


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:martin6699

查看原文:内网穿透 --- 搭建自己的ngork服务器及身份认证

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1276 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传