一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 10140|回复: 8
收起左侧

一分钟实现内网穿透(ngrok服务器搭建)

[复制链接]
发表于 2018-2-20 17:01 | 显示全部楼层 |阅读模式
                     
版权声明:欢迎转载,请声明作者信息与原文链接 http://blog.csdn.net/zhangguo5/article/details/77848658
        
9 ]2 c9 p. ?  I, f1 W/ O
最近公司的花生壳到期了,要续费,发现价格一直在涨,都是5年以上的老用户,旗舰版都没有实现内网完全穿透,打算自己动手替换这个服务,中间走了不少的弯路,这里记录一些文字为大家提供参考。
虽然租用VPS、ECS等服务器可以解决很多问题但高性能的外网服务器价格非常贵还有数据安全问题,我选择的是公网服务器仅做代理与轻量应用,复杂的应用部署到内网服务器再穿透访问。
一、内网穿透概要
网络中唯一定位一台设备的逻辑地址,类似我们的电话号码
63651-20170903170722046-1051742415.png
IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。
//局域网可使用的网段(私网地址段)有三大段:10.0.0.0~10.255.255.255(A类)172.16.0.0~172.31.255.255(B类)192.168.0.0~192.168.255.255(C类)
( |" ^4 k$ J% \2 W3 z1.2、域名
63651-20170903220051733-158569545.png
www.zhangguo.com.cn就是一个域名,cn表示地区,com表示商业机构,zhangguo是公司名称,www是主机名
DNS查询过程如下,最终将域名变成IP地址
& |* k' i$ o2 }
NAT(Network Address Translation)即网络地址转换,NAT能将其本地地址转换成全球IP地址。
通过使用少量的公有IP 地址代表较多的私有IP 地址的方式,将有助于减缓可用的IP地址空间的枯竭。
多路由器可完成NAT功能。
静态转换是指将内部网络的私有IP地址转换为公有IP地址,IP地址对是一对一。
端口多路复用(Port address Translation,PAT),内部网络的所有主机均可共享一个合法外部IP地址实现对Internet的访问,从而可以最大限度地节约IP地址资源。同时又可隐藏网络内部的所有主机,有效避免来自internet的攻击。因此,目前网络中应用最多的就是端口多路复用方式。
63651-20170903180507983-878090856.png
Proxy即代理,被广泛应用于计算机领域,主要分为正向代理与反向代理:
1.4.1、正向代理
正向代理隐藏了真实的请求客户端。服务端不知道真实的客户端是谁,客户端请求的服务都被代理服务器代替来请求,某些科学上网工具扮演的就是典型的正向代理角色。用浏览器访问http://www.google.com时被墙了,于是你可以在国外搭建一台代理服务器,让代理帮我去请求google.com,代理把请求返回的相应结构再返回给我。
当多个客户端访问服务器时服务器不知道真正访问自己的客户端是那一台。正向代理中,proxy和client同属一个LAN,对server透明;
拨打10086客服电话,接线员可能有很多个,调度器会智能的分配一个接线员与你通话。这里的调度器就是一个代理,只不过他代理的是接线员,客户端不能确定真正与自己通话的人,隐藏与保护的是目标对象。
63651-20170903215407530-525466235.png
63651-20170903215437624-924164745.png
DDNS即动态域名解析,是将用户的动态IP地址映射到一个固定的域名解析服务上,用户每次连接网络的时候,客户端程序就会通过信息传递把该主机的动态IP地址传送给位于服务商主机上的服务器程序,服务程序负责提供DNS服务并实现动态域名解析。就是说DDNS捕获用户每次变化的IP地址,然后将其与域名相对应,这样域名就可以始终解析到非固定IP的服务器上,互联网用户通过本地的域名服务器获得网站域名的IP地址,从而可以访问网站的服务。
1.6、为什么需要内网穿透
在互联网中唯一定位一台主机的方法是通过公网的IP地址,但固定IP是一种非常稀缺的资源,不可能给每个公司都分配一个,且许多中小公司不愿意为高昂的费用买单,多数公司直接或间接的拨号上网,电信部门会给接入网络的用户分配IP地址,以前上网用户少的时候基本分配的都是临时的静态IP地址,租约过了之后可能会更换成另一个IP地址,这样外网访问就不稳定,因为内网的静态IP地址一直变化,为了解决这个问题可以使用动态域名解析的办法变换域名指向的静态IP地址。但是现在越来越多的上网用户使得临时分配的静态IP地址也不够用了,电信部门开始分配一些虚拟的静态IP地址,这些IP是公网不能直接访问的,如以125开头的一些IP地址,以前单纯的动态域名解析就不好用了。
1.7、内网穿透的定义与障碍
障碍一:位于局域网内的主机有两套 IP 地址,一套是局域网内的 IP 地址,通常是动态分配的,仅供局域网内的主机间通信使用;一套是经过网关转换后的外网 IP 地址,用于与外网程序进行通信。
障碍二:位于不同局域网内的两台主机,即使是知道了对方的 IP 地址和端口号,“一厢情愿”地将数据包发送过去,对方也是接收不到的。
63651-20170903222946327-630478233.png
花生壳既是内网穿透软件、内网映射软件,也是端口映射软件。规模最大,较正规,完善。
nat123是内网端口映射与动态域名解析软件,在内网启动映射后,可在外网访问连接内网网站等应用。整个网站我都没有找到客服电话,网友发了一些反面的评价
NATAPP基于ngrok的国内内网穿透服务,免费版会强制更换域名,临时用一下可以
frp 是一个高性能的反向代理应用,可以帮助您轻松地进行内网穿透,对外网提供服务,支持 tcp, http, https 等协议类型,并且 web 服务支持根据域名进行路由转发。
使用相对复杂,需要代理服务器支持
对于 http, https 服务支持基于域名的虚拟主机,支持自定义域名绑定,使多个域名可以共用一个80端口。
63651-20170903230243390-1884154202.png
还有如圣剑内网通、ngrok(开源免费)、更多办法
三、ngrok
开源免费
ngrok1.x开源,ngrok2.x不开源
国内免费服务器:http://ngrok.ciqiuwl.cn/,更多免费服务器请大家挖掘,资源共享,我随时更新:)
现在假定我的本地已成功部署了一个网站,访问地址为127.0.0.1,想内网穿透后被公网上的用户访问,一般步骤如下:
63651-20170904074155741-1985350688.png
63651-20170904074622538-2039616441.png
63651-20170904074833194-727903866.png
63651-20170904075020679-5581075.png
步骤4、如果开启成功 你就可以使用 xxx.ngrok.xiaomiqiu.cn 来访问你本机的 127.0.0.1:80 的服务了,当然你必须确定的是你本机的Web是可以正常访问的。
注意:
如果你只是临时穿透或调试用,到第三步基本就可以了,但如果想作为稳定的商业服务,用别人的服务器还是受制于人,这里我们准备搭建自己的ngrok服务器。大致的步骤如下:
ngrok服务器可以是多种平台,如windows、Linux(CentOS、Debian、Ubuntu等)、Mac OS等。
先决条件:
b)、您有一个域名,最好ICP备案成功,不然80端口没有办法使用,不过像微信开发是不使用80端口的,可以用nginx代理转换。
4.2、安装ubuntu操作系统
1)、全新安装ubuntu系统
3)、在虚拟机中安装ubuntu系统
63651-20170901231607218-263480294.png
4.2.1、安装VMware虚拟机
VMware Workstation 12 pro下载:VMware-workstation-full-12.1.0-3272444.exe
1)、双击VMware Workstation 12安装文件,或者右键管理员身份打开,提示是否允许更改,点击是;
  665662-20160901095230340-1199843460.png
  方法一、首次开启直接输入上文密钥,即可激活;# H8 [. p8 k- p$ W1 s' G
  方法二、首次开启选择试用,进入试用后按一下步骤激活:
   665662-20160901095741496-122939039.png
