admin 管理员组

文章数量: 887007

内网穿透在实际生活中,我们经常会在内网里部署服务让外网访问内网应用,比如Apache,Tomcat,数据库,微信小程序的开发以及企业的一些管理软件(OA、CRM、ERP),还有远程桌面等等的外网都是无法直接访问内网的。

有些方式可以通过设置路由器虚拟服务器开放一些端口供外网访问,但由于运营商的原因,这些IP有时候并不是直接的IP,更多的时候这些IP都是动态的,简单说就是今天给你的IP是15.63.87.251,明天随时都有可能变为变得IP,并且是不能访问80个443端口的,那么有没有一种办法可以实现在没有公网IP的情况下,又不用设置路由器就可以让外网直接访问内网里的应用呢,今天要讲的就是这个:

首先普及一下基本的概念,可能有些拗口,不过没关系,这个看不懂也不要紧,可以直接跳过这一段:

什么是内网穿透、为什么要内网穿透,内网、公网和NAT是什么意思? 
公网、内网是两种Internet的接入方式。

 内网接入方式:上网的计算机得到的IP地址是Inetnet上的保留地址,保留地址有如下3种形式:    
 10.x.x.x 
 172.16.x.x至172.31.x.x 
 192.168.x.x 
  内网的计算机以NAT(网络地址转换)协议,通过一个公共的网关访问Internet。内网的计算机可向Internet上的其他计算机发送连接请求,但Internet上其他的计算机无法向内网的计算机发送连接请求。 

  公网接入方式:上网的计算机得到的IP地址是Inetnet上的非保留地址。公网的计算机和Internet上的其他计算机可随意互相问。 
    NAT(Network Address Translator)是网络地址转换,它实现内网的IP地址与公网的地址之间的相互转换,将大量的内网IP地址转换为一个或少量的公网IP地址,减少对公网IP地址的占用。NAT的最典型应用是:在一个局域网内,只需要一台计算机连接上Internet,就可以利用NAT共享Internet连接,使局域网内其他计算机也可以上网。使用NAT协议,局域网内的计算机可以访问Internet上的计算机,但Internet上的计算机无法访问局域网内的计算机。
    Windows操作系统的Internet连接共享、sygate、winroute、unix/linux的natd等软件,都是使用NAT协议来共享Internet连接。 所有ISP(Internet服务提供商)提供的内网Internet接入方式,几乎都是基于 NAT协议的。
 

什么是固定IP、动态IP地址、什么是域名?
固定IP地址是长期分配给一台计算机或网络设备使用的IP地址。一般来说,采用专线上网的计算机才拥有固定的IP地址。

什么是动态IP地址 ?

通过Modem、ISDN、ADSL、有线宽频、小区宽频等方式上网的计算机,每次上网所分配到的IP地址都不相同,这就是动态IP地址。因为IP地址资源很宝贵,大部分用户都是通过动态IP地址上网的。普通人一般不需要去了解动态IP地址,这些都是计算机系统自动完成的。

当然在很多情况下你可能并没有公网IP,不要问我为什么,本人曾经做过2年的售后工程师,给几百家客户安装实施部署过软件,有3分之一的企业虽然有路由器,但运营商分给的IP却是内网的,奇怪吧,比如10、172或者100开头的都是运营商的内网IP。

这里简单说一下怎么查看是否是内网IP:
1.如果你使用的是Window平台,点击自己电脑窗口的“开始”“运行”输入“cmd”,在DOS命令窗口输入“ipconfig /all”,得到的IP如果和上面一样,说明你拥有自己的外网IP
2.如果你使用的是unix/linux平台,运行 ifconfig -a 得到的IP如果和上面一样,说明你拥有自己的外网IP。

现在开始正式进入正题:

接下来我就演示2个应用,一个是设置远程桌面,设置让外网可以通过3389远程控制局域网内的电脑,另一个就是访问内网里Tomcat的应用,端口是8080,使用的工具是神卓互联,快速实现内网穿透。
首先可以去神卓互联官网下载一个客户端。(地址自己百度吧),这个一般是针对企业级应用的,比如管家婆,OA系统等等,对于我们这些平民可以使用社区版,这个真的是免费的。
 

下载好之后点安装就可以。

安装的过程很顺利,直接点下一步就可以了。

 

安装完成后我们就可以打开登录了,(这个登录框背景是半透明的,不要找不到/捂脸)

简单注册一个账号,然后选择社区版,直接确定登录就可以了。

 

接下来就可以开始正式使用了。

接下来就是添加映射了,首先是3389远程访问的映射

点击主面板左下角的添加映射按钮

