需求场景:
基于微信平台开发服务号,本地移动端测试时,需要在微信平台注册测试号,然后填写接口配置信息,此信息需要你有自己的服务器资源,填写的URL需要正确响应微信发送的Token验证。如何能让外网访问到本地服务器呢,就需要用到内网穿透技术(NAT)。
注意:微信平台只支持80端口和443端口
内网穿透的目的:简单来说就是让外网能访问你本地的应用
几个概念:
1.OSI网络七层协议以及每层的作用
1、物理层:该层包括物理连网媒介,如电缆连线连接器,物理层的协议产生并检测电压以便能够发送和接受携带数据的信号。如中继器、集线器、网线、HUB。
这一层的数据叫做比特。
2、数据链路层:控制网络层和物理层之间的通信,主要功能是如何在不可靠的物理线路上进行数据的可靠传递。如:网卡、网桥、交换机。
这一层是和包结构和字段打交道的和事佬。一方面接收来自网络层(第三层)的数据帧并为物理层封装这些帧;另一方面数据链路层把来自物理层的原始数据比特封装到网络层的帧中。起着重要的中介作用。
3、网络层:主要功能是将网络地址翻译成对应的无聊地址,并决定如何将数据从发送方路由到接收方。
如路由器、防火墙、多层交换机。
网络层确定把数据包传送到其目的地的路径。就是把逻辑网络地址转换为物理地址。如果数据包太大不能通过路径中的一条链路送到目的地,那么网络层的任务就是把这些包分成较小的包。
4、传输层:最重要的层,传输协议同时进行流量控制或者是基于对方可接受数据的快慢程度规定适当的发送速率。包括全双工半双工、流控制、错误恢复服务。同时按照网络能处理的最大尺寸将较长的数据包进行强行分割。进程和端口,TCP UDP协议
5、会话层:负责在网络中的两点之间建立和维护通信。如建立回话、断点续传
在分开的计算机上的两种应用程序之间建立一种虚拟链接,这种虚拟链接称为会话(session)。会话层通过在数据流中设置检查点而保持应用程序之间的同步。允许应用程序进行通信的名称识别和安全性的工作就由会话层完成。
6、表示层:应该程序和网络之间的翻译官,管理数据的加密和解密。如编码方式,图像编解码、交换机
定义由应用程序用来交换数据的格式。在这种意义上,表示层也称为转换器(translator)。该层负责协议转换、数据编码和数据压缩。转发程序在该层进行服务操作。
7、应用层:负责对软件提供接口使能网络服务。如应用程序,如FTP、SMTP、HTTP
2.IP地址
网络中唯一定位一台设备的逻辑地址,类似我们的电话号码。
在互联网中我们访问一个网站或使用一个网络服务最终都需要通过IP定位到每一台主机,如访问baidu网站:
其中220.181.112.244就是一个公网的IP地址,他最终指向了一台服务器。
IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。
内网IP可以同时出现在多个不同的局域网络中,如A公司的U1用户获得了192.168.0.5,B公司的U3用户也可以获得192.168.0.5;但公网IP是唯一的,因为我们只有一个Internet。
3.域名
域名是IP的别名,便于记忆,域名最终通过DNS解析成IP地址。
P V4是一个32位的数字,IP V6有128位,要记住一串毫无意义的数字非常困难,域名解决了这个问题。
DNS查询过程如下,最终将域名变成IP地址
4.NAT
NAT(Network Address Translation)即网络地址转换,NAT能将其本地地址转换成全球IP地址。
内网的一些主机本来已经分配到了本地IP地址(如局域网DHCP分配的IP),但现在又想和因特网上的主机通信(并不需要加密)时,可使用NAT方法。
通过使用少量的公有IP 地址代表较多的私有IP 地址的方式,将有助于减缓可用的IP地址空间的枯竭。
NAT不仅能解决了lP地址不足与共享上网的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。
多路由器可完成NAT功能。
NAT的实现方式:
静态转换是指将内部网络的私有IP地址转换为公有IP地址,IP地址对是一对一。
动态转换是指将内部网络的私有IP地址转换为公用IP地址时,IP地址是不确定的,是随机的。
端口多路复用(Port address Translation,PAT),内部网络的所有主机均可共享一个合法外部IP地址实现对Internet的访问,从而可以最大限度地节约IP地址资源。同时又可隐藏网络内部的所有主机,有效避免来自internet的攻击。因此,目前网络中应用最多的就是端口多路复用方式。
应用程序级网关技术(Application Level Gateway)ALG:传统的NAT技术只对IP层和传输层头部进行转换处理,ALG它能对这些应用程序在通信时所包含的地址信息也进行相应的NAT转换
5. Proxy
Proxy即代理,被广泛应用于计算机领域,主要分为正向代理与反向代理:
正向代理
比如X花店代A,B,C,D,E五位男生向Candy女生送匿名的生日鲜花,这里的X花店就是5位顾客的代理,花店代理的是客户,隐藏的是客户。这就是我们常说的代理。
正向代理隐藏了真实的请求客户端。服务端不知道真实的客户端是谁,客户端请求的服务都被代理服务器代替来请求,某些科学上网工具扮演的就是典型的正向代理角色。用浏览器访问http://www.google.com时被墙了,于是你可以在国外搭建一台代理服务器,让代理帮我去请求google.com,代理把请求返回的相应结构再返回给我。
当多个客户端访问服务器时服务器不知道真正访问自己的客户端是那一台。正向代理中,proxy和client同属一个LAN,对server透明;
反向代理
拨打10086客服电话,接线员可能有很多个,调度器会智能的分配一个接线员与你通话。这里的调度器就是一个代理,只不过他代理的是接线员,客户端不能确定真正与自己通话的人,隐藏与保护的是目标对象。
反向代理隐藏了真实的服务端,当我们请求 ww.baidu.com 的时候,就像拨打10086一样,背后可能有成千上万台服务器为我们服务,但具体是哪一台,你不知道,也不需要知道,你只需要知道反向代理服务器是谁就好了,ww.baidu.com 就是我们的反向代理服务器,反向代理服务器会帮我们把请求转发到真实的服务器那里去。Nginx就是性能非常好的反向代理服务器,用来做负载均衡。
反向代理中,proxy和server同属一个LAN,对client透明。
6. DDNS
DDNS即动态域名解析,是将用户的动态IP地址映射到一个固定的域名解析服务上,用户每次连接网络的时候,客户端程序就会通过信息传递把该主机的动态IP地址传送给位于服务商主机上的服务器程序,服务程序负责提供DNS服务并实现动态域名解析。就是说DDNS捕获用户每次变化的IP地址,然后将其与域名相对应,这样域名就可以始终解析到非固定IP的服务器上,互联网用户通过本地的域名服务器获得网站域名的IP地址,从而可以访问网站的服务。
7. 为什么需要内网穿透
当内网中的主机没有静态IP地址要被外网稳定访问时可以使用内网穿透
在互联网中唯一定位一台主机的方法是通过公网的IP地址,但固定IP是一种非常稀缺的资源,不可能给每个公司都分配一个,且许多中小公司不愿意为高昂的费用买单,多数公司直接或间接的拨号上网,电信部门会给接入网络的用户分配IP地址,以前上网用户少的时候基本分配的都是临时的静态IP地址,租约过了之后可能会更换成另一个IP地址,这样外网访问就不稳定,因为内网的静态IP地址一直变化,为了解决这个问题可以使用动态域名解析的办法变换域名指向的静态IP地址。但是现在越来越多的上网用户使得临时分配的静态IP地址也不够用了,电信部门开始分配一些虚拟的静态IP地址,这些IP是公网不能直接访问的,如以125开头的一些IP地址,以前单纯的动态域名解析就不好用了。
8. 内网穿透的定义与障碍
简单来说实现不同局域网内的主机之间通过互联网进行通信的技术叫内网穿透。
障碍一:位于局域网内的主机有两套 IP 地址,一套是局域网内的 IP 地址,通常是动态分配的,仅供局域网内的主机间通信使用;一套是经过网关转换后的外网 IP 地址,用于与外网程序进行通信。
障碍二:位于不同局域网内的两台主机,即使是知道了对方的 IP 地址和端口号,“一厢情愿”地将数据包发送过去,对方也是接收不到的。
因为出于安全起见,除非是主机主动向对方发出了连接请求(这时会在该主机的数据结构中留下一条记录),否则,当主机接收到数据包时,如果在其数据结构中查询不到对应的记录,那些不请自来的数据包将会被丢弃。
解决办法:要想解决以上两大障碍,我们需要借助一台具有公网 IP 的服务器进行桥接。
内网穿透的产品和工具
1.花生壳
花生壳既是内网穿透软件、内网映射软件,也是端口映射软件。规模最大,较正规,完善。
付费,限制端口,限制流量。
注册送免费域名,6元体验版内网穿透
踩坑 : 外网可正常访问,但域名配置微信平台url失败
2.nat123
nat123是内网端口映射与动态域名解析软件,在内网启动映射后,可在外网访问连接内网网站等应用。
收费,使用简单,需支付宝充值300T币,即30元
全端口映射时,需要配置端口
踩坑 : 外网可正常访问,域名配置微信平台url成功,但免费的泛域问题严重,付费的没有短期的
3.NATAPP
NATAPP基于ngrok的国内内网穿透服务,免费版会强制更换域名,临时用一下可以
收费,使用简单,有免费隧道,一级vip9元一个月
需要配置config.ini 主要authtoken
#将本文件放置于natapp同级目录 程序将读取 [default] 段
#在命令行参数模式如 natapp -authtoken=xxx 等相同参数将会覆盖掉此配置
#命令行参数 -config= 可以指定任意config.ini文件
[default]
authtoken= #对应一条隧道的authtoken
clienttoken= #对应客户端的clienttoken,将会忽略authtoken,若无请留空,
log=none #log 日志文件,可指定本地文件, none=不做记录,stdout=直接屏幕输出 ,默认为none
loglevel=ERROR #日志等级 DEBUG, INFO, WARNING, ERROR 默认为 DEBUG
http_proxy= #代理设置 如 http://10.123.10.10:3128 非代理上网用户请务必留空
踩坑 : 外网可正常访问,域名配置微信平台url成功,但会强制更换域名
ngrok是一个反向代理,通过在公共的端点和本地运行的Web服务器之间建立一个安全的通道。ngrok可捕获和分析所有通道上的流量,便于后期分析与响应。
开源, 收费,使用简单,有免费隧道,一级vip10元一个月
源码:https://github.com/inconshreveable/ngrok
无需配置,输入隧道id即可
踩坑 : 外网可正常访问,域名配置微信平台url可成功,但有泛域现象,隧道不稳定,有时连不上
其他:
3322动态域名
提供了一个XXX.3322.org随机动态域名。
dnspod
1.不提供域名
2.免费域名解析。不需要转入域名即可使用。URL隐性转发不支持。
3.动态域名解析。提供API实现。
总结 :
1. 有免费的可用 Ngrok 和NatApp
2. 微信平台开发踩坑,花生壳用不了;nat123泛域严重,vip比较贵 ;NatApp域名会强制变更,不稳定;Ngrok 有泛域问题,隧道不稳定。
3.如果微信平台开发,先试ngrok,再看NatApp,最后nat123
微信本地测试内网穿透案例ngrok可看上篇(用Sunny_ngrok免费地址映射工具解决微信公众平台开发本地测试问题)
https://blog.csdn.net/xinpz/article/details/80760326
感谢博客资源:https://blog.csdn.net/Mind_programmonkey/article/details/8028559