新闻资讯

内网穿透是什么意思?如何内网穿透?

2024-07-21

网络现在已经成为人们生活和工作中不可或缺的一部分。然而,对于许多处于内网环境中的用户来说,如何让外网访问到内部网络的服务或设备,成为了一个亟待解决的问题。内网穿透技术应运而生,它为解决这一问题提供了有效途径。本文将深入探讨内网穿透的含义、原理、工作方式以及实现方法,帮助读者全面了解这一重要的网络技术。

内网穿透的定义
内网穿透,也被称为内网映射或 nat 穿透,指的是在一个内网环境下,能够将内部的服务、设备(如电脑、手机、物联网设备等)通过特定的中间设备及协议连接到公网上,从而使外网用户可以远程访问内部网络上的服务或设备,而不需要对内网的网络架构做任何改变。简单来说,就是让外网能访问你的内网,把自己的内网(主机)当成服务器,让外网能访问。

内网穿透的原理
为了理解内网穿透的原理,我们首先需要了解一下 nat(网络地址转换)技术。由于 ipv4 的公网地址数量有限,无法为每一台接入互联网的设备分配一个公网 ip,因此大量设备只能分配到私有 ip 地址。在一个公司或家庭内部,可以借助私有 ip 搭建内网用于相互通讯,而当内网中的设备需要访问外网网站时,就需要借助 nat 技术将私有 ip 转换为公有 ip。
nat 设备(或软件)维护一个状态表,它会把内部网络的私有 ip 地址映射到外部网络的合法 ip 地址上。每个包头中的 ip 地址和端口信息在 nat 设备(或软件)中都被修改并翻译成正确的 ip 地址发往下一级。当一个内网主机通过 nat 打开一个“外出”的 tcp 或 udp 会话时,napt(网络地址端口转换)会分配给这个会话一个公网 ip 和端口,用来接收外网的响应数据包,并经过转换通知内部网的主机。这样,napt 在(私有 ip:私有端口)和(公网 ip:公网端口)之间建立了一个端口绑定。
然而,nat 技术的一个问题是,它自动屏蔽了非内网主机主动发起的连接,也就是说,从外网发往内网的数据包将被 nat 设备丢弃,这使得位于不同 nat 设备之后的主机之间无法直接交换信息。这就需要内网穿透技术来解决这个问题。
内网穿透的实质是利用路由器上的 nat 系统,使具有特定源 ip 地址和源端口号的数据包不被 nat 设备屏蔽而正确路由到内网主机。

内网穿透的工作方式
通信双方一台位于 nat 之后,一台主机有公网 ip
假设 clienta 位于 nat 之后,拥有(ip 地址:端口)对(10.0.0.1:1234),clientb 位于 nat 之前,拥有(ip 地址:端口)对(138.76.29.7:1234),nat 拥有公网 ip 155.99.25.11。由于 clientb 有公网 ip,clienta 可以直接通过 tcp 连接到(138.76.29.7:1234)。然而,如果 clientb 向 clienta 发起主动连接,则不会成功。此时,需要一个公有的服务器辅助进行内网穿透。clienta 和 clientb 向服务器发起登陆请求,并保持一个 tcp 或 udp 连接,服务器记录其 ip 地址和端口号(服务器对 clienta 记录其经过 nat 映射之后的 ip 和端口号)。当 clientb 想连接 clienta 时,首先向服务器提出请求,服务器在收到请求后向 clienta 发出打洞命令,并将 clientb 的(ip 地址:端口)对发给 clienta,clienta 根据接收到的 ip 地址和端口号向 clientb 发起 tcp 连接或发送 udp 数据包。接下来 clienta 和 clientb 之间便可以建立数据传输通道。
通信双方主机均位于 nat 设备之后
这种情况下,服务器记录的(ip 地址:端口)对是 clienta 和 clientb 经过 nat 映射之后的 ip 地址和端口号。由于 clienta 和 clientb 之间任意方向的连接请求都会被对方的 nat 设备屏蔽,所以 clienta 首先向服务器提出连接请求,服务器将 clienta 的 ip 地址和端口号对(155.99.25.11:51200)发给 clientb,并向 clientb 发出打洞命令;clientb 收到服务器的打洞命令后首先向(155.99.25.11:51200)发送一定数目的 udp 探测包或 tcp 连接请求,在 natb 上打一个方向为(155.99.25.11:51200)的洞,clientb 随后向服务器报告打洞完成;服务器在收到 clientb 的报告后将 clientb 的公网 ip 地址和端口号对(110.10.33.10:5000)发给 clienta,此时由于 natb 上已经留下了对应于(155.99.25.11:51200)方向的洞,clienta 向(110.10.33.10:5000)发出的数据包或连接请求将不会被丢弃。