应用名称可以随便填,这里可以填远程桌面,服务器IP可以是局域网内任意IP,这里填写127.0.0.1就可以了,端口号肯定是填3389了,点击其二添加就好了。主面板就会返回一个固定的公网地址和端口号,当然这个地址可以把后面的端口号去掉,也可以绑定域名,这里就不多说了,不是重点。

接下来就可以通过外网访问了,打开下面这个远程桌面连接,

然后就可以直接连接了。

接下来就是穿透8080端口了,

只需要把端口号改为8080,当然可以是任意的端口号和tomcat保存一致就可以了。

太晚了,明天再写。

本人最近在写博客,就是为了实现这个功能,用Java语言编写,感兴趣的话可以关注下我;

除了神卓以外还有别的内网穿透工具

2.1、花生壳

花生壳既是内网穿透软件、内网映射软件,也是端口映射软件。规模最大,较正规,完善。

收费高,使用简单

2.2、Nat123

nat123是内网端口映射与动态域名解析软件,在内网启动映射后,可在外网访问连接内网网站等应用。整个网站我都没有找到客服电话,网友发了一些反面的评价

收费,使用也不简单

2.3、NATAPP

NATAPP基于ngrok的国内内网穿透服务,免费版会强制更换域名,临时用一下可以

收费,没听说有人用过,不评论

2.4、frp与其它

frp 是一个高性能的反向代理应用,可以帮助您轻松地进行内网穿透,对外网提供服务,支持 tcp, http, https 等协议类型,并且 web 服务支持根据域名进行路由转发。

开源免费,但是完全不会用,不适合企业级使用。

使用相对复杂,需要代理服务器支持

利用处于内网或防火墙后的机器,对外网环境提供 http 或 https 服务。

对于 http, https 服务支持基于域名的虚拟主机,支持自定义域名绑定,使多个域名可以共用一个80端口。

利用处于内网或防火墙后的机器,对外网环境提供 tcp 和 udp 服务,例如在家里通过 ssh 访问处于公司内网环境内的主机。

ngrok是一个反向代理,通过在公共的端点和本地运行的Web服务器之间建立一个安全的通道。ngrok可捕获和分析所有通道上的流量,便于后期分析与响应。

开源免费,只能用命令行,没有用户界面

 

ngrok1.x开源,ngrok2.x不开源

ngrok使用go语言开发,源代码分为客户端与服务器端。

国内免费服务器:http://ngrok.ciqiuwl/,更多免费服务器请大家挖掘,资源共享,我随时更新:)

如果有服务器,仅客户端的使用是不复杂的,以上面的免费服务器为示例完成内网穿透

现在假定我的本地已成功部署了一个网站,访问地址为127.0.0.1,想内网穿透后被公网上的用户访问,一般步骤如下:

步骤1、下载windows版本的客户端,解压。一般在为你提供代理服务器的网站上找你要下载的客户端:

步骤2、在命令(cmd)行下进入到ngrok客户端目录下

步骤3、执行 ngrok -config=ngrok.cfg -subdomain xxx 80 //(xxx 是你自定义的域名前缀),建议批处理

如果连接成功,会提示如下信息:

这一步如果你认为太麻烦,可以直接运行目录下的start.bat批处理文件就不用进DOS环境了。运行start.bat直接跳过2,3步

步骤4、如果开启成功 你就可以使用 xxx.ngrok.xiaomiqiu 来访问你本机的 127.0.0.1:80 的服务了,当然你必须确定的是你本机的Web是可以正常访问的。

如果你自己有顶级域名,想通过自己的域名来访问本机的项目,那么先将自己的顶级域名解析到120.25.161.137(域名需要已备案哦,80端口必须备案),然后执行 ngrok -config=ngrok.cfg -hostname xxx.xxx.xxx 80 //(xxx.xxx.xxx是你自定义的顶级域名)

ubuntu下生成ngrok服务器主程序

4.1、步骤与先决条件

如果你只是临时穿透或调试用,到第三步基本就可以了,但如果想作为稳定的商业服务,用别人的服务器还是受制于人,这里我们准备搭建自己的ngrok服务器。大致的步骤如下:

ngrok服务器可以是多种平台,如windows、Linux(CentOS、Debian、Ubuntu等)、Mac OS等。

编译源代码生成应用强烈建议大家使用linux环境,windows肯定可以成功,但非常麻烦,我在windows操作系统上兜了一个大圈圈。

先决条件:

a)、您有一台公网上的服务器,如阿里云的ECS

b)、您有一个域名,最好ICP备案成功,不然80端口没有办法使用,不过像微信开发是不使用80端口的,可以用nginx代理转换。

4.2、安装ubuntu操作系统

