ngrok内网穿透原理 (ngs和ngrok内网穿透)

1.基础环境

# 安装 gcc

yum -y install gcc

yum -y install gcc-c++

安装 golang , *载下**地址在https://studygolang.com/dl中找的,想换版本可以在这里找

wget https://studygolang.com/dl/golang/go1.8.linux-amd64.tar.gz

tar -zxvf go1.8.linux-amd64.tar.gz

vi /etc/profile #文件中加上环境变量

export GOROOT=你的go解压地址(如:/root/go)

export PATH=$PATH:$GOROOT/bin

source /etc/profile #使环境生效(或者重启:reboot)

go version #查看go是否安装成功

2.*载下**源码

#安装git 用于*载下**ngrok代码

yum -y install git

#克隆代码,文件夹命名为 ngrok-server,也可以填写,默认就是ngrok

git clone https://github.com/inconshreveable/ngrok.git ngrok-server

3.ngrok配置

执行一下命令。使用ngrok.com官方服务时,我们使用的是官方的SSL证书。自建ngrokd服务,如果不想买SSL证书,我们需要生成自己的自签名证书,并编译一个携带该证书的ngrok客户端。

证书生成过程需要一个NGROK_BASE_DOMAIN。 填写我们的域名地址

cd ngrok-server #进入安装根目录

NGROK_DOMAIN="ngrok.你的域名.com"

openssl genrsa -out rootCA.key 2048

openssl req -new -x509 -nodes -key rootCA.key -days 10000 -subj "/CN=$NGROK_DOMAIN" -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 -days 10000 -out server.crt

4.复制证书

经过以上步骤,证书已经生成,下面复制证书到默认读取目录下

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

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

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

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

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

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

上面会让你提示是否覆盖,输入y即可。如果不想每次都提示,可以使用如下命令,这是一个骚操作。

cp前面加上一个\,然后加上-rf即可没有提示,直接覆盖。

\cp -rf rootCA.pem assets/client/tls/ngrokroot.crt

\cp -rf server.crt assets/server/tls/snakeoil.crt

\cp -rf server.key assets/server/tls/snakeoil.key

5.https配置

网站配置SSL证书(https),使网站可以通过https访问

我们申请的是Let's Encrypt通配符SSL证书,因为他是免费的

1.获取 Certbot 客户端

*载下** Certbot 客户端 ,并且添加可执行权限

cd /usr/local/

wget https://dl.eff.org/certbot-auto

chmod a+x certbot-auto

./certbot-auto certonly -d "*.ngrok.你的域名.com" -d "ngrok.你的域名.com" --manual --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory

执行到最后一步时,先暂时不要回车。申请通配符证书是要经过DNS认证的,接下来需要按照提示在域名后台添加对应的DNS TXT记录。等个10分钟左右

确认生效后,回车继续执行

更换证书

cd /root/ngrok-server

cp /etc/letsencrypt/live/ngrok.你的域名.com/privkey.pem /root/ngrok-server/assets/server/tls/snakeoil.key

cp /etc/letsencrypt/live/ngrok.你的域名.com/fullchain.pem /root/ngrok-server/assets/server/tls/snakeoil.crt

cp /etc/letsencrypt/live/ngrok.你的域名.com/fullchain.pem /root/ngrok-server/assets/client/tls/ngrokroot.crt

6.生成程序

生成客户端和服务器端

#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

我只用到linux服务器端和win客户端,我只需要执行如下即可。

根据自己需要生成

#linux服务端

GOOS=linux GOARCH=386 make release-server

#win客户端

GOOS=windows GOARCH=386 make release-client

第一次生成需要点时间,因为golang编译需要*载下**一些插件。

编译后的软件在bin目录下

httpAddr,httpsAddr为访问服务端端口,可以设置为80和443,访问的时候不用加端口号.

tunnelAddr为给客户端提供的连接端口默认4443可自行修改,这里改为8092

### 后台运行

使用服务模式

将以下代码保存为ngrokd.service文件,放在/etc/systemd/system/目录

注意替换路径 root/ngrok-server/bin/linux_386/ 为ngrok服务端目录

#/etc/systemd/system/ngrokd.service

[Unit]

Description=ngrok

After=network.target

[Service]

ExecStart=/root/ngrok-server/bin/linux_386/ngrokd -tlsKey="/root/ngrok-server/assets/server/tls/snakeoil.key" -tlsCrt="/root/ngrok-server/assets/server/tls/snakeoil.crt" -domain="ngrok.你的域名.com" -httpAddr=":8090" -httpsAddr=":8091" -tunnelAddr=":8092"

LimitNOFILE=1048576

LimitNPROC=1048576

Restart=always

RestartSec=10

StartLimitInterval=0

[Install]

WantedBy=multi-user.target

systemctl enable ngrokd.service#开机启动ngrokd服务

systemctl start ngrokd.service#启动ngrokd服务

注意:阿里云需要配置安全组规则

7.客户端

*载下**bin/windows_386目录下的ngrok*ex.e**文件

http/https

ngrok.cfg

server_addr: ngrok.你的域名.com:8092

trust_host_root_certs: false

start.bat

@echo OFF

set /p clientid= 请输入域名前缀:

echo.

set /p port= 请输入内网端口:

echo.

ngrok -config=ngrok.cfg -proto=http -subdomain=%clientid% %port%

# https使用

# ngrok -config=ngrok.cfg -proto=https -subdomain=%clientid% %port%

运行start.bat

tcp

start.bat

start ngrok*ex.e** -proto=tcp -config=tcp.cfg start vnc ssh

ngrok.cfg

server_addr: ngrok.你的域名.com:8092

trust_host_root_certs: false

tunnels:

ssh:# 名称

remote_port: 33333 #服务器分配tcp转发端口,不填写由服务器随机分配

proto:

tcp: 33333 #映射本地的端口

vnc:# 名称

remote_port: 33339

proto:

tcp: 33339

注意:tcp需要开放对应的端口

8.注意事项

  • 服务器的安全组一定要配置。
  • 关闭防火墙。
  • 域名泛解析 *.ngrok.你的域名.com