1)、下载ubuntu操作系统镜像
这里我下载的是ubuntu-16.04.3-desktop-amd64.iso
2)、在VMware中安装ubuntu
63651-20170904100150288-1332147180.png
63651-20170904101154476-1764294876.png
63651-20170904101320163-1606868137.png
63651-20170904101834679-1277234633.png
其它的步骤比较简单,更多细节可以参考这里,《VMware Ubuntu安装详细过程》
4.2.3、配置ubuntu系统
63651-20170904102149054-1857013152.png
a)、设置上网
63651-20170904102826538-1421210972.png
可以选择使用中文版的ubuntu语言环境
c)、设置屏幕分辨率
63651-20170904104430257-26581308.png
许多操作要求管理身份
e)、安装VMware Tools工具
63651-20170904105615835-1335450212.png
说明:ubuntu的使用不是本文的重点,相关操作请大家自行查找。
4.3、生成ngrok服务器与客户端应用程序4.3.1. 导出源代码
63651-20170904105847351-1780908089.png
启动ubuntu,开打命令行(终端),如下所示:
以root身份执行如下命令:
mkdir ngrok #创建名称为ngrok的目录apt-get update #更新包管理器apt-get install git  #安装gitgit clone https://github.com/inconshreveable/ngrok.git ngrok2 #将ngrok源代码克隆回本地4 s, B! e) J; [' F! _/ Y( ?
63651-20170904112044444-141101928.png
63651-20170904112706007-1362500678.png
直接在命令模式下执行如下指令:
apt-get install golang #安装go语言
& [5 A$ r/ H* b
63651-20170904112841616-675146273.png
4.3.3. 更改ngrok域名
63651-20170904113404319-181716920.png
默认的域名是ngrok自己的,要替换成您自己的域名
export GOPATH=/usr/local/ngrok/  #设置环境变量,Go语言的安装位置export NGROK_DOMAIN="ngrok.yourdomain.com"  #设置环境变量,ngrok域名1 A6 @" x; i7 l" Q' x& z( ^9 L$ S
openssl genrsa -out rootCA.key 2048openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.pemopenssl genrsa -out server.key 2048openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csropenssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 5000
- u" R- I: W9 i9 W: M9 J2 G) Y
63651-20170904121943022-153887904.png
63651-20170904122128351-799567752.png
4.3.5. 拷贝证书到指定位置cp rootCA.pem assets/client/tls/ngrokroot.crt  #复制rootCA.pem到assets/client/tls/并更名为ngrokroot.crtcp server.crt assets/server/tls/snakeoil.crt #复制server.crt到assets/server/tls/并更名为snakeoil.crtcp server.key assets/server/tls/snakeoil.key #复制server.key到assets/server/tls/并更名为snakeoil.key5 K" F  M4 ?$ {0 S" z* X
63651-20170904122421788-2012822383.png
4.3.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( [& @6 S/ ]7 r' {/ ]4 ]0 `; e/ u) b
因为项目中引用了一些外部资源,生成会耗费一些时间,对网络也有一定的要求,太慢会中短,命令执行下如:
生成结果:
这里我还生成了两个运行在windows服务器与客户端的应用:
ngrok.exe是客户端,ngrokd.exe是服务端,下面是比较连续的操作结果。
63651-20170901232916530-1378823649.png
五、部署服务器端主程序5.1、部署到Windows Server服务器
这里我将ngrokd.exe放在c:grokeServer目录下:
为了方便,我编写了一个批处理文件:ngrokserver2.bat
snakeoil.key" -tlsCrt="snakeoil.crt" -domain="ngrok.你的域名.com" -httpAddr=":801" -httpsAddr=":802"* O! L* P* g1 Q, D
63651-20170901232646890-104118921.png
为了安全许多服务器会将端口屏蔽,我使用的是ECS服务器,默认801,802都是关闭的,需要手动开启,在阿里云的后台添加开放的端口就可了:
如果编译生成ngrok的源代码生成应用太麻烦,你可以选择网友写的工具,支持一键部署到安装平台:CentOS、Debian、Ubuntu。
这里的客户端就是您的web应用程序所运行的主机,将ubuntu生成的ngrok.exe客户端应用复制到您的系统中:
server_addr: "ngrok.你的域名.com:4443"trust_host_root_certs: false" R# p6 w- f0 K4 _9 V
ngrok.exe -subdomain kyt -config=ngrok.cfg 89871 n' i4 U* [; d! ~% l. @' @
看到这个界面时说明已成功了。
七、启动客户端并测试
一开始选择错了平台,在windows花了不少时间,在ubuntu下顺利完成。
由于服务器上同时运行着IIS,故服务端Ngrok启动时无法使用80端口,所以在上面,我使用了801作为Ngrok服务器的http端口,使用IIS的代理功能可以解决这个问题,点击这里。当然也可以使用nginx将80转换成其它端口。
许多内容都参考了网友的文章。

* t: C! X! P; W  s. G$ m
63651-20170901233244765-547813455.png
63651-20170904124357101-756344082.png
63651-20170904123813882-909153274.png
63651-20170904122657647-1349116821.png
63651-20170901232038108-311206220.png
63651-20170901231940155-475363716.png
63651-20170904110813679-2025712360.png
63651-20170904104218679-1537052551.png
63651-20170904110228554-466046297.png
63651-20170904095831304-2034050308.png
63651-20170904091831007-845981599.png
63651-20170904075516819-714643885.png
63651-20170903231759108-1604638644.png
63651-20170903230700515-51395586.png
63651-20170903224544358-530495055.png
63651-20170903223553296-127372763.png
63651-20170903222716265-734414443.png
63651-20170903203855702-1545660519.png
63651-20170903203834015-540568079.png
63651-20170903180820046-1185506268.png
63651-20170903172617749-201355603.png
63651-20170903172918812-661389359.png
发表于 2018-2-20 19:44 | 显示全部楼层
以前用的免费的 ngrok 服务器,,,不是很稳定,自己搭建又要买VPS,,算了.
发表于 2018-2-20 21:05 | 显示全部楼层
看起来头晕,.我是用免费的K2刷无痕的系统,内置有这个服务,很简单的,只是想让外网访问家里的黑群.现在黑群也不行了
发表于 2018-2-20 21:42 | 显示全部楼层
只是端口映射的话
+ j/ @% V% L# {如果提供nat的是台linux机器,如果内网提供的服务不是很多很复杂,可以用iptables来设置端口映射,使得外网可以访问内部服务器
8 E8 W/ b' D- f7 K5 b. C1 `像: iptables -t nat -A PREROUTING -i eth0(外网卡界面) -p tcp --dport 80 -j DNAT --to-destination 192.168.1.24:80(内网服务器ip地址:端口号)
发表于 2018-2-22 14:03 | 显示全部楼层
看不懂
发表于 2018-2-22 15:56 | 显示全部楼层
ngrok怎么注册不了?
发表于 2018-2-23 11:18 | 显示全部楼层
太复杂了,看不懂
发表于 2018-2-23 14:42 | 显示全部楼层
优秀贴,顶起来。
发表于 2018-2-23 19:27 | 显示全部楼层
请教大家,这个还要不要设置路由器的?好像上面的教程上没有这方面的内容?! n0 i" ]5 U. g+ t$ O# o( m+ b6 K

% b1 a- p1 u4 g+ e下了个小米球 windows+32版的,连接失败了。

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-5-4 02:51 , Processed in 0.063887 second(s), 34 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表