用Ngrok实现内网穿透

用Ngrok实现内网穿透
最新回答
爱情,从来不晚

2021-05-15 23:36:30

Ngrok简介:

Ngrok是用于内网穿透的开源软件,它的1.x版本存在内存泄漏问题,从2.x版本开始转向闭源。其工作原理是:服务器端运行于拥有公网IP的服务器上,监听http、https及tunnel端口,等待客户端连接。客户端在需要穿透的内网机器上运行,连接至服务器后,服务器开始监听客户端指定端口,外网用户连接服务器监听端口,服务器将用户数据转发至内网客户端,实现内网穿透。

准备工具:

1. 源码地址:github.com/inconshrevea...

2. 外网服务器:配备公网IP的服务器,需设置子域名(A、CNAME)。

3. 内网客户端:可以是虚拟机,本文以Ubuntu 20.04为例。

准备编译环境:

1. 安装go:使用命令`sudo apt install golang`。

2. 安装git:通过命令`sudo apt install git`实现。

3. 生成自签名证书:执行`cd ngrok`至项目目录,设置服务器域名`NGROK_DOMAIN="ngrok.abc.com"`。然后依次运行`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 device.key 2048`、`openssl req -new -key device.key -subj "/CN=$NGROK_DOMAIN" -out device.csr`、`openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000`。

4. 将证书复制到指定文件夹:`cp rootCA.pem ../assets/client/tls/ngrokroot.crt`、`cp device.crt ../assets/server/tls/snakeoil.crt`、`cp device.key ../assets/server/tls/snakeoil.key`。

编译服务器和客户端:

1. 服务器编译:在Linux系统中,使用命令`GOOS=linux GOARCH=386 make release-server`(32位)或`GOOS=linux GOARCH=amd64 make release-server`(64位),针对Mac OS和Windows系统,分别使用相应命令进行编译。

2. 客户端编译:根据系统类型,执行`GOOS=linux GOARCH=386 make release-client`(32位)或`GOOS=linux GOARCH=amd64 make release-client`(64位),同样包括Mac OS和Windows系统。

编译完成后,服务器和客户端程序将被生成在bin文件夹中。

运行服务器:

将`ngrokd`程序复制至服务器指定目录,若端口被占用可更改端口号,并确保开启防火墙并打开端口允许外网访问。具体操作参考相关文章。

开启服务器命令:`./ngrokd -domain="ngrok.abc.com" -httpAddr=":7080" -httpsAddr=":7010" -tunnelAddr=":7000"`。成功运行时会显示相应提示。

运行客户端:

将`ngrok`程序复制至客户端指定目录,创建`ngrok.yml`配置文件,配置如下内容:`./ngrok -config=ngrok.yml -log=ngrok.log start http ssh`。成功时将显示相关信息,即可通过设置的网址访问客户端。

补充:

1. 若服务端80端口被占用,可以使用Nginx进行转发,例如访问`test.ngrok.abc.com`即可转发至`ngrok.abc.com:7080`。