当前位置: 首页 > news >正文

【计网】深入理解NAT机制,内网穿透与内网打洞,代理服务

在这里插入图片描述

我没胆量犯错 才把一切错过
--- 林夕 《我对不起我》---

一文了解NAT机制,代理服务,内网穿透

  • 1 再谈 NAT 机制
  • 2 内网穿透与内网打洞
  • 3 代理服务器

1 再谈 NAT 机制

NAT机制我们在解决IP地址不足的问题中提到过。为了解决IP地址不足的问题,采取了私有IP与公网IP的策略:

  • 私有IP是随机分配的,保证在局域网中不重复,在不同子网中可以重复!

那么这样在网络通信过程中势必会造成问题,因为私有IP并不是唯一的,所以私有IP不能出现在公网通信中的。解决这个问题的机制就是NAT机制。NAT机制即在路由器进行转发时将报文源IP更换为路由器WAN口IP,**进行一次源IP地址替换!**这样就可以私有IP就不会出现在公网中!并且在通信过程中够可以层层向下找到唯一的主机!

在这里插入图片描述
上图中,NAT 路由器将源地址从 10.0.0.10 替换成全局的 IP 202.244.174.37;NAT 路由器收到外部的数据时, 又会把目标 IP 从 202.244.174.37 替换回10.0.0.10

  • 这个转换的基础是:在 NAT 路由器内部,有一张自动生成的,用于地址转换的表NAPT;
  • 10.0.0.10 第一次向163.221.120.9发送数据时就会生成表中的映射关系。

此时就会有一个新问题!应该局域网中的多台主机在经过路由器路由转发后,源IP都变成了路由器的WAN口IP,那么这样服务端发送回的报文到达路由器时,目的IP是路由器的WAN口IP。那么路由器如何知道这个报文是要传送给局域网中的哪台主机呢?

  • 这时候 NAPT 来解决这个问题了,使用 IP+port 来建立这个关联关系!

在这里插入图片描述
路由器之中,进行转发时,维护了一张NAPT转换表。其中记录目的IP+端口号port WAN口IP + 端口号port的映射关系,互为键值。这两个都具有唯一性:局域网唯一,公网唯一!源IP发生替换,源端口也可能发生替换!这样保证了映射的唯一性!

每个路由器在转发过程中都会生成一份NAPT表,最终就可以到达公网进行通信!这样其实也说明了一个问题,公网是无法直接访问内网机器的,只有内网机器向公网发送过数据,建立过NAPT表,才能从外部进入内部!

所以NAT 技术是有缺陷的,由于 NAT 依赖这个转换表, 所以有诸多限制:

  • 无法从 NAT 外部向内部服务器建立连接;
  • 转换表的生成和销毁都需要额外开销;一般不需要担心性能不够!
  • 通信过程中一旦 NAT 设备异常,即使存在热备, 所有的 TCP 连接也都会断开;

使用WIndows访问我们的Linux服务端时,我们仔细观察会发现服务端接收到的IP地址和WIndo端是不一致的!
这也是由于路由器NAT转发的结果!Linux服务上的实际获取到的IP是出入口路由器的WAN口IP

2 内网穿透与内网打洞

如果今天可以做到:

  1. 首先我们拥有一个云服务器.
  2. 并且我们在内网构建一个Linux机器,使用22端口部署了一个ssh服务,可以与云服务器建立一个连接。
  3. 云服务器也部署一个服务,可以将机器上所以8888端口获取的数据,可以转到内网的Linux服务器上!
  4. 这样云服务器8888端口与内网服务器的22端口就建立了映射;
  5. 那么其他内网的机器可以通过访问云服务器的8888端口就直接可以访问到内网的Linux机器了!

这样内网的机器就能访问另一台内网的机器了,这叫做内网穿透技术
这个我们可以在云服务器使用frp软件进行内网穿透服务:

  • 服务器:拥有一台具有公网IP地址的服务器,作为FRP的服务端。
  • 客户端:需要穿透的内网机器,作为FRP的客户端。

那么为什么要进行内网穿透呢?内网穿透有这样的优点:

  1. 成本效益:内网穿透可以避免购买服务器公网IP地址的高昂成本,同时也能实现公网服务的功能。
  2. 访问限制:由于NAT(网络地址转换)和防火墙的存在,内网中的设备通常无法直接从外网访问。内网穿透技术可以帮助绕过这些限制,使得内网服务可以被外网访问。
  3. 资源共享:内网穿透使得个人或企业可以将其内网中的资源(如文件服务器、Web服务、数据库等)分享给外网的用户,而无需复杂的网络配置。
  4. 远程管理:系统管理员可以通过内网穿透技术,从外部网络远程管理内网中的服务器或设备,方便进行维护和监控。可以实现远程访问公司服务器进行办公!
  5. 开发与测试:开发者可以在内网环境中开发应用程序,并通过内网穿透技术让外网的测试人员或合作伙伴访问,以便进行测试和反馈。
  6. 安全性:内网穿透可以提供一种更安全的远程访问方式。通过配置,可以限制哪些外部地址可以访问内网服务,从而保护内网资源不被未经授权的访问。

