内网穿透的实现和原理解析

article/2025/11/11 2:28:57

 

需求场景:

       基于微信平台开发服务号,本地移动端测试时,需要在微信平台注册测试号,然后填写接口配置信息,此信息需要你有自己的服务器资源,填写的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元体验版内网穿透

官网:http://www.oray.com/

 

 

 

踩坑 : 外网可正常访问,但域名配置微信平台url失败

2.nat123

nat123是内网端口映射与动态域名解析软件,在内网启动映射后,可在外网访问连接内网网站等应用。

收费,使用简单,需支付宝充值300T币,即30元

官网:http://www.nat123.com

全端口映射时,需要配置端口

踩坑 : 外网可正常访问,域名配置微信平台url成功,但免费的泛域问题严重,付费的没有短期的

3.NATAPP

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

收费,使用简单,有免费隧道,一级vip9元一个月

官网:https://natapp.cn/

 

需要配置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成功,但会强制更换域名

4.ngrok

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

开源,  收费,使用简单,有免费隧道,一级vip10元一个月

官网:https://ngrok.com/

源码: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


http://chatgpt.dhexx.cn/article/sOi4X4HB.shtml

相关文章

MacBook M1 Idea集成SVN

1.检查是否安装SVN svn —version2.检查是否安装了brew brew -v3.安装 brew /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)” speed4.记住安装路径 5.配置国内镜像源HOMEBREW BOTTLE 6.svn安装前需要执行 按照/usr/local路径…

IntelliJ IDEA上svn分支管理和使用

IntelliJ IDEA上svn分支管理和使用 从Subversion下载trunk下的代码 选择项目创建分支 右键 Subversion --> branch or Tag … 选择Repository Location:需要创建的项目 选择Any Location 分支的位置和名字 详细查看截图 切换到分支 选择项目右键Subversion --> Update …

vscode / idea 使用SVN及查看历史记录

一、vscode使用 SVN 1、在vscode插件中心搜索svn 进行安装(我这里已经安装完毕了) 注意:插件安装成功,需要重新启动软件。 安装成功后会出现如下的图标: 2、桌面右键使用SVN Checkout… 来检出远程库的代码&#xf…

IDEA之配置SVN

最近在公司的开发项目过程中,发现有关idea2020的svn配置方法都参差不齐,所以整理了有关idea2020整合svn的步骤; 目录 一、SVN配置1.1 下载SVN1.2 安装SVN1.3 配置SVN 二、常见问题2.1 Warning:java: 源值1.5已过时 一、SVN配置 1.1 下载SVN…

IDEA使用svn拉取多模块项目

如果没有安装过svn客户端,安装的时候需要选择安装第二个工具,如下图所示 安装小乌龟, 自行搜索, 注意点是需要选择安装第二个工具 因为默认是不安装的, 而这个组件是集成到IDEA ”必须的” . 如果是已经安装好的, 但是没有选这个的也是有办法的 办法一: 更改小乌龟 在卸载小乌龟…

idea 使用svn出现path to certificate

百度了一会,有说清缓存的,不能使用。 还有配置这个的,也不行。 我记得以前可以,后来发现你拉去代码不用在idea拉,能提交。只要你不选最外层项目。可能是我打开了两个idea,都用的这个链接,只是文…

IDEA SVN 代码合并

IDEA SVN 代码合并 一:安装Subversion 插件 打开settings 设置,搜索svn,点击install,安装成功后重启 二:导入svn项目 打开idea,左下角点击 Subversion, 选择第四个选项卡或者从 View -> Tool Windows -> Sub…

IDEA上使用svn插件

安装后会在安装目录下出现svn.exe字样有用!!! 如果没有svn.exe 原因: 产生这个问题的原因是由于我们在安装svn时,默认缺少一项导致的,我们只需要再重新安装一下即可(不需要卸载) 双击安装文件后,选择Modify 2.勾选command line client tool…

Idea使用SVN常用操作

