如您需要技术咨询、解决方案定制、故障排除、运维监控等服务,可联系ericwcn#at#163.com。

Ngrok内网穿透

网络技术 立杰 348℃ 0评论

1.前言

在IT企业和软件服务外包企业中,研发人员经常需要开发产品现客户演示,微信开发代码调试(微信接口必须使用80端口服务),每次都需要将产品发布到服务器上部署,耗时又费力。如果你的团队已经用上了基于Jenkins的持续集成和自动部署那你是幸运的,这样为你省掉很多的工作。但是大多数团队并用和去应用CI/CD发布应用程序。那如何能够让工程师使用本地电脑的开发环境来演示/调试基于微信平台的应用程序了?答案就是“内网穿透”。

2.网络环境分析

在局域网中NAT环境中,一般出口IP地址一般是1个或几个IP供内网上百台电脑使用,通过NAT地址转换共享有限的公网IP地址。网络外部的设备无法直接访问到内网的机器,需要从路由器或防火墙映射相应的地址或端口才可以访问。 其中阻碍服务访问的原因有以下几种:

  1. 采用ADSL拨号上网,没有固定的IP地址,需要配合DDNS动态更新域名对应IP,有DNS延时问题。
  2. 二级/三级电信运营商没有提供公网IP地址,路由器的WAN口地址仍为大内网的IP。
  3. 大公司网络管理严格,映射地址需要审批,如有变动变更麻烦。

3.解决方案:ngrok/frp网络穿透

可以通过在处于外网的服务器上搭建网络服务来建立通讯连接,并通过私有的网络通信隧道来进行通讯,达到穿透防火墙和路由器的效果。

4.ngrok简介

ngrok是一种反向代理程序,通过公共服务接入点与本地运行的Web服务建立安全的通道隧道。 ngrok捕获并分析隧道中的所有流量以供以后检查和重播。由于ngrok官方提供的服务在大陆已无法访问,需要通过开源的1.7版本的代码自己在有固定IP地址的服务器构建服务端,来为ngrok客户端提供接入点。 在使用ngrok之前,首先需要满足2个基本条件:

(1)有固定公网IP地址的服务器

(2)有可供使用的域名

5.ngrok域名和域名SSL/TLS证书

ngrok使用tls加密网络通信。客户端在启动的时候需要指定对应的域名和证书才可顺利启动。一般TLS/SSL证书由如下几种方式获取:

(1)公共CA申请域名证书,如赛门铁克、StartSSL、Let’s Encrypt

(2)使用自签名域名证书

(3)从私有的企业CA签发域名证书

我们这里采用自签名证书来创建TLS域名证书。

在创建申请之前,首先确定ngrok使用的域名,如“tun.wanglijie.cn”,通过域名泛解析*.tun.wanglijie.cn到ngrokd服务端,客户端成功连接之后就可以通过对于的子域名来访问http/https服务。 如客户端端定义的子域名为 weixin,建立连接后就可以通过 weixin.tun.wanglijie.cn访问的WEB服务。

6.安装和配置

ngrok使用go语言编写,所有首先需要安装编译环境

#CENTOS7 
yum install golang git
#Ubuntu
apt-get install build-essential golang mercurial git

从Github克隆源代码

git clone https://github.com/tutumcloud/ngrok.git ngrok

创建域名x.509证书

cd ngrok
mkdir certs && cd certs
#定义服务端域名
NGROK_DOMAIN="tun.example.com"
openssl genrsa -out base.key 2048
openssl req -new -x509 -nodes -key base.key -days 10000 -subj "/CN=$NGROK_DOMAIN" -out base.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 base.pem -CAkey base.key -CAcreateserial -days 10000 -out server.crt
 #将创建的证书服务到asset对于的目录下,程序在编译的时候会使用到
 cd ../
 cp -rf certs/base.pem assets/client/tls/ngrokroot.crt
 cp -rf certs/server.crt assets/client/tls/snakeoilca.crt
 cp -rf certs/server.crt assets/server/tls/snakeoil.crt
 cp -rf certs/server.key assets/server/tls/snakeoil.key
 
#编译环境是Linux 64Bit,默认不加任何参数编译的就是Linux amd64平台
make release-server release-client
#Mac x64平台客户端
GOOS=darwin GOARCH=amd64 make release-client
#Windows x64平台客户端
GOOS=windows GOARCH=amd64 make release-client
#Windows x32平台客户端
GOOS=windows GOARCH=386 make release-client
#Linux x32平台客户端
GOOS=linux GOARCH=386 make release-client

ngrok服务端配置

$ ip addr add 127.0.0.2/8 dev lo
$ /opt/ngrok/bin/ngrokd -log=/data/log/ngrok/ngrok.log -log-level=INFO -tlsKey=/opt/ngrok/certs/server.key -tlsCrt=/opt/ngrok/certs/server.crt -domain="tun.example.com" -httpAddr="127.0.0.2:80" -httpsAddr="127.0.0.2:443" -tunnelAddr=":4443"

server_addr: "tun.example.com:4443"
trust_host_root_certs: false
tunnels:
  nginx:
    proto: http
    addr: 80
    subdomain: public
  ssh:
    proto: tcp
    addr: 22
    hostname: jumpserver.tun.example.com
    remote_addr: 2222

启动客户端代理服务。

./bin/ngrok -subdomain pub -proto=http -log=n.log -config=ngrok.cfg 80

配置基于Nginx的反向代理,通过泛域名解析实现根据不同的子域名访问不同的Web服务。

#Nginx 配置文件
server {
    listen      10.9.1.4:80;
    server_name *.tun.example.com;
    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect  off;
        proxy_pass      http://127.0.0.2:80;
    }
}

参考引用:

转载请注明:知识库 » Ngrok内网穿透

喜欢 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址