****内网穿透的实现方法
1、传统方法
传统的 nat 技术通过将专用的网络地址(如企业内部网)转换为公用地址(如互联网),从而对外隐藏了内部管理的 ip 地址。这样,通过在内部使用非注册的 ip 地址,并将它们转换为一小部分外部注册的 ip 地址,减少了 ip 地址注册的费用以及节省了目前越来越缺乏的地址空间。同时,这也隐藏了内部网络结构,降低了内部网络受到攻击的风险。
具体实现流程如下:
(1)两个需要通过内网穿透进行通讯的内网客户端,分别将自己的外网收发接口注册给一个具有公网 ip 的中转服务器。
(2)中转服务器将两个客户端注册的收发接口分别告知给对端。
(3)一个内网客户端使自己的接收端口作为源地址,向对端的发送端口发送一个 udp 数据包(称为打洞包)。发送过这个打洞包后,可以在这个内网的出口路由器上产生一条 nat 记录,令后续从对端发送端口发来的数据包都不被丢弃,而是转发给相应的内网客户端的指定端口。
(4)发送过打洞包后,对端发送至本端路由器指定接收端口的数据包,就会根据 nat 记录转发至本端的内网服务器接收端口,从而实现了内网服务器接收外网数据包的功能。
(5)另一个内网服务器同样执行上述步骤(3)、(4),即可实现两端内网服务器相互收发音频数据包的功能。

2、使用相关工具或服务
实现内网穿透,通常需要使用一些软件或服务,以下是几种常见的方式:
(1)使用反向代理工具:如 nginx、apache、haproxy 等,可以将外部请求转发到内网服务器。
(2)使用端口映射工具:例如 frp、ngrok、sunny-ngrok 等,这些工具可以将公网服务器上的端口映射到内网服务器上的指定端口。

以使用 ngrok 为例,简单介绍其一般步骤(不同工具的具体操作可能会有所差异):
(1)进入 ngrok 官网注册、登录。
(2)在隧道管理中选择免费或适合的服务。
(3)填写相关信息,如本地端口等。本地端口可以通过 win+r 弹出运行窗口,输入 cmd 回车打开命令行窗口,然后输入 ipconfig 命令列出所有网卡的 ip 地址,根据实际网络情况选择对应的 ip 地址和端口号。
(4)完成设置后可以看到域名等信息,下载对应的工具客户端。
(5)根据自己的操作系统选择相应版本的客户端进行下载和解压。
(6)回到开发环境中启动相关服务(如 tomcat 等)。
(7)启动内网穿透启动工具,并将隧道管理中的 id 复制到工具中,回车确定。
(8)启动成功后,即可通过生成的外网访问地址访问内网服务。

3、使用第三方内网穿透工具:例如花生壳。花生壳提供了简单易用的界面和配置方法,用户只需在本地安装客户端,并进行相应的设置,即可实现内网穿透。具体步骤包括注册账号、领取隧道、配置隧道信息(如内网地址、端口、域名等)、下载并启动客户端等。

内网穿透是一项强大而实用的技术,可以帮助我们打破网络限制,实现更便捷的远程访问和数据共享。但在使用过程中,务必重视上述注意事项,以确保安全、稳定、合法地运用这一技术,为我们的工作和生活带来更多便利。