上面的客户端,最终被云服务器获取的源IP是出入口路由器的WAN口IP。服务端这里通过配置会有内网服务器的IP地址与端口号,那么可不可以将服务端IP+port发给客户端,客户端IP+port发给服务端呢?

当然可以,这样客户端就可以直接向内网服务器进行访问,服务端也可以直接给客户端发送数据!这种技术就叫做内网打洞!这样就直接跨过了云服务器,在出入口路由器上打了一个洞,可以直接进行访问!

一些出入口路由器是不允许进行内网打洞,这里我们了解其原理就可以了!

3 代理服务器

在学校,公司这些地方会有对应的校园网,公司网。这样的网络可以提供更好的内网服务或者网络监视。在这个内网中,所有的机器都会先将数据发送到代理服务器上,进行一次处理,在进行转发。这就是一种正向代理服务。

  • 正向代理(Forward Proxy) 是一种常见的网络代理方式, 它位于客户端和目标服务器之间, 代表客户端向目标服务器发送请求。
  • 正向代理服务器接收客户端的请求, 然后将请求转发给目标服务器, 最后将目标服务器的响应返回给客户端。 通过这种方式, 正向代理可以实现多种功能, 如提高访问速度、 隐藏客户端身份、 实施访问控制等。
    在这里插入图片描述
    那么如何做到让所有的机器都会将报文发送到这台服务器上呢?就是通过路由器,在学校公司中,所有的网络配置都是统一进行管控的,最终都会将数据包发送到这个代理服务器上!这个过程是这样的:

• 客户端将请求发送给正向代理服务器。
• 正向代理服务器接收请求, 并根据配置进行处理, 如缓存查找、 内容过滤等。
• 正向代理服务器将处理后的请求转发给目标服务器。
• 目标服务器处理请求, 并将响应返回给正向代理服务器。
• 正向代理服务器将响应返回给客户端

代理服务器有很多优点:

  • 缓存功能: 正向代理服务器可以缓存经常访问的资源, 当客户端再次请求这些资源时, 可以直接从缓存中获取, 提高访问速度。
  • 内容过滤: 正向代理可以根据预设的规则对请求或响应进行过滤, 如屏蔽广告、阻止恶意网站等。
  • 访问控制: 通过正向代理, 可以实现对特定网站的访问控制, 如限制员工在工作时间访问娱乐网站。
  • 隐藏客户端身份: 正向代理可以隐藏客户端的真实 IP 地址, 保护客户端的隐私。
  • 负载均衡: 在多个目标服务器之间分配客户端请求, 提高系统的可扩展性和可靠性。

同样的还有反向代理服务器,用来保证调控服务器群。
在这里插入图片描述

反向代理服务器是一种网络架构模式, 其作为 Web 服务器的前置服务器, 接收来自客户端的请求, 并将这些请求转发给后端服务器, 然后将后端服务器的响应返回给客户端。 这种架构模式可以提升网站性能、 安全性和可维护性等。

  • 反向代理服务器位于客户端和 Web 服务器之间, 当客户端发起请求时, 它首先会到达反向代理服务器。
  • 反向代理服务器会根据配置的规则将请求转发给后端的 Web服务器, 并将 Web 服务器的响应返回给客户端。
  • 在这个过程中, 客户端并不知道实际与哪个 Web 服务器进行了交互, 它只知道与反向代理服务器进行了通信。
  • 这样客户端只会访问这一个代理服务器,代理服务器调控流量,让服务器群负载均衡。

反向代理服务器有以下优点:

  1. 负载均衡: 反向代理服务器可以根据配置的负载均衡策略, 将客户端的请求分发到多个后端服务器上, 以实现负载均衡。 这有助于提升网站的整体性能和响应速度,特别是在高并发场景下。
  2. 安全保护: 反向代理服务器可以隐藏后端 Web 服务器的真实 IP 地址, 降低其被直接攻击的风险。 同时, 它还可以配置防火墙、 访问控制列表(ACL) 等安全策略,对客户端的请求进行过滤和限制, 以保护后端服务器的安全。
  3. 缓存加速: 反向代理服务器可以缓存后端 Web 服务器的响应内容, 对于重复的请求, 它可以直接从缓存中返回响应, 而无需再次向后端服务器发起请求。 这可以大大减少后端服务器的负载, 提升网站的响应速度。
  4. 内容过滤和重写: 反向代理服务器可以根据配置的规则对客户端的请求进行过滤和重写, 例如添加或删除请求头、 修改请求路径等。 这有助于实现一些特定的业务需求, 如 URL 重写、 用户认证等。
  5. 动静资源分离: 在大型网站中, 通常需要将静态资源和动态资源分开处理。 通过将静态资源部署在反向代理服务器上, 可以直接从反向代理服务器返回静态资源的响应,而无需再次向后端服务器发起请求。 这可以大大提升静态资源的访问速度。 CDN(Content Delivery Network, 内容分发网络) 就是采用了反向代理的原理。

