🌈欢迎来到Linux专栏 ~~ 网络编程
- 🌍博客主页:张小姐的猫~江湖背景
- 🔥所属专栏:Linux ~ 不破不立
- 作者水平很有限,如果发现错误,可在评论区指正,感谢🙏
网络编程
- 🌈欢迎来到Linux专栏 ~~ 网络编程
- 👀NAT 技术背景
- ♻️NAT ~ IP转换过程
- 🌟NAPT
- ❌️NAT技术的缺陷
- 💥通信过程
- 🆚内网传统 vs 内网打洞
- 🐭内网打洞
- 🐾内网穿透
- 🗿代理服务器
- 1️⃣正向代理
- 2️⃣反向代理
- 💥代理服务器和NAT
- 🤔
- 📢写在最后
👀NAT 技术背景
之前我们讨论了,IPv4协议中,IP地址数量不充足的问题NAT技术当前解决IP地址不够用的主要手段,是路由器的⼀个重要功能
NAT能够将私有IP对外通信时转为全局IP。也就是就是⼀种将私有IP和全局IP相互转化的技术方法- 很多学校,家庭,公司内部采用每个终端设置私有IP,而在路由器或必要的服务器上设置全局IP
- 全局
IP要求唯⼀,但是私有IP不需要;在不同的局域网中出现相同的私有IP是完全不影响的
♻️NAT ~ IP转换过程
私有IP内部,转换的工作都会存在,一旦进入了公网则不需要源IP地址替换了
报文每经过一个路由器,路由器就会自动把报文的SRC,换成自己的WAN口IP
- 其实1️⃣源IP、源端口也可能会被替换!
IP地址在内网和公网其实都是唯一的!如何理解?
- 2️⃣是只在一个内网里是唯一的,但是可能会和其他的内网中的IP地址会出现冲突
🌟NAPT
那么问题来了,如果局域网内,有多个主机都访问同⼀个外网服务器,那么对于服务器返回的数据中,目的IP都是相同的。那么NAT路由器如何判定将这个数据包转发给局域网的哪个主机?
这时候NAPT来解决这个问题了。使⽤IP + port来建立这个关联关系
如果三台电脑都要访问 Internet —— 如果只做简单NAT:
192.168.1.10→203.0.113.10192.168.1.11→203.0.113.10192.168.1.12→203.0.113.10外网服务器返回数据时就会产生问题:
- 都是发给
203.0.113.10,到底该转发给哪台内网主机?于是NAPT使用端口号来区分不同连接。
实际上就把<源地址 + 端口号,路由器的WAN口 + 新端口号>
192.168.1.10:50000→203.0.113.10:10001192.168.1.11:50000→203.0.113.10:10002这样即使转换后的src地址一样,但同样可以根据端口号的不同来区分转发到不同的主机!
最终路由器会有一张转化表:
内网 外网------------------------------------------------192.168.1.10:50000←→203.0.113.10:10001192.168.1.11:50000←→203.0.113.10:10002192.168.1.12:60000←→203.0.113.10:10003这种关联关系也是由
NAT路由器自动维护的。例如在TCP的情况下,建立连接时,就会生成这个表项;在断开连接后,就会删除这个表项
那么两个内网主机(有NAT隔离)可以直接通信吗?❌️因为在对应的路由器上还没有对应的转换条目(没有NAT表)!
【NAT】 A ─── Internet ─── NAT ─── B A 主动访问 B ↓ NAT 没有映射 ↓ 不知道交给哪个内网主机 ↓ 不能直接通信如果目标网络被NAT隔离,且没有NAT映射,那么外部无法主动找到具体的内网主机
服务器不能直接给主机直接发送数据,因为进入到路由器,根本找不到映射 —— 不知道要转发给哪个主机!
❌️NAT技术的缺陷
由于NAT依赖这个转换表,所以有诸多限制:
- 无法从
NAT外部向内部服务器建立连接 - 转换表的生成和销毁都需要额外开销
- 通信过程中⼀旦
NAT设备异常,即使存在热备,所有的TCP连接也都会断开
💥通信过程
内网 A 访问公网 B
A NAT 路由器 B192.168.1.10:50000公网IP:1.1.1.18.8.8.8:443│ │ │ └──────────────────────────→│───────────────────────→│A 发出的数据:
源:192.168.1.10:50000目的:8.8.8.8:443过程:先路由判断,再做 SNAT
① 数据包进入路由器 ↓ ② 查路由表 目的:8.8.8.8→ 应该从 WAN 口出去 ↓ ③ 确定出口接口 ↓ ④ 做 SNAT —— 建立好映射192.168.1.10:50000↓1.1.1.1:30000↓ ⑤ 从 WAN 口发出所以对于内网访问公网,可以简单记:
先路由,确定出口;再 SNAT,修改源地址
返回数据时,B返回
源:8.8.8.8:443目的:1.1.1.1:30000进入NAT路由器:
① 收到数据包 ↓ ② 查 NAT/连接跟踪表1.1.1.1:30000↓ 对应:192.168.1.10:50000↓ ③ 做 DNAT 修改目的地址:1.1.1.1:30000↓192.168.1.10:50000↓ ④ 查路由表 发现192.168.1.0/24从 LAN 口出去 ↓ ⑤ 发给 A先根据 NAT 状态还原目的地址,再根据新的目的地址查路由
DNAT 通常影响后续的路由选择;SNAT 通常依赖前面的路由选择结果
🆚内网传统 vs 内网打洞
🐭内网打洞
内网打洞 = 两个内网主机先主动向外发消息,让NAT记录映射,然后再利用这个映射互相通信
以后两个路由器进行通信就不再需要经过路由器了,把数据转发到对方的出口路由器就行 —— 因为出去和服务器进行通信时就已经产生了NAT表了,说明是可以映射回来的
云服务器收到的客户端
IP本质是:运营商出口路由器的WAN口IP
🐾内网穿透
公司和云服务器使用了frpc:把本地的22号端口映射到frps的8888端口,也就是将来发送给8888的请求都会转发到22号端口 ——frps干的
- 那么我们居家办公访问
8888号端口 = 访问22号端口了
内网穿透和内网打洞的区别:
核心原理:都是利用路由器形成的NAT转化表,把我们的内网服务暴露出去的特征
内网穿透:必须强依赖于一款服务器(服务器一直要进行工作),让用户访问8888的端口等同于访问内网主机
内网打洞:借鉴云服务器做出入口路由器地址的交换,从而摒弃云服务器
内网穿透是一直在用,内网打洞则是用一会!
🗿代理服务器
1️⃣正向代理
正向代理(ForwardProxy)是⼀种常见的网络代理方式,它位于客户端和目标服务器之间,代表客户端向目标服务器发送请求。正向代理服务器接收客户端的请求,然后将请求转发给目标服务器,最后将目标服务器的响应返回给客户端。通过这种方式,正向代理可以实现多种功能,如提高访问速度、隐藏客户端身份、实施访问控制等
工作原理
- 客户端将请求发送给正向代理服务器
- 正向代理服务器接收请求,并根据配置进行处理,如缓存查找、内容过滤等
- 正向代理服务器将处理后的请求转发给目标服务器
- 目标服务器处理请求,并将响应返回给正向代理服务器
- 正向代理服务器将响应返回给客户端
Nginx
2️⃣反向代理
反向代理服务器是⼀种网络架构模式,其作为Web服务器的前置服务器,接收来自客户端的请求,并将这些请求转发给后端服务器,然后将后端服务器的响应返回给客户端。这种架构模式可以提升网站性能、安全性和可维护性等
基本原理:
反向代理服务器位于客⼾端和Web服务器之间,当客户端发起请求时,它首先会到达反向代理服务器。反向代理服务器会根据配置的规则将请求转发给后端的Web服务器,并将Web服务器的响应返回给客户端。在这个过程中,客户端并不知道实际与哪个Web服务器进行了交互,它只知道与反向代理服务器进行了通信
我们买的云服务器就是在图中右侧的任意一个,反向代理服务器的公网IP会转给内部的某个机器 —— 给我们的错觉是有一个公网服务器的IP,所以能理解无法绑定公网IP,因为真正的IP并没有给到我们
举例子:
💥代理服务器和NAT
路由器往往都具备NAT设备的功能,通过NAT设备进行中转,完成子网设备和其他子网设备的通信过程。代理服务器看起来和NAT设备有⼀点像。客户端向代理服务器发送请求,代理服务器将请求转发给真正要请求的服务器;服务器返回结果后,代理服务器又把结果回传给客户端
代理服务器是最大的中间人!
🤔
对信息进行渲染 就是谷歌的页面了
上面的代理客户端和jw服务器(几百台,部署代理 —— 机场)都是有专门的人来做的
对于jw服务器:我的客户端怎么知道有几百台服务器呢?机场会给我一下配置文件——代理服务器的地址,代理商就会给你这个配置文件的下载链接
- 我们的主机按这个链接进行配置后,就会自动下载远程的服务器的密钥和登录信息 —— 后续就可以访问了
对信息进行渲染 就是谷歌的页面了
上面的代理客户端和jw服务器(几百台,部署代理 —— 机场)都是有专门的人来做的
对于jw服务器:我的客户端怎么知道有几百台服务器呢?机场会给我一下配置文件——代理服务器的地址,代理商就会给你这个配置文件的下载链接
- 我们的主机按这个链接进行配置后,就会自动下载远程的服务器的密钥和登录信息 —— 后续就可以访问了
📢写在最后
接下来登场的是 IO 模型