自建 ngrok 内网穿透服务

ngrok内网穿透 是什么,有啥用处,以及为什么自建服务,这里我就不再多说了,相信点进来的人也不需要我解释这些。

准备工作

  • 有公网 IP 的 VPS 一台
  • 可以配置域名解析的域名一个。
  • 系统:CentOS (也可为其他,命令稍有不同)

配置域名解析

先把域名给配置了,比如我的域名是 zhaojun.im,那么建立 ngrok.zhaojun.im*.ngrok.zhaojun.im 解析到 你的 VPS 的 IP 上 (A 记录)。

安装 go 语言环境

ngrok 是基于 go 语言开发的,所以需要先安装 go 语言开发环境,CentOS 可以使用 yum 安装:

1

yum install golang

如果没有权限,请使用 sudo 安装,安装完成之后,执行 go version 看到类似信息,证明安装成功:

1

go version go1.7.3 linux/amd64

安装 git 环境

有些 VPS 的系统中自带了 git 环境,有的没有带,如果你的 git 使用不正常,请卸载自带的 git,重装安装。

卸载原有 git (根据需要自选):

1

yum remove git

更新 yum 源:

1

yum update

安装 git :

1

yum install git

安装完后执行 git --version,返回类似的信息,证明安装成功:

1

git version 2.5.0

下载 ngrok 源码:

找一个存放 ngrok 的文件夹 ,clone 一份源码:

(为了方便演示,本文使用 root 用户,所以存放在 /root/ 路径下)

cd /root
git clone https://github.com/inconshreveable/ngrok.git
export GOPATH=/root/ngrok

生成自签名证书

使用 ngrok 官方服务时,我们使用的是官方的 SSL 证书。自己建立 ngrok 服务,需要我们生成自己的证书,并提供携带该证书的 ngrok 客户端。

证书生成过程需要有自己的一个基础域名,官网随机生成的地址,如:695a358d.ngrok.com,基础域名就是 ngrok.com。而在上文中提到的二级域名 ngrok.zhaojun.im 就是用来作为这次要提供的基础域名。如果你的域名是 abc.com,那么域名基础域名可以设置为 ngrok.abc.com

以我的基础域名为例(注意替换成自己的域名),生成证书过程如下:

cd /root/ngrok
openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=ngrok.zhaojun.im" -days 5000 -out rootCA.pem
openssl genrsa -out device.key 2048
openssl req -new -key device.key -subj "/CN=ngrok.zhaojun.im" -out device.csr
openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000

执行完成以上命令后,在 ngrok 目录下,会新生成 6 个文件:

1

device.crt device.csr device.key rootCA.key rootCA.pem rootCA.srl

我们在编译可执行文件之前,需要把生成的证书分别替换到 assets/client/tlsassets/server/tls 中,这两个目录分别存放着 ngrokngrokd 的默认证书。

cp rootCA.pem assets/client/tls/ngrokroot.crt

cp device.crt assets/server/tls/snakeoil.crt

cp device.key assets/server/tls/snakeoil.key

中间会提示是否覆盖,输入 y 确认即可。这里最好一行一行复制执行,别一起复制执行。

编译 ngrokd 和 ngrok

ngrokd 是服务端的执行文件,进入到 ngrok 目录下,执行如下命令编译:

1

make release-server

ngrok 是客户端的可执行文件,进入到 ngrok 目录下,执行如下命令编译:

1

GOOS=xxx GOARCH=xxx make release-client

不同平台使用不同的 GOOSGOARCHGOOS 为编译出来的操作系统 (windows,linux,darwin),GOARCH 对应的构架 (386, amd64, arm)

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

然后下载编译后的客户端,通过 ftp 或 scp 等都可以,生成的目录在 ngrok 的 bin 目录下,当前例子的路径为 /root/ngrok/bin/windows_amd64/ngrok.exe

启动 ngrokd 服务器

在 ngrok 的 bin 目录下执行:

1

./ngrokd -domain="ngrok.zhaojun.im" -httpAddr=":8088" -httpsAddr=":8089"