那么NAT和代理服务器的功能好像有点类似啊?

  • 路由器往往都具备 NAT 设备的功能,通过 NAT 设备进行中转,完成子网设备和其他子网设备的通信过程。
  • 代理服务器看起来和 NAT 设备有一点像。 客户端像代理服务器发送请求,代理服务器将请求转发给真正要请求的服务器;服务器返回结果后,代理服务器又把结果回传给客户端。

那么 NAT 和代理服务器的区别有哪些呢?

  1. 从应用上讲:NAT 设备是网络基础设备之一,解决的是 IPv4版本IP 不足的问题。代理服务器则是更贴近具体应用,比如通过代理服务器进行翻墙,另外像迅游这样的加速器,也是使用代理服务器。
  2. 从底层实现上讲:NAT 是工作在网络层,直接对 IP 地址进行替换。代理服务器往往工作在应用层。
  3. 从使用范围上讲: NAT 一般在局域网的出口部署;代理服务器可以在局域网做,也可以在广域网做,也可以跨网。
  4. 从部署位置上讲:NAT 一般集成在防火墙,路由器等硬件设备上,代理服务器则是一个软件程序,需要部署在服务器上。

相关文章:

【计网】深入理解NAT机制,内网穿透与内网打洞,代理服务

我没胆量犯错 才把一切错过 --- 林夕 《我对不起我》--- 一文了解NAT机制,代理服务,内网穿透 1 再谈 NAT 机制2 内网穿透与内网打洞3 代理服务器 1 再谈 NAT 机制 NAT机制我们在解决IP地址不足的问题中提到过。为了解决IP地址不足的问题,采…...

C# 创建型设计模式----工厂模式

1 、什么是工厂模式 简单来说就是由一个对象去生成不同的对象,工厂模式是用工厂方法代替new操作的一种模式。工厂方法封装了多个相关联类的new方法,每次实例化这些类的时候不需要new多次,只需要调用工厂类的对应方法即可实例化这些类&#x…...

java中Scanner的nextLine和next方法

思考&#xff0c;输入1 2 3 4 5加上enter&#xff0c;输出什么 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int[][] m new int[2][2];for (int i 0; i < 2; i) {for (int j 0; j < 2;…...

2024年全国山洪径流模拟与洪水危险性评价技术及典型地区洪水淹没及损失分析

洪水淹没危险性&#xff08;各种年遇型洪水淹没&#xff09;是洪水损失评估、风险评估及洪水应急和管理规划等工作的重要基础。当前开展洪水危险性研究工作中的主要困难之一是水文资料稀缺&#xff0c;尤其是径流资料稀缺&#xff0c;既包括径流观测资料在时间上的短缺&#xf…...

CDC 同步数据需要的MySQL数据权限

授权命令如下: grant Replication client on *.* to username%; grant Replication slave on *.* to username%; flush privileges;...

Ubuntu20.04 更新Nvidia驱动 + 安装CUDA12.1 + cudnn8.9.7

一、概述 最近客户给了几台GPU服务器,长期放置落灰那种,然后想利用起来,所以上去看看了配置,系统是Ubuntu20.04,相关的驱动版本稍嫌老一些,所以需要更新Nvidia驱动,同时在安装CUDA和CUDNN,查看了显卡型号之后,打算使用onnxruntime进行推理,对比了版本,最后选择了CUD…...

算法自学 Lesson3 - 逻辑回归(LR)

目录 背景 一、适用数据集 1. 数据集选择 1.1 领域 1.2 数据集维度 1.3 记录行&#xff08;样本数量&#xff09; 2. 本文数据集介绍 3. 数据集下载 注意 二、逻辑回归的基本原理 1. 目的 2. Sigmoid 函数 3. 类别划分 4. 召回率 三、代码 1. 导入所需包&数…...

文件IO流

1.文件流概念 2.文件创建方式 3.常用方法 4.IO流原理 &#xff08;1&#xff09;InputStream&#xff0c;OutputStream, Reader, Writer四个都是抽象类&#xff0c;无法直接new, 需要由子类继承&#xff0c;然后new子类&#xff1b; &#xff08;2&#xff09;Reader和Writer…...

拥塞控制与TCP子问题(粘包问题,异常情况等)