在linux环境下编译ngrok的源代码比windows下 方便很多,这里我们选择使用ubuntu,获得ubuntu的方法有如下几种:

1)、全新安装ubuntu系统

2)、申请VPS服务器, 阿里云、腾讯云、华为云、百度云、新浪云等,仅编译一下这种方法不错

3)、在虚拟机中安装ubuntu系统

综合考虑我选择了在虚拟机中安装ubuntu操作系统

4.2.1、安装VMware虚拟机

VMware Workstation是一款功能强大的虚拟机软件,在不影响本机操作系统的情况下,用户可以在虚拟机中同时运行不同版本的操作系统,用于开发、测试以及部署工作。

VMware Workstation 12 pro下载:VMware-workstation-full-12.1.0-3272444.exe

序列号:5A02H-AU243-TZJ49-GTC7K-3C61N(商业应用请购买正式版权,这里仅为学习使用)

1)、双击VMware Workstation 12安装文件,或者右键管理员身份打开,提示是否允许更改,点击是;

2)、打开VMware安装向导,点击下一步;

 

3)、VMware Workstation 12激活步骤:

  方法一、首次开启直接输入上文密钥,即可激活;
  方法二、首次开启选择试用,进入试用后按一下步骤激活:

  a、打开虚拟机主界面,点击“帮助”—“输入许可证密钥”;

  

  b、在密钥输入框输入永久许可证密钥5A02H-AU243-TZJ49-GTC7K-3C61N,确定;更多

4.2.2、安装ubuntu到虚拟机

1)、下载ubuntu操作系统镜像

下载地址:https://www.ubuntu/download/desktop

这里我下载的是ubuntu-16.04.3-desktop-amd64.iso

2)、在VMware中安装ubuntu

打开VMware点击“创建新的虚拟机”

向导选择自定义

然后下一步再下一步,直到这里,稍后再安装系统

后面设置处理器和内存的,电脑配置好的可以试试,否则采用默认的,博主这里是采用默认的,然后下一,直到这里,选择将虚拟机存储为单个磁盘:

个人建议至少20G硬盘空间,内存建议给1.5G,当然也要看电脑本身的配置,1G的内存跑起来比较卡。

其它的步骤比较简单,更多细节可以参考这里,《VMware Ubuntu安装详细过程》。

4.2.3、配置ubuntu系统

当ubuntu系统安装成功后,在虚拟机中可以启动ubuntu系统,启动后的系统如下:

ubuntu系统的使用还是有许多内容的,这里需要设置的内容如下:

a)、设置上网

就是在ubuntu中可以访问外网,可以使用多种形式

b)、设置语言

可以选择使用中文版的ubuntu语言环境

c)、设置屏幕分辨率

如果不设置默认的屏幕比较小

d)、设置以root超级管理员的身份登录

许多操作要求管理身份

e)、安装VMware Tools工具

只有在VMware虚拟机中安装好了VMware Tools,才能实现主机与虚拟机之间的文件共享,同时可支持自由拖拽的功能,鼠标也可在虚拟机与主机之间自由移动(不用再按ctrl+alt),且虚拟机屏幕也可实现全屏化。
VMware Tools是VMware虚拟机中自带的一种增强工具,相当于VirtualBox中的增强功能(Sun VirtualBox Guest Additions),是VMware提供的增强虚拟显卡和硬盘性能、以及同步虚拟机与主机时钟的驱动程序。

 

注意如果这里是灰色的需要您将linux.iso镜像加载到虚拟光驱中,一般在VM的安装目录下有,如果没有您需要自行下载。

说明:ubuntu的使用不是本文的重点,相关操作请大家自行查找。

4.3、生成ngrok服务器与客户端应用程序

4.3.1. 导出源代码

ngrok的源代码托管在github上,可以先在ubuntu下安装git再将ngrok的源代码克隆到本地。

其实也可以直接下载到本地后解压,这里使用命令行完成。

启动ubuntu,开打命令行(终端),如下所示:

以root身份执行如下命令:

 
  1. mkdir ngrok #创建名称为ngrok的目录

  2.  
  3. apt-get update #更新包管理器

  4.  
  5. apt-get install git #安装git

  6.  
  7. git clone https://github/inconshreveable/ngrok.git ngrok2 #将ngrok源代码克隆回本地

成功执行后如下所示:

导出成功后的源代码:

PS. 直接在服务器上下载的话实在太慢,可以先在本地下载好,然后用ftp放到服务器上去直接用,如果安装了VMware tools直接拖进去就可以了。

4.3.2. 安装Go语言开发环境

直接在命令模式下执行如下指令:

