Linux网络(二十八):从NAT转换到正反向代理:图解内网通信、NAPT端口映射


◆ 博主名称: 小此方-CSDN博客 大家好,欢迎来到小此方的博客。
⭐️网络系列个人专栏: 【主题曲】计算机网络
⭐️此方的GitHub: github_此方
⭐️ 我们思考 (Rethink) · 我们重建 (Rebuild) · 我们记录 (Record)


文章目录


概要&序論

  Hello大家好,我是此方。上一篇我们讲完了所有的网络通信原理,本文将为大家带来四个子话题的讨论,分别是------内网穿透,内网打洞,NAT技术和代理服务技术。

一、NAT技术:网络世界的真相与NAPT端口转换

1.1 为什么回家就上不了公司内网?

  大家一定有过这样的体验:一般在企业里面,一旦回家了,就没法上公司的网络了!这是为什么?

  回顾之前的知识,我们发送报文时,比如 src: 192.168.1.201 发往 dst: 122.77.241.3。经过家用路由器,源IP被替换为WAN口IP(10.1.1.2);再经过运营商路由器,源IP再次被替换为公网WAN口IP(122.77.241.4)。

  一旦我们的报文到达公网,就不会再做替换了,至此子网划分、路由表形成。但由于公司内网使用的是私有IP(如192.168.x.x),公网上的设备根本找不到这个私有IP的路由,自然就访问不了公司的内网了。

1.2 为什么聊天软件要先登录QQ?

  所以你就明白了:我的电脑和你的电脑在聊天的时候,为什么要先登录QQ,或者通过微信服务器转发?

  因为两台电脑都在各自的内网(私有IP)里,无法直接通过公网路由通信。它们必须各自先向公网上的服务器(如腾讯的服务器)建立连接。服务器记录下双方的公网IP和端口,然后再由服务器进行转发。

1.3 NAT技术的本质:不仅仅是IP替换

  NAT就是这个网络世界的真相。 但NAT的过程,不仅仅是源IP(内网IP)的替换,端口号也可以进行替换!!

  这里就引出了NAPT(网络地址端口转换)的核心问题:如果局域网内,有多个主机都访问同一个外网服务器,那么对于服务器返回的数据中,目的IP都是相同的,那么NAT路由器如何判定将这个数据包转发给哪个局域网的主机?

  为了解决这个问题,使用IP+port来建立这个关联关系。私有IP虽然可以重复,但是,内网中是唯一的!!私有IP+自己的port = 内网中唯一的一个进程!

1.4 NAPT转换表与公网唯一性

  我们来看 NAPT 的转换表。左侧是私有IP地址的世界,右侧是全局IP地址的世界。

  客户端A(10.0.0.10:1025)和客户端B(10.0.0.11:1025)同时向目的地址(163.221.120.9:80)发送请求。如果不做端口替换,路由器无法区分返回的报文给谁。

  此时,NAT路由器将:

  1. 10.0.0.10:1025 映射为 202.244.174.37:1025
  2. 10.0.0.11:1025 映射为 202.244.174.37:1026(端口号不冲突不替换,端口号冲突则替换)

  出去时,做转换替换源IP和源端口。返回时,反向查表找到对应映射的目标主机,将 dst 从 202.244.174.37:1025 改回 10.0.0.10:1025。

  因为公网IP具有唯一性,端口号路由器内也是唯一的,路由器IP+端口号本身也是唯一键值(对外)! 所以从外向内唯一,从内向外唯一,因此从内向外和从外向内都可以查询。

1.5 家用路由器与企业级路由器的区别

  为什么路由器分为家用路由器和企业级路由器?前者几十几百块,后者几万几十万。除了硬件性能,不同的路由器支持的NAPT的总量不同。家用路由器能维持的并发连接数有限,而企业级路由器拥有庞大的内存和算力,能维持海量的端口映射转换表,支撑成百上千的终端设备同时上网。

二、正反向代理技术:内网访问与外网请求的入口

  在理解了NAT技术是如何让内网设备共享公网IP访问外部世界后,我们再来聊聊数据包在应用层的"中转站"------代理服务技术。代理分为正向代理和反向代理,它们所处的位置和解决的问题截然不同。

2.1 正向代理:代表客户端向内网或外网请求

  正向代理服务器位于客户端和互联网之间,它代表的是客户端。

  如图所示,多个 client 位于内网中,它们无法直接访问互联网上的 www.qq.com。此时,客户端将请求发给正向代理服务器,由正向代理服务器代替客户端去访问互联网,拿到结果后再返回给客户端。对于目标服务器而言,它以为请求是来自代理服务器,并不知道真实的客户端是谁。正向代理常被用于内网穿透、科学上网或企业内网访问管控。