其中,-domain 为你的 ngrok 服务域名,-httpAddr 为 http 服务端口地址,访问形式为:xxx.ngrok.zhaojun.im:8088,也可设置为 80 默认端口,注意端口冲突即可,-httpsAddr 为 https 服务,同上。

ngrokd 启动后,退出命令行即关闭服务。如果想要在后台运行,则执行:

1

nohup ./ngrokd -domain="ngrok.zhaojun.im" -httpAddr=":8088" -httpsAddr=":8089" &

注意末尾需要有 & 号,详细搜索 nohup 了解。 关闭服务只需通过:

ps -A # 找到PID,执行关闭

kill xxxid

启动 ngrok 客户端

上面我们编译好了客户端并下载到了本地,演示路径为 d:/ngrok/ngrok.exe

d:/ngrok/ 目录下,建立 ngrok 配置文件:ngrok.cfg

server_addr: "ngrok.zhaojun.im:4443"

trust_host_root_certs: false

server_addr 端口默认 4443,还需要服务器开启 4443 端口,使用阿里云或腾讯云的需要去安全组放行 4443 外网端口,不然无法正常使用。

然后使用 cmd 到这个路径下(d:/ngrok/),执行命令启动并转发本地的 4000 端口:

1

ngrok -subdomain demo -config=./config.cfg 4000

运行完了以后会有提示域名,根据提示域名访问,我这里这里为 : http://demo.ngrok.zhaojun.im:8088,访问这个就等于访问到你的 http://127.0.0.1:4000 下的内容了。

更详细的 ngrok 配置,请参考官方文档 : https://ngrok.com/docs

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏欧阳大哥的轮子

Windows窗口消息和消息队列

所有基于事件驱动的操作系统中的GUI程序,都会在主线程中运行一个消息泵来从消息队列中取出消息并执行对应的处理逻辑。消息队列中的消息除了由系统产生外,还提供了对应...

32950
来自专栏技术栈大杂烩

Linux: 关于 SIGCHLD 的更多细节

对该机制有稍微了解的话,不难得知一个关键因素:SIGCHLD。正是这个SIGCHLD起到了通知的作用,所以后面的处理也是基于它而实现。

20560
来自专栏张善友的专栏

ASP.NET 4 AppFabric 输出缓存提供程序

缓存是用来保存你数据的地方,从而使你的应用程序访问更快速。缓存可以根据你的需要分配到许多台机器上,而开发人员无需关心数据究竟在哪台机器上。为了获得超快的性能,你...

20490
来自专栏大内老A

ASP.NET Core应用针对静态文件请求的处理[1]: 以Web的形式发布静态文件

虽然ASP.NET Core是一款“动态”的Web服务端框架,但是在很多情况下都需要处理针对静态文件的请求,最为常见的就是这对JavaScript脚本文件、CS...

20450
来自专栏有困难要上,没有困难创造困难也要上!

Pyinstaller ERROR: Assembly amd64_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.21022.8_none not found

48480
来自专栏章鱼的慢慢技术路

Linux操作_常用命令操作练习

18740
来自专栏程序员的SOD蜜

Erlang语言学习入门

近期研究RabbitMQ,发现它是基于Erlang实现的,于是对Erlang这么语言发生了兴趣,官网地址 http://www.erlang.org/ ,去下载...

312100
来自专栏张善友的专栏

Debian 和Ubuntu Mono 3.0 部署包

Mono 3.0 刚发布,Debian 的Mono打包工作也开始了, 这篇博客《Mono 3.0 Preview Packages for Debian and...

21670
来自专栏跟着阿笨一起玩NET

Winform登录窗体登录仿asp.net验证成功后进入主界面

一、登录界面验证成功后进入主界面,否则则退出应用程序。 假设登录窗体frmLogin.cs和主界面frmMain.cs在程序的Main入口这样来实现:

21310
来自专栏Ken的杂谈

ASP.NET Core 入门教程 3、ASP.NET Core MVC路由入门

本篇代码基于上一篇进行调整:https://github.com/ken-io/asp.net-core-tutorial/tree/master/chapte...

16230

扫码关注云+社区

领取腾讯云代金券