apt-get install golang #安装go语言

执行结果如下:

4.3.3. 更改ngrok域名

在自己的域名管理中添加解析A记录,如下所示:

将*.ngrok与ngrok都指向您的主机IP。

默认的域名是ngrok自己的,要替换成您自己的域名

 
  1. export GOPATH=/usr/local/ngrok/ #设置环境变量,Go语言的安装位置

  2. export NGROK_DOMAIN="ngrok.yourdomain" #设置环境变量,ngrok域名

PS. ngrok名称可以任意,推荐名称为ngrok或者tunnel 

4.3.4. 为域名生成证书

 
  1. openssl genrsa -out rootCA.key 2048

  2. openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.pem

  3. openssl genrsa -out server.key 2048

  4. openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csr

  5. openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 5000

生成后的结果如下:

证书如下:

4.3.5. 拷贝证书到指定位置

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

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

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

运行结果:

4.3.6. 编译

 由于go语言的特性,在编译时直接生成机器码,所以在运行过程中并不需要go的环境(非托管应用)。在ngrok目录下,运行一下命令分别生成对应的客户端与服务端。

 
  1. #win服务端

  2. GOOS=windows GOARCH=386 make release-server

  3. #win客户端

  4. GOOS=windows GOARCH=386 make release-client

  5. #linux服务端

  6. GOOS=linux GOARCH=386 make release-server

  7. #linux客户端

  8. GOOS=linux GOARCH=386 make release-client

生成完成后,在工作目录的bin文件夹下,产生对应的文件。以编译windows平台为例,会产生“ngrok.exe”与“ngrokd.exe”这两个文件,前者客户端,后者需要运行在公网服务器上。

因为项目中引用了一些外部资源,生成会耗费一些时间,对网络也有一定的要求,太慢会中短,命令执行下如:

生成结果:

这里我还生成了两个运行在windows服务器与客户端的应用:

ngrok.exe是客户端,ngrokd.exe是服务端,下面是比较连续的操作结果。

 

五、部署服务器端主程序

5.1、部署到Windows Server服务器

 将生成的ngrokd.exe文件复制到windows服务器中,当然如果要部署到linux中也是没有问题的。

这里我将ngrokd.exe放在c:\grokeServer目录下:

为了方便,我编写了一个批处理文件:ngrokserver2.bat

ngrokd.exe -tlsKey="snakeoil.key" -tlsCrt="snakeoil.crt" -domain="ngrok.你的域名" -httpAddr=":801" -httpsAddr=":802"

点击批处理运行结果如下:

绑定的域名换成自己的域名,http使用801端口,https使用802端口,供客户端连接的管道端口设置为4443端口,必须前面的域名相同。

为了安全许多服务器会将端口屏蔽,我使用的是ECS服务器,默认801,802都是关闭的,需要手动开启,在阿里云的后台添加开放的端口就可了:

5.2、一键部署ngrok服务器(CentOS、Debian、Ubuntu)

如果编译生成ngrok的源代码生成应用太麻烦,你可以选择网友写的工具,支持一键部署到安装平台:CentOS、Debian、Ubuntu。

https://github/clangcn/ngrok-one-key-install

六、部署ngrok客户端

这里的客户端就是您的web应用程序所运行的主机,将ubuntu生成的ngrok.exe客户端应用复制到您的系统中:

添加配置文件ngrok.cfg:

 
  1. server_addr: "ngrok.你的域名:4443"

  2. trust_host_root_certs: false

 添加批处理start.bat,如果只运行一次直接在命令行下输入命令也是一样的效果,内容如下:

ngrok.exe -subdomain kyt -config=ngrok.cfg 8987

其中8987为端口号,运行成功的结果如下所示: 

看到这个界面时说明已成功了。

七、启动客户端并测试

打开浏览器,输入您映射后的域名就可以穿透内网访问您的web服务器了。

八、总结

一开始选择错了平台,在windows花了不少时间,在ubuntu下顺利完成。

无论是客户端还是服务器端最好都做成服务,更方便与稳定。

由于服务器上同时运行着IIS,故服务端Ngrok启动时无法使用80端口,所以在上面,我使用了801作为Ngrok服务器的http端口,使用IIS的代理功能可以解决这个问题,点击这里。当然也可以使用nginx将80转换成其它端口。

许多内容都参考了网友的文章。

如果服务器搭建好了,只运行客户端穿透内网一分钟够了:)。

欢迎您提供更加好的解决方案,欢迎您提供更多的免费代理服务器,我随时更新,谢谢!

部分内容转自http://wwwblogs/best/p/7465444.html

 

 

 

 

本文标签: 路由器 内网 巧妙 快速