ngrok内网穿透

  |  

ngrok内网穿透:
通过ngrok实现外网I访问内网web服务器

内网穿透的需求

最近一直想实现校园内网之间的资源共享和分享校园生活,数据共享采用p2p的方式,这样可以减小服务器的压力,而且下载速度是随着下载人数的增加而上升的。如果通过FTP,C/S架构的方式会随着下载量的增加而减小,因为服务器的总出口带宽是一定的,所以很容易理解。这样就解决了数据共享。

对于分享校园生活,最好的方式就是建立论坛,每个人可以通过发帖来进行交流。所以CAUC-OB就这样诞生了。该服务器搭建与内网中,所以内网访问可以免流同时速度还更快。但是搭建与内网的缺点就是外网无法访问,很容易理解,该服务器的地址为10.5.42.11很明显为A类IP地址的内网IP段所以外网肯定无法访问。所以此时就有实现内网穿透的需求。

ngrok实现内网穿透

对于内网穿透有很多其它的方式,这里就不一一介绍,其它的方式有收费的,有限定免费的,对于我当然想用完全自主的方式来实现,所以这里选择了ngrok开源项目来实现内网穿透。ngrok需要内网客户端连接外网服务端来实现内网穿透。

ngrok个平台系统版本

我这里使用的win10自带的ubuntu来实现对于客户端和服务端的编译的,对于Linux环境,可以通过安装双系统(这种方式我不是很推荐,因为两个系统如果想实现数据交换linux需要支持NTFS文件系统,在众多的文件系统中linux偏偏对NTFS的支持不是很好(毕竟NTFS是一个闭源的商业系统)),或是安装虚拟机,在虚拟机中运行Linux系统即可。

我的Linux环境如下:

​ 系统:Ubuntu18.04

外网服务器版本:

​ 系统:CentOS7

内网服务器版本:

​ 硬件平台:树莓派3

​ 系统:Raspberry

编译ngrok服务端与客户端

克隆ngrok源码:

git clone https://github.com/inconshreveable/ngrok.git #将ngrok源代码克隆回本地

克隆好的目录结构如下:

zhangshuo@DESKTOP-2AKT8V3:~/ngrok2$ pwd #显示当前目录路径
/home/zhangshuo/ngrok2
zhangshuo@DESKTOP-2AKT8V3:~/ngrok2$ ls #克隆好的目录结构
CONTRIBUTORS Makefile assets contrib src
LICENSE README.md bin docs

安装go语言环境:

sudo apt-get update #更新库
sudo apt-get install golang #安装go语言

设置环境变量:

export GOPATH=/usr/local/ngrok/  #设置环境变量,Go语言的安装位置
export NGROK_DOMAIN="ngrok.yourdomain.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

生成的证书如下:

zhangshuo@DESKTOP-2AKT8V3:~/ngrok2$ ls
CONTRIBUTORS Makefile assets contrib rootCA.key rootCA.srl server.csr src
LICENSE README.md bin docs rootCA.pem server.crt server.key

拷贝证书到指定位置:

cp rootCA.pem assets/client/tls/ngrokroot.crt  #复制rootCA.pem到assets/client/tls/并更名为ngrokroot.crt
cp server.crt assets/server/tls/snakeoil.crt #复制server.crt到assets/server/tls/并更名为snakeoil.crt
cp server.key assets/server/tls/snakeoil.key #复制server.key到assets/server/tls/并更名为snakeoil.key

进行编译:

#linux服务端
GOOS=linux GOARCH=386 make release-server
#linux客户端
GOOS=linux GOARCH=386 make release-client
#树莓派客户端
GOOS=linux GOARCH=ram make release-client

生成完成后,在工作目录的bin文件夹下,产生对应的文件。以编译linux平台为例,会产生“ngrok”与“ngrokd”这两个文件,前者客户端,后者需要运行在公网服务器上。

如下结构所示:

zhangshuo@DESKTOP-2AKT8V3:~/ngrok2$ tree bin/
bin/
├── go-bindata
├── linux_386
│   ├── ngrok
│   └── ngrokd
└── linux_arm
└── ngrok

2 directories, 4 files

此时定制的客户端和服务端以准备就绪。

添加域名解析

在自己的域名解析中将*.ngrok与ngrok都指向您的主机IP,我的域名为腾讯云负责解析的:

服务端配置

将bin/linux_386/ngrokd,snakeoil.key,snakeoil.crt三个文件上传至服务器,在服务器端运行ngrok服务程序。

我这里使用xshell连接centos进行配置,服务器中的文件格式为:

因为使用的是xshell登陆的服务器,所以如果在终端中启动服务的话当终端关闭之后进程也会结束所以要使用screen命令进行程序的后台运行。

# zhangshuo @ VM_0_7_centos in ~/ngrok [10:56:23] #使用screen命令打开一个屏幕
$ screen

然后启动服务端程序:

# zhangshuo @ VM_0_7_centos in ~/ngrok [10:57:01] C:1 #注意该目录下必须包含ngrokd运行程序,且该程序要给执行权限,和snakeoil.key,snakeoil.crt这两个文件
$ sudo ./ngrokd -tlsKey="snakeoil.key" -tlsCrt="snakeoil.crt" -domain="ngrok.zhangshuocauc.cn" -httpAddr=":801" -httpsAddr=":802" &

启动服务后将screen送入后台运行即可:

将该screen送入后台的命令为:Ctrl+a,d。此时服务端配置完毕

客户端配置

同样的将bin/linux_arm/ngrok文件拷贝到树莓派客户端中家目录下。

在家目录下建立ngrok配置文件:

touch ngrok.cfg #建立ngrok的配置文件
vim ngrok.cfg #使用vim编辑器进行编辑
在该文件中写入如下配置
server_addr: "ngrok.你的域名.com:4443"
trust_host_root_certs: false

在树莓派客户端中加入开机启动程序即在/etc/rc.local文件中加入客户端启动的命令:

sudo vim /etc/rc.local #使用管理员权限编辑rc.loal文件,并在exit0前面加入
/home/pi/ngrok -subdomain kyt -config=/home/pi/ngrok.cfg 80 &>/dev/null &

上面的命令即为启动ngrok客户端的配置命令,上面的命令采用绝对路径的方式

此时配置完毕将树莓派端重启即可通过访问:http://kyt.ngrok.zhangshuocauc.cn:801/

来实现外网访问内网的web服务。

-EOF

文章目录
  1. 1.
  2. 2. 内网穿透的需求
  3. 3. ngrok实现内网穿透
    1. 3.1. ngrok个平台系统版本
    2. 3.2. 编译ngrok服务端与客户端
  4. 4. 添加域名解析
  5. 5. 服务端配置
  6. 6. 客户端配置
, , 本站文章总字数: 40.5k