巧用Ngrok实现内网穿透以及任意端口映射

网络快速发展到今天,主要还在依赖IPv4协议,传说中沙漠里的每一颗沙子都能分配到一个IP地址的IPv6协议,却一直是个传说,真正商用恐怕遥遥无期,可是在做项目的过程中,经常为端口映射发愁,之前还好,有诸如花生壳之类的动态域名能凑和着用,现在好了,运营商的IP实在有限了,PPPOE给到的IP地址,往往是以100开头的大内网IP,这对端口映射来说,简直是灭顶之灾。

正所谓穷则思变打开注册表编辑器的命令是,用不起固定IP的光纤,还得想个办法做个类似于TeamViewer那样,能够实现内网穿透的功能出来,我知道,肯定早就有人做到了,查了些资料,决定还是用ngrok一试,主要是它支持自建服务器,不必受制于人!下面是详细的步骤:

一、先决条件:1、首先要有个域名,最好是已经备案过的;2、得有台服务器,并且有固定IP,最好有防火墙保护,用来放网站的虚拟主机虽然有IP地址,哪怕是独享的,也是没用的,因为它并不是真正属于你的服务器!需要类似于阿里云的ECS才可以。3、在域名管理界面添加一条A记录,将子域名tunnel.mydomain.com解析到固定IP;

二、编译ngrok的服务器端和客户端:ngrok是开源的打开注册表编辑器的命令是,需要编译后使用,首选使用linux系统编译,笔者用的是ubuntu:

1、启用win10的Hyper-V 功能,安装Ubuntu17.10,本来笔记本电脑里面有个Ubuntu16.04的ISO镜像,谁知道装了4遍!每次都报错,输入密码登录后,桌面一直闪,根本没法操作,只能重新下载安装Ubuntu17.10,一切顺利,什么槛都没遇到,奇怪!

2、登录Ubuntu后打开终端,输入sudo passwd(或者sudo passwd root),这时候需要输入当前用户密码,注意:不是root的密码,因为root密码还没有创建,当提示输入新的UNIX密码的时候,就是设置root密码了,当终端提示已成功更新密码,则说明root密码已经设置完成了,然后输入su root,并且按要求输入刚才设置的root密码,这时,就以root身份登录系统了;

3、以root身份执行以下命令:

mkdir ngrok #创建名称为ngrok的目录,准备编译程序

apt-get update #更新包管理器

apt-get install git #安装git

git clone ngrok #将ngrok源代码克隆到本机ngrok目录

apt-get install golang #安装go语言环境

export GOPATH=/usr/local/ngrok/ #设置环境变量,Go语言的安装位置

export NGROK_DOMAIN=”tunnel.mydomain.com” #设置环境变量,ngrok域名

以下5条命令,为域名生成证书:

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 -dates

复制证书到ngrok目录

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

cp server.crt ngrok/assets/server/tls/snakeoil.crt #复制server.crt到assets/server/tls/并更名为snakeoil.crt

cp server.key ngrok/assets/server/tls/snakeoil.key #复制server.key到assets/server/tls/并更名为snakeoil.key

在ngrok目录下,运行一下命令分别生成对应的客户端与服务端:

#win服务端

GOOS=windows GOARCH=386 make release-server

#win客户端

GOOS=windows GOARCH=386 make release-client

#linux服务端

GOOS=linux GOARCH=386 make release-server

#linux客户端

GOOS=linux GOARCH=386 make release-client

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

巧用Ngrok实现内网穿透以及任意端口映射,巧用Ngrok实现内网穿透以及任意端口映射,第1张

三、部署到Windows Server服务器

1、在c:windowssystem32下建立一个目录:ngrokserver

2、将ngrokd.exe、snakeoil.crt和snakeoil.key三个文件复制到此目录

3、将此命令保存成BAT文件,并且复制到启动组ngrokd.exe -tlsKey=”snakeoil.key” -tlsCrt=”snakeoil.crt” -domain=”tunnel.mydomain.com” -httpAddr=”:801″ -httpsAddr=”:802″ 最好配置成开机后自动隐藏式运行,或许按下面的步骤注册成windows服务更好。(图2仅为示例,实际文件名称和路径根据实际情况调整)

4、下载两个小工具instsrv.exe 和srvany.exe,复制到c:windowssyswow64,然后用管理员的CMD窗口运行命令:instsrv.exe ngrok c:windowssyswow64srvany.exe

5、打开注册表编辑器,按下图添加注册表项

6、到系统服务里面,启动自定义的服务;

7、系统自带的防火墙关闭,硬件防火墙相应端口映射(801、802、4443)

四、部署到Windows客户端

2、将ngrok.exe、复制到此c:windowssystem32目录,并且新建一个名称为ngrok.cfg的配置文件,内容如下:

server_addr: “tunnel.mydomain.com:4443” #声明域名

trust_host_root_certs: false

tunnels: #声明通道的:服务、远程端口、本地协议、本地端口

mstsc:

remote_port: 53389

proto:

tcp: “3389”

将以下命令做成BAT文件,并且设置成开机自动隐藏运行ngrok -config “ngrok.cfg” start mstsc (可以按上面的步骤做成标准的windows服务,方便自启动)

最后远程桌面,测试成功

如果需要同时映射多个端口,ngrok.cfg中要做相应配置,执行命令的时候,start后面可以跟多个相应的服务名称,例如,配置文件如下:

server_addr: “tunnel.yfjtech.com:4443”

trust_host_root_certs: false

tunnels:

mstsc:

remote_port: 33889

proto:

tcp: “3389”

pusherp:

remote_port: 9003

proto:

tcp: “9003”

则执行的命令行如下:

ngrok -config “ngrok.cfg” start mstsc pusherp

本文到此结束,希望对大家有所帮助!

关于作者:

生活百科常识网