NAT网络与内网穿透原理

news/2024/11/15 14:09:11/文章来源:https://www.cnblogs.com/littlecc/p/18299012
Markdown Example

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 地址。


Markdown Example

内网穿透

参考: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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/742589.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ThreadPoolExector

Java Thread Pool 使用线程池的好处:减少资源的浪费:创建、销毁、切换线程需要消耗系统资源,通过使用线程池可以降低消耗。 增加可管理度:通过线程池的同一管理,能够实现线程的更好的管理。 提高相应速度:当任务到来时,无需在创建线程,直接就能对任务进行反馈Java线程池…

Windows系统安装RustDesk Server的详细步骤和客户端设置

Windows 安装RustDesk ServerWindows系统安装RustDesk Server的详细步骤 在Windows系统上安装RustDesk Server涉及几个关键步骤,包括安装必要的依赖、下载RustDesk Server程序、配置并启动服务。以下是详细的步骤: 1. 安装Node.js和PM2 RustDesk Server的某些版本可能需要Nod…

Rocky Linux/Redhat8运行Calibre2022报错:Software tree is for environment VCO=aoj

运行出现了错误:virserver.tcl error: ERROR: Current execution environment is VCO=aok. Software tree is for environment VCO=aoj。 即calibre软件版本为aoj,但当前的环境是aok。 从官网查询calibre的roadmap:http://calibre.mentorcloudservices.com/docs/Calibre_OS_…

[深入理解Java虚拟机]高效并发

第12章 Java内存模型与线程 并发处理的广泛应用是Amdahl定律代替摩尔定律[1]成为计算机性能发展源动力的根本原因,也是人类压榨计算机运算能力的最有力武器。 [1] Amdahl定律通过系统中并行化与串行化的比重来描述多处理器系统能获得的运算加速能力,摩尔定律则用于描述处理器…

使用CDN,给你的网站加速!

使用 CDN,可以大大提高网站的访问速度,提升用户体验使用 CDN,可以大大提高网站的访问速度,提升用户体验 ‍ 在 CDN 出现之前 在介绍 CDN 之前,我想先介绍下没有 CDN 的场景。你搭建了一个网站,配置了域名,这样用户可以通过域名来访问你的网站 当用户多起来后,由于网络带…

PENR论文阅读笔记

Popularity-Enhanced News Recommendation with Multi-View Interest Representation 论文阅读笔记 Abstract 现存的问题: ​ 现有方法通常利用新闻标题、摘要、实体等信息来预测点击率(CTR),或在多任务学习框架中添加一些辅助任务。但是,它们都没有将预测的新闻流行度和用…

易优cms网站prenext 功能:获取当前文档上一篇、下一篇内容-Eyoucms

【基础用法】名称:prenext功能:获取当前文档上一篇、下一篇内容。语法:{eyou:prenext get=pre} <a href="{$field.arcurl}" title="{$field.title}"> 上一篇:{$field.title} </a>{eyou:else /} 上一篇:暂无{/eyou:prenext} {eyou:p…

网络的四层五层七层网络

Markdown Example.centered-text { text-align: center; font-size: 40px; font-family: "Times New Roman", Georgia, serif }聊聊网络协议参考:https://zhuanlan.zhihu.com/p/665914921 参考:https://blog.csdn.net/weixin_43988680/article/details/123754721 网…

易优cms网站videoplay功能:该标签仅限于视频模型的文档,用于在线播放视频选集列表里的第一个视频-Eyoucms

videoplay 视频在线播放 [基础用法]名称:videoplay功能:该标签仅限于视频模型的文档,用于在线播放视频选集列表里的第一个视频。 (温馨提示:如果一篇视频文档有多个选集视频,可以同时使用【videolist 视频选集列表】标签,进行视频切换播放。)语法:{eyou:videop…

易优cms网站php功能:执行php代码-Eyoucms

[基础用法]名称:php功能:执行php代码语法:{eyou:php}$a = CMS;echo $a;{/eyou:php} 参数:无底层字段:无本文来自博客园,作者:黄文Rex,转载请注明原文链接:https://www.cnblogs.com/hwrex/p/18298818

易优cms网站notice功能:统计站内通知未读消息条数-Eyoucms

[基础用法]名称:notice功能:统计站内通知未读消息条数语法:{eyou:notice id=field} <a href="{$field.url}">站内消息<span id="{$field.id}"></span></a> {$field.hidden}{/eyou:notice} 参数:id= 可以任意指定循环里的…

学习菜老板知识星球2-Day

今天我们来学习一下 作用域Scope 与 被绑定量Binding 作用域 Scope @Babel解析出来的语法树节点对象会包含作用域信息,这个信息会作为节点Node对象的一个属性保存 这个属性本身是一个Scope对象,其定义位于node_modules/@babel/traverse/lib/scope/index.js中 执行 Scope.dump…