ngrok搭建内网穿透服务

TMaize 于 2019-03-09 发布

ngrok 是一款内网穿透软件,可以是你的本地项目在公网上访问。使用最多的就是微信开发调试和向别人展示你的本地项目。

之所以要自己搭建就是因为网上的收费太贵。免费的太慢且不稳定。

这里推荐下小米球 ngrok,有免费和付费服务,免费的也挺稳定的,唯一的缺点是和客户端天天更新。。。

准备域名

先把域名 A 记录解析到服务器,注意这里做泛域名解析,做两条解析,主机记录填写例如ngrok*.ngrok

之后 ping 一下ngrok.xxx.com任意.ngrok.xxx.com有没有解析好,大概要 5 分钟左右

如果能对ngrok.xxx.com申请到泛域名 SSL 证书是最好的,可惜腾讯云里免费的 SSL 证书不支持泛域名

这里我们自己生成证书,缺点是浏览器会进行提示

cd ~
mkdir ca
cd ~/ca
openssl genrsa -out base.key 2048
openssl req -new -x509 -nodes -key base.key -days 10000 -subj "/CN=ngrok.xxx.com" -out base.pem
openssl genrsa -out server.key 2048
openssl req -new -key server.key -subj "/CN=ngrok.xxx.com" -out server.csr
openssl x509 -req -in server.csr -CA base.pem -CAkey base.key -CAcreateserial -days 10000 -out server.crt

下载源码编译

这里是 github 上的官方地址https://github.com/inconshreveable/ngrok

先说明下,ngrok 是使用 go 语言写的,所以先要把 go 的环境搭好,GOPATH 等配置好,这里略过

cd ~
git clone https://github.com/inconshreveable/ngrok.git

对 SSL 证书做替换

cp ~/ca/base.pem ~/ngrok/assets/client/tls/ngrokroot.crt
cp ~/ca/server.crt ~/ngrok/assets/server/tls/snakeoil.crt
cp ~/ca/server.key ~/ngrok/assets/server/tls/snakeoil.key

编译过程中需要下载依赖,稍等片刻

# 编译客户端,windows系统上用
export GOOS=windows
export GOARCH=amd64
make release-client

# 编译服务端
export GOOS=linux
export GOARCH=amd64
make release-server

编译后的文件会在 bin 目录下生成

build

运行

cd bin
./ngrokd -domain='ngrok.xxx.com' -httpAddr=':7080' -httpsAddr=':7443' -tunnelAddr=':7000'

把 windows_amd64/ngrok.exe 文件夹下下载到本地,同级目录下新建 ngrok.cfg 配置文件

ngrok.cfg 内容如下。这里的 7000 端口是连接服务端用的,因此服务端一致

server_addr: "ngrok.xxx.com:7000"
trust_host_root_certs: false

启动命令,subdomain 用于设置访问域名,5500 为本地应用服务的端口

ngrok.exe -log=ngrok.log -config=ngrok.cfg -subdomain test 5500

result

现在通过http://test.ngrok.xxx.com:7080即可访问你在本地 5500 单口启动的项目了

nginx 代理

使用带有端口的域名还是优点麻烦,可以使用 nginx 做下反向代理

server {
    listen 80;
    server_name *.ngrok.xxx.com;
    location / {
        proxy_pass http://127.0.0.1:7080;
        proxy_set_header Host $host:7080;
        proxy_redirect off;
        client_max_body_size 10m;
        client_body_buffer_size 128k;
        proxy_connect_timeout 90;
        proxy_read_timeout 90;
        proxy_buffer_size 4k;
        proxy_buffers 6 128k;
        proxy_busy_buffers_size 256k;
        proxy_temp_file_write_size 256k;
    }
}

这样就可以直接使用http://test.ngrok.xxx.com访问了