NAT网络与内网穿透原理
NAT 网络地址转换
#NAT 网络地址转换原理:
网络地址转换 (NAT) 是一种在数据包通过路由设备传输时,通过修改数据包 IP 报头中的网络地址信息
将一个 IP 地址空间重新映射为另一个 IP 地址空间的技术。
该技术最初用作快捷方式,以避免在移动网络时需要重新寻址每个主机。
在 IPv4 地址耗尽的情况下,它已成为保护全局地址空间的流行且必不可少的工具。
NAT 的工作原理是将来自内部网络的私有 IP 地址转换为公共 IP 地址,以便它们可以访问 Internet。
这对于具有大量设备但只有有限数量公共 IP 地址的网络非常有用。
#NAT 有三种主要类型:
静态 NAT: 静态 NAT 将一个内部 IP 地址永久映射到一个公共 IP 地址。 这通常用于为 Web 服务器或其他需要固定公共 IP 地址的设备。
动态 NAT: 动态 NAT 将内部 IP 地址临时映射到公共 IP 地址池中的地址。 这通常用于家用路由器,它们需要为连接到网络的不同设备提供 Internet 访问。
端口地址转换 (PAT): PAT 使用单个公共 IP 地址和多个端口号来为多个内部 IP 地址提供 Internet 访问。 这是一种更有效的 NAT 类型,因为它允许更多设备共享更少的公共 IP 地址。
#NAT 的工作原理
NAT 是通过修改数据包 IP 报头中的源和目标 IP 地址来实现的。
当来自内部网络的数据包到达 NAT 路由器时,NAT 路由器会将数据包的源 IP 地址替换为公共 IP 地址。 然后,路由器将数据包转发到 Internet。
当来自 Internet 的数据包到达 NAT 路由器时,NAT 路由器会将数据包的目标 IP 地址替换为内部 IP 地址。 然后,路由器将数据包转发到内部网络上的正确设备。
#NAT 的优点
NAT 有许多优点,包括:
节省公共 IP 地址: NAT 允许使用有限数量的公共 IP 地址为大量设备提供 Internet 访问。
提高安全性: NAT 可以帮助隐藏内部网络的 IP 地址,使其更难受到攻击。
简化网络管理: NAT 可以简化网络管理,因为它允许为内部网络使用私有 IP 地址。
#NAT 的缺点
NAT 有一些缺点,包括:
降低性能: NAT 可能会降低性能,因为它需要在每个数据包上执行额外的处理。
复杂性: NAT 可能会增加网络的复杂性,因为它需要配置和管理。
兼容性问题: NAT 可能会导致一些兼容性问题,因为它会修改数据包的 IP 地址。
内网穿透
参考:https://blog.csdn.net/lemon_TT/article/details/128846476
概述什么是内网穿透
使用了NAT上网的话,前提得内网机器主动请求公网 IP,这样NAT才能将内网的 IP 端口转成外网 IP 端口。
反过来公网的机器想主动请求内网机器,就会被拦在 NAT 路由器上,此时由于 NAT 路由器并没有任何相关的 IP 端口的映射记录,因此也就不会转发数据给内网里的任何一台机器。
举个现实中的场景就是,你在你家里的电脑上启动了一个 HTTP 服务,地址是192.168.30.5:5000,
此时你在公司办公室里想通过手机去访问一下,却发现访问不了。那问题就来了,有没有办法让外网机器访问到内网的服务?
有。大家应该听过一句话叫,“没有什么是加中间层不能解决的,如果有,那就再加一层”。放在这里,依然适用。
说到底,因为 NAT 的存在,我们只能从内网主动发起连接,否则 NAT 设备不会记录相应的映射关系,没有映射关系也就不能转发数据。
所以我们就在公网上加一台服务器 x,并暴露一个访问域名,再让内网的服务主动连接服务器 x,这样NAT路由器上就有对应的映射关系。
接着,所有人都去访问服务器x,服务器x将数据转发给内网机器,再原路返回响应,这样数据就都通了。这就是所谓的内网穿透。
像上面提到的服务器x,你也不需要自己去搭,已经有很多现成的方案,花钱就完事了,比如花某壳。
#说白了就是内网先和代理服务器之间建立通讯隧道、让nat路由器记录一个映射的关系、这样当从外网取访问内网的时候路由器就会跟踪记录的映射关系来找到内网设备或网站
#所以内网穿透还是要依赖于相关的工具或是一个在公网的服务器地址、让两者直接建立持久的通道
为什么我在公司里访问不了家里的电脑?
那是因为家里的电脑在局域网内,局域网和广域网之间有个 NAT 路由器。
由于 NAT 路由器的存在,外网服务无法主动连通局域网内的电脑。
两个内网的QQ或微信是如何建立通讯聊天的?
如我家机子是在我们小区的局域网里,班花家的机子也是在她们小区的局域网里。
都在局域网里,且 NAT 只能从内网连到外网,那我电脑上登录的QQ是怎么和班花电脑里的QQ连上的呢?
上面这个问法其实是存在个误解,误以为两个 qq 客户端应用是直接建立连接的。然而实际上并不是,两个 qq 客户端之间还隔了一个服务器
也就是说,两个在内网的客户端登录 qq 时都会主动向公网的聊天服务器建立连接,这时两方的 NAT 路由器中都会记录有相应的映射关系。
当在其中一个 qq 上发送消息时,数据会先到服务器,再通过服务器转发到另外一个客户端上。
反过来也一样,通过这个方式让两台内网的机子进行数据传输。
#如图:
两个内网的QQ连接的过程
两个内网的应用如何直接建立连接
两端通信,比如 P2P 下载,这种该怎么办呢?这种情况下,其实也还是离不开第三方服务器的帮助。
假设还是 A 和 B 两个局域网内的机子,A内网对应的NAT设备叫NAT_A,B内网里的NAT设备叫NAT_B,和一个第三方服务器server。
流程如下。
step1和2: A 主动去连 server,此时 A 对应的NAT_A就会留下 A 的内网地址和外网地址的映射关系,server 也拿到了 A 对应的外网 IP 地址和端口。
step3和4: B 的操作和 A 一样,主动连第三方 server,NAT_B内留下 B 的内网地址和外网地址的映射关系,然后 server 也拿到了 B 对应的外网 IP 地址和端口。
step5和step6以及step7: 重点来了。此时 server 发消息给 A,让 A 主动发UDP消息到 B 的外网 IP 地址和端口。此时 NAT_B 收到这个 A 的UDP数据包时,这时候根据 NAT_B 的设置不同,导致这时候有可能 NAT_B 能直接转发数据到 B,那此时 A 和 B 就通了。但也有可能不通,直接丢包,不过丢包没关系,这个操作的目的是给 NAT_A 上留下有关 B 的映射关系。
step8和step9以及step10: 跟step5一样熟悉的配方,此时 server 再发消息给 B,让 B 主动发UDP消息到 A 的外网 IP 地址和端口。NAT_B 上也留下了关于 A 的映射关系,这时候由于之前 NAT_A 上有过关于 B 的映射关系,此时 NAT_A 就能正常接受 B 的数据包,并将其转发给 A。到这里 A 和 B 就能正常进行数据通信了。这就是所谓的 NAT 打洞。
step11: 注意,之前我们都是用的 UDP 数据包,目的只是为了在两个局域网的 NAT 上打个洞出来,实际上大部分应用用的都是 TCP 连接,所以,这时候我们还需要在 A 主动向 B 发起 TCP 连接。到此,我们就完成了两端之间的通信。
#结合一下图:
总结
总结
IPV4 地址有限,但通过 NAT 路由器,可以使得整个内网 N 多台机器,对外只使用一个公网 IP,大大节省了 IP 资源
内网机子主动连接公网 IP,中间的 NAT 会将内网机子的内网 IP 转换为公网 IP,从而实现内网和外网的数据交互
普通的 NAT 技术,只会修改网络包中的发送端和接收端 IP 地址,当内网设备较多时,将有可能导致冲突。
因此一般都会使用 NAPT 技术,同时修改发送端和接收端的 IP 地址和端口
由于 NAT 的存在,公网 IP 是无法访问内网服务的,但通过内网穿透技术,就可以让公网 IP 访问内网服务。
一波操作下来,就可以在公司的网络里访问家里的电脑。
- 内网穿透说白了就是使用一个拥有公网ip的服务器当作代理、内网设备通过NAT路由先主动访问代理服务器、建立隧道(nat路由记录内网ip:端口)、
- 当我们从公网去访问内网时、访问的是这个代理的服务器的ip、代理服务器就会将我们的流量通过已建立的隧道找到nat路由的映射地址转发给内网
内网穿透工具
ngrok官网
frp:git项目
Sunny-Ngrok官网
Natapp官网
Earthworm
reDuh-git项目
reGeorg-git项目
Tunna-git项目
sSocks-官网
参考:https://github.com/SexyBeast233/SecBooks/blob/main/%E3%80%90%E5%86%85%E7%BD%91%E7%B3%BB%E5%88%97%E3%80%91intranet/%E6%9C%80%E5%A5%BD%E7%94%A8%E7%9A%84%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F%E5%B7%A5%E5%85%B7%E5%90%88%E9%9B%86.md