2.2 反向代理:代表服务器接收外部请求

  反向代理服务器位于互联网和内部服务器集群之间,它代表的是服务器端。

  当外部用户输入域名(如 www.XXX.com),DNS解析返回的IP地址实际上是反向代理服务器的IP。所有的请求都会先到达反向代理服务器。

  这种机器比较靠近企业端,所以叫做反向代理服务器。一般是一台Linux搭载一台Nginx服务器(后面讲分布式架构的时候和大家聊聊),这种机器往往只是负责转发,压力不大。真正压力大的是后端的服务器集群里面的web服务器。

2.3 负载均衡与避免请求集中

  反向代理的核心作用之一是避免请求太集中 ,实现负载均衡 。

  当用户访问的时候,我们的web服务器会去内容集群中二次获取。然后返回。这里涉及的服务集群,比如给你各种超文本资源。除了服务集群还有内容集群、算力集群等等。

  在一个机房内部可以做负载均衡,在机房之间也可以做负载均衡! 如何做呢?比如我们公司的机房在北京一个,在深圳一个,在上海杭州各自一个。然后我们有一个IP清单,表示不同的机房的代理服务器的IP地址。我们的这个网站的域名在解析的时候会随机或者是按顺序解析出不同发IP,向不同的IP发起请求!这就是DNS层面的负载均衡。

2.4 动静分离与CDN网络

  关于CDN,比如一个普通的小公司,他们根据动静分离的原则,把各种网页和图片的静态资源放在自己的反向代理服务器上。如果访问静态资源的的用户太多了,你的这个服务器就会压力特别大!

  于是就会出现一种人叫做CDN分发商。他们有各类自己的云服务器。给这些公司提供CDN服务。

  什么是CDN服务?就是你的服务器把静态资源放在CDN分发商的云服务器上,比如说留下一个主页在自己那里,然后用户访问你的服务器主页就是你自己提供服务,如果访问你的其他资源,连接就自动转到这个CDN服务的云服务器上!

  常见的CDN服务比如图床就是一个!

2.5举个正反向代理技术的例子

严正声明

   本文所探讨的代理服务技术、NAT穿透及相关网络协议原理,仅限于**计算机网络底层技术的学习与学术交流**。文中提及或涉及的概念,旨在从纯技术角度剖析网络数据包的转发与路由机制,绝不代表对任何违规行为的鼓励、支持或指导。网络空间不是法外之地。**请读者严格遵守《中华人民共和国网络安全法》及相关法律法规**,不得利用本文所涉及的技术原理从事任何危害网络安全、破坏网络秩序或违反国家相关规定的活动。任何因不当使用本文技术内容而产生的法律风险与后果,均由使用者本人独立承担,本文作者及发布平台概不负责。
我想要不要举一个例子呢?想来想去觉得这确实是最好的用来解释代理技术的例子。我觉得值得一讲。能够帮大家更好的理解
我不讲哈,大家自己看板书。

2.5.1这种模式到底属于正向代理还是反向代理?

  很多人看完上述流程后会给出答案:这当然是反向代理!

  错,实际上这依然属于正向代理 。

  判断一个代理技术是正向代理还是反向代理,有一个非常便捷的区分方式:画个图,然后看看公网(目标服务器)是在代理服务器的左边还是右边 。

  在正向代理中,代理服务器是代表客户端 去访问公网资源的,客户端明确知道自己要通过代理去获取公网上的任意资源,代理服务器充当的是客户端的"转发站";而在反向代理中,代理服务器是代表服务端 遮蔽真实服务器细节的,客户端以为自己访问的就是终点服务器。

  因此,在这种技术场景下,代理服务器是站在客户端这一侧协助其向外探寻公网资源的,本质上是标准的正向代理模型。


好的本期内容就到这里,如果对你有帮助,还不要忘记点赞三联支持。我是此方,我们下期再见。bye!

相关推荐
刚入门的大一新生1 小时前
Linux-进程池
linux·运维·服务器
数据库小学妹1 小时前
数据库运维五级成熟度:监控、备份、高可用怎么串起来
运维·数据库·监控
AliCloudROS2 小时前
从 1 万到 20 万:OOS Loop 任务规模提升 20 倍的攻坚记录
运维·性能优化
隐擎fox2 小时前
深入 Android 移动端风控与协议层对抗:内核级虚拟环境检测、网络堆栈特征伪装与住宅 IP 协同实战
android·网络·python·网络协议·tcp/ip
鱼很腾apoc2 小时前
【MySQL】第4期 用户管理与 C 语言连接编程详解
linux·服务器·c语言·mysql·connector/c
千桐科技2 小时前
qModel算法模型平台功能解析:从源码到 Docker 镜像,部署能自动完成哪些工作?
运维·docker·容器·qmodel
Da Da 泓2 小时前
[项目] --- 基于websocket的网页五子棋(可多用户)
网络·websocket·网络协议·多线程·项目
lazy H2 小时前
【计算机网络】第 2 篇:一条数据如何穿过网络?彻底理解数据封装与解封装
网络·经验分享·后端·学习·计算机网络
刚入门的大一新生2 小时前
Linux-进程间通信1
linux·运维·服务器