​拥塞控制 除了拥塞控制 以上的策越都是为了解决tcp 客户端和服务端提高效率&#xff0c;解决丢包的策略 但是拥塞控制是了为解决网络拥堵 出现了大面积丢包&#xff0c;我们发送方会判定是网络出现了问题&#xff1f; 丢包好解决&#xff0c;我们直接采用超时重传&#…...

stm32入门教程--DMA 超详细!!!

目录 简介 工作模式 1、数据转运DMA 2、ADC扫描模式DMA 简介 工作模式 1、数据转运DMA 这个例子的任务是将SRAM的数组DataA&#xff0c;转运到另一个数组DataB中&#xff0c;这个基本结构里的各个参数应该如何配置呢&#xff1f; 首先是外设站点和存储器站点的起始地址、…...

【使用Flask构建RESTful API】从零开始开发简单的Web服务!

使用Flask构建RESTful API&#xff1a;从零开始开发简单的Web服务 引言 随着Web应用程序的广泛使用&#xff0c;RESTful API已成为现代Web服务的核心技术之一。通过RESTful API&#xff0c;我们可以轻松地创建、读取、更新和删除&#xff08;CRUD&#xff09;数据&#xff0c…...

用sdcc给51单片机编译C程序

学习单片机大部分人用的是Keil uVision&#xff0c;虽然好用&#xff0c;可大部分人用的是盗版&#xff0c;其实单片机程序小的话&#xff0c;完全可以用文本编辑器&#xff08;推荐notepad)编写&#xff0c;然后用免费的sdcc来编译&#xff0c;下面介绍一下大致的过程。 sdcc…...

Java Lock LockSupport 源码

前言 相关系列 《Java & Lock & 目录》&#xff08;持续更新&#xff09;《Java & Lock & LockSupport & 源码》&#xff08;学习过程/多有漏误/仅作参考/不再更新&#xff09;《Java & Lock & LockSupport & 总结》&#xff08;学习总结/最新…...

Elasticsearch基础操作入门

阅前准备知识 学习 Elasticsearch (简称 ES) 的查询方式&#xff0c;建议从以下几个步骤入手&#xff1a; 理解 Elasticsearch 的基础概念 首先要了解 Elasticsearch 的核心概念&#xff0c;例如&#xff1a; Index&#xff08;索引&#xff09;&#xff1a;相当于数据库中…...

跨域问题解决办法

跨域问题在Web开发中是一个常见的问题&#xff0c;特别是在前后端分离的开发模式下。以下是一些解决跨域问题的办法&#xff1a; 一、后端配置CORS&#xff08;跨来源资源共享&#xff09; CORS是一种机制&#xff0c;它使用额外的HTTP头来告诉浏览器一个网页的当前来源&…...

【数据结构与算法】力扣 23. 合并 K 个升序链表

题干描述 23. 合并 K 个升序链表 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 示例 1&#xff1a; 输入&#xff1a; lists [[1,4,5],[1,3,4],[2,6]] 输出&#xff1a; [1,1,2,3,4,4,5,6]…...

Java Lock CountDownLatch 总结

前言 相关系列 《Java & Lock & 目录》&#xff08;持续更新&#xff09;《Java & Lock & CountDownLatch & 源码》&#xff08;学习过程/多有漏误/仅作参考/不再更新&#xff09;《Java & Lock & CountDownLatch & 总结》&#xff08;学习总…...

vue+spreadjs开发

创建vue3项目 pnpm create vite --registryhttp://registry.npm.taobao.org安装spreadjs包 pnpm install "grapecity-software/spread-sheets17.1.7" "grapecity-software/spread-sheets-resources-zh17.1.7" "grapecity-software/spread-sheets-vu…...

针对初学者的PyTorch项目推荐

文章目录 1. MNIST手写数字识别2. CIFAR-10图像分类3. 图像风格迁移4. 文本生成&#xff08;使用RNN&#xff09;5. 简单的问答系统6. 简单的生成对抗网络&#xff08;GAN&#xff09;7. 简单的推荐系统 对于初学者来说&#xff0c;选择一些简单且具有教育意义的项目来实践PyTo…...

Helm Chart文件介绍

介绍&#xff08;这个还没有完善 &#xff0c;目前在找工作呢&#xff09; Helm是Kubernetes的包管理器&#xff0c;类似于Ubuntu中的apt、CentOS中的yum或Python中的pip&#xff0c;可以快速查找、下载和安装软件包。Helm主要由客户端组件helm和服务端组件Tiller组成&#xf…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

C# 表达式和运算符(求值顺序)

求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如&#xff0c;已知表达式3*52&#xff0c;依照子表达式的求值顺序&#xff0c;有两种可能的结果&#xff0c;如图9-3所示。 如果乘法先执行&#xff0c;结果是17。如果5…...