自建ngrok内网穿透服务

发表于 2019-05-21  5.78k 次阅读


内网穿透的目的:

通过访问公网能够直接访问到内网的数据

在公司中有个树莓派接入内网,需要在公网进行访问,由于公司防火墙限制多数端口都封了,ngrok开源版可以自定义参数,就使用ngrok进行穿透

ngrok 开源版目前停止更新,最新开源版为1.7.1

商业版详情见官网 https://ngrok.com/

注意:不要在生产中运行这一版ngrok(1.X)。众所周知,客户端和服务器都存在严重的可靠性问题,包括内存和文件描述符泄漏以及崩溃。由于服务器是SPOF,因此也没有HA故事。建议您为任何生产质量体系运行2.0。

ngrok

实现原理
通过内网客户端访问外网服务器,外网服务器进行转发,实现内网穿透

搭建条件:

需要一台公网服务器或VPS(有需要可以联系我,提供免费端口供使用)

--部署步骤--

公网VPS系统为centos7

1、安装依赖包:

yum install  git glibc glibc-devel  glibc-devel.i686 zlib-devel openssl-devel perl hg cpio expat-devel gettext-devel curl curl-devel perl-ExtUtils-MakeMaker hg wget gcc gcc-c++ -y #golang可选下面将使用源码包方式安装
cd /opt
wget https://www.izhuhn.cn/wp-content/uploads/2019/05/go1.4.linux-386.tar.gz
tar -zxvf go1.4.linux-386.tar.gz
export GOROOT=/opt/go
export PATH=$PATH:$GOROOT/bin

2、从github获取ngrok:

cd /opt
git clone https://github.com/inconshreveable/ngrok.git
#国内网络可能部分包无法下载可以使用我在国外服务器编译过的版本(wget https://www.izhuhn.cn/wp-content/uploads/2019/06/ngrok.tar.gz)解包后下面步骤是一样的
cd ngrok

3、生成证书:

使用ngrok官方服务时,使用的是官方ssl证书。自建需要生成SSL证书

openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=tunnel.izhuhn.cn" -days 5000 -out rootCA.pem
openssl genrsa -out device.key 2048
openssl req -new -key device.key -subj "/CN=tunnel.izhuhn.cn" -out device.csr
openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000

将生成的证书与ngrok源码中的assets/client/tls和assets/server/tls目录下的证书进行替换,编译后将会把assets目录打包进可执行文件

cp rootCA.pem assets/client/tls/ngrokroot.crt
cp device.crt assets/server/tls/snakeoil.crt
cp device.key assets/server/tls/snakeoil.key

4、编译ngrokd(服务端)和ngrok(客户端)

make release-server #编译服务端程序生成到ngrok/bin目录
make release-client #编译客户端程序生成到ngrok/bin目录

5、启动ngrokd

./bin/ngrokd -domain="tunnel.izhuhn.cn" -tunnelAddr=":23" -httpAddr=":685"

采用子域名方式 需要加入解析以及泛域名解析 tunnelAddr(隧道端口)为23端口,此端口主要用于数据传输,可随意更改  httpAddr()端口为685 这个为客户端默认(http+https)连接端口,只能用于web访问,类似ssh这些tcp协议无法使用 需要客户端指定tcp协议

6、客户端使用:

./ngrok -subdomain ceshi -config=ngrok.cfg 22

需要指定隧道流量协议"http"、"https"、"tcp",默认为(http+https)

未指定隧道协议为默认的http+https协议 访问公网的http协议的685端口可以通过隧道至内网的22端口
./ngrok -subdomain ceshi -config=ngrok.cfg --proto=tcp 22 #上面的请求用于http无法正常使用ssh

将端口tcp流量转发到公网ip上的随机端口

tcp协议 访问公网的52169端口可以通过隧道至内网的22端口

ngrok.cfg配置文件

server_addr: "tunnel.izhuhn.cn:23"
trust_host_root_certs: fslse
#ngrok配置文件为yaml语法

可以将命令行启动的参数全部写入配置文件然后执行ngrok start 配置文件 tunnel-name

server_addr: "tunnel.izhuhn.cn:23"
trust_host_root_certs: false
tunnels:
    ssh:
        remote_port: 4222
        proto:
            tcp: 22

ngrok默认查看配置文件路径为$home/.ngrok

一次性指定多端口,并指定远程访问端口

server_addr: "tunnel.izhuhn.cn:23"
trust_host_root_certs: false
tunnels:
    ssh:
        remote_port: 4222
        proto:
            tcp: 22
    ftp:
        remote_port: 20
        proto:
            tcp: 20
    http:
        subdomain: www
        proto:
            http: 80
            https: 192.168.226.6:443
 

交叉编译其他平台客户端(直接编译后只能用于同平台)

cd /opt/go/src
export GOOS=windows;export GOARCH=amd64;export CGO_ENABLED=0 #windows客户端
./make.bash
cd /opt/ngrok
make release-client #命令将生成在./bin/windows_amd64
#以下是几个平台的参数需要的自行替换
export GOOS=linux;export GOARCH=arm;export CGO_ENABLED=0  #arm客户端
export GOOS=windows;export GOARCH=amd64;export CGO_ENABLED=0 #windows客户端
export GOOS=darwin;export GOARCH=amd64;export CGO_ENABLED=0 #mac客户端
参数说明:
GOOS:目标平台的操作系统(darwin、freebsd、linux、windows) 
GOARCH:目标平台的体系架构(386、amd64、arm) 
交叉编译不支持 CGO 所以要禁用它

客户端官方使用文档: https://ngrok.com/docs#getting-started-expose

本站文章基于国际协议BY-NA-SA 4.0协议共享;
如未特殊说明,本站文章皆为原创文章,请规范转载。

2

scanz个人博客