贴一个有弧度的代码 目录 Idea中配置 检出代码 subversion有许多选项 拉取(更新)/提交代码 ​ Show Diff对比代码, 提交代码注释项必填 查看历史提交 设置文件忽略 拉出新分支 将分支合并到主干 删除分支 更换SVN账号信息 svn结构: 一般习惯性在创建repository仓…

macOS系统升级后idea使用svn报错

昨天升级了 macOS Monterey 更新完后IntelliJ IDEA无法正常使用SVN 报Cannot run program “svn” (in directory “/XXXX/XXXX/XXXX/XXX”): error2!,NO such file or directory 看了一下网上的解决方案 1.command line client中的参数,在代码的svn…

idea使用svn提交代码失败,报错E230001: Server SSL certificate verification failed: certificate issued

IDEA踩坑记一 问题描述 使用SVN提交代码失败,报错E230001: Server SSL certificate verification failed: certificate issued。 在网上搜索了一下,全是下面这样的回答: 实际上这个 ls 是查看目录内容的命令,执行之后会展示目录…

IDEA使用svn进行代码分支合并

svn基础这里就做说明了,只简单说明一下IDEA下svn分支合并的操作 首先打开IDEA下的svn操作界面如图 按步骤点击后会出下如下界面,第一次进入没有配置分支路径是没有红框里面的选项的 那么就点击configure branches进行配置,如图 首次肯定是没有我这里配置的这些东西的按照步骤…

IDEA使用svn提交、检出代码详细步骤

原文地址传送门 ,感谢分享! 1、Idea集成svn 2、查看svn仓库 调出svn视图: 连接svn服务器: 连接后效果如下: 3、忽略上传文件 由于不同的用户使用的环境不同,因此有些文件不用上传到svn服务器,比如有的用…

idea使用svn下载项目并配置项目

idea使用svn下载项目并进行配置,首先安装svn,并在idea中配置svn,安装过程此处省略(注意要勾选command line工具),idea中的配置如下: idea中,设置-版本控制---subversion,这里一定要指定command…

Idea项目配置使用SVN

首先下载svn https://osdn.net/projects/tortoisesvn/storage/1.14.5/Application/TortoiseSVN-1.14.5.29465-x64-svn-1.14.2.msi/ 再下载一个中文包(看个人习惯,不影响使用) https://osdn.net/projects/tortoisesvn/storage/1.14.5/Language…

IDEA如何使用SVN插件

IDEA如何使用SVN插件 下载TortoiseSVN 官网下载最新版 安装时 看图片 如已安装看看有没有svn.exe文件,有就跳过安装没有继续 安装后会在安装目录下出现svn.exe字样有用!!! 然后打开IDEA ,file - setting 按钮打开…

Idea 使用svn创建新分支

1, 使用工具:idea编辑器,svn版本控制工具 2, 打开idea 编辑器,按照下图选择 3, 从主干上拉一个新分支,放在branch目录下 选择trunk 右键选择 branch or Tag...选项 3,设置分支的名…

Idea使用svn时commit特别慢的问题及解决方法

加油,新时代打工人! 英文含义: • Perform code analysis:指的是提交前代码分析 • Check TODO(Show ALL):如果代码有//TODO 注释,IDEA提交是会提示你是否有完成TODO里的内容。 默认这两项是选中…

idea使用svn拉取源码,创建分支,合并分支教程

svn拉取源码,创建分支,合并分支教程 最近对svn的分支使用比较感兴趣了,花时间研究了一下,分享给大家: 此文章记录了idea使用svn的过程:包括拉取源码、建立分支、切换分支、合并分支等常用操作。 此文章&…

Idea使用SVN下载运行项目

1.下载TortoiseSVN(小乌龟),安装时务必勾选上command line client tools,这样idea才能找到svn.exe 2.安装好之后idea配置svn,最好把Enable interactive mode 这个选项勾选上,这样在检出项目时不会报连接错误&#xff0…