【Linux笔记】网络部分——NAT-代理-网络穿透

45.NAT-代理-网络穿透

文章目录

NAT技术

在之前我们学习网络层IP协议的时候,我们了解到IP地址分为公网IP和私有IP,公网IP全球唯一,私有IP仅在某一个局域网下唯一,不同局域网之间的私有IP可能会重复。这也是为了解决IPV4地址资源不足的问题,而NAT技术通过将私有IP地址转换为公有IP地址,实现内网设备访问公网的需求。

  • NAT功能通常集成在路由器中,路由器不仅能划分子网,还能进行动态IP地址分配(DHCP)和NAT转换。
  • NAT技术广泛应用于学校、家庭和公司网络中,每个终端设备设置私有IP地址,而路由器或必要的服务器上设置全局IP地址。
  • NAT的核心作用是在私有IP与公网通信时,将私有IP转换为全局IP,从而实现内网设备与外部网络的通信。

NAT的IP转换过程

在具体实现中,NAT会将内网主机的私有IP地址替换为路由器的WAN口IP地址,使得数据包能够在公网中传输。

例如,内网中的主机A(IP地址为10.0.0.10)想要访问公网中的服务器(IP地址为163.21.120.9)

  • 发送:主机A会将数据包发送到路由器,路由器将数据包中的源IP地址(10.0.0.10)替换为自身的WAN口IP地址(如202.244.174.37),然后再将数据包转发到公网。

  • 接收:服务器收到数据包后,会将响应发送到路由器的WAN口IP地址,路由器再根据NAT映射表将数据包转发回内网中的主机A。

    路由器中的WAN口IP和LAN口IP是两个不同网络接口的IP地址,分别用于连接外部网络和局域网内部设备

这就是NAT的大致过程。

NAPT

如果我们仔细想一下,就会发现有一个问题:如果对于一个连接了多台主机的路由器(也就是说一个局域网内有多台主机)访问同一个外网服务器,那么对于服务器返回的数据中, ⽬的IP都是相同的. 那么NAT路由器如何判定将这个数据包转发给哪个局域⽹的主机? 解决这个问题需要了解一下NAPT的原理。

NAT的实现不仅涉及IP地址的替换,还可能涉及端口号的转换(NAPT),以支持多台内网设备通过同一个公网IP地址访问外部网络。路由器在NAT转换过程中会维护一张映射表,记录内网IP和端口与公网IP和端口的对应关系,确保数据包能够正确返回内网中的目标设备。

可以简单理解一下:

  • 对于一台主机想要访问公网,实际上是这台主机中的某个进程需要访问公网。标识一台主机中某个特定的进程不仅有之前学的PID,在网络通信层面上也有另一个标识:端口号。
  • 既然是路由器代替局域网中的主机在公网中进行网络通信,那么也可以视为 " 路由器的某一个进程(端口) " 在访问公网,而这个公网IP + 路由器分配的端口的组合,在公网上是唯一的。注意:这个由路由器重新分配的端口号可能与原来的端口号不一致
  • 因此在路由器中,我们呢可以建立一个局域网主机的私有IP和端口号与路由器中用于这个主机通信的公网IP和端口号的映射。这样不同主机虽然映射到了同一个公网之下,但由于端口号不同,仍然可以区分发送和接收的某一个数据属于哪一个主机。

这种关联关系也是由NAT路由器⾃动维护的. 例如在TCP的情况下, 建⽴连接时, 就会⽣成这个表项; 在断开连接后, 就会删除这个表项。

对于这张转换表的理解:

  • NAT映射表是路由器在NAT转换过程中动态生成和维护的一张表,用于记录内网IP和端口与公网IP和端口的对应关系。

  • 映射表的构建过程如下:当内网主机发送数据包时,路由器提取数据包的四元组(源IP、源端口、目的IP、目的端口),并将其与转换后的四元组(路由器的WAN口IP地址、临时端口、目的IP、目的端口)关联起来,形成一条映射记录。

  • NAT转换表条目是动态形成的,在第一次通信时建立映射关系,后续通信直接使用已有映射。当客户端关闭连接或长时间不通信时,NAT路由器会定时清理对应的映射条目。即使映射关系被清理,需要重新通信时可以再次建立新的映射关系,不影响后续通信。

  • 映射表的维护通常基于超时机制。如果某条映射记录在一段时间内未被使用(如没有新的数据包匹配该记录),路由器会将其删除以释放资源。此外,某些协议(如TCP)会在连接关闭时通知路由器删除对应的映射记录,而UDP等无连接协议则完全依赖超时机制。

  • 映射表的唯一性保证了数据包的正确转发。由于内网中的源IP和源端口组合在内网中是唯一的,而公网中的目的IP和目的端口组合在公网中也是唯一的,因此四元组的整体组合具有全局唯一性,确保路由器能够准确识别和转发数据包。

NAT转换过程中的数据包转发机制

加上这种技术之后,我们再总结一下NAT转换过程中的数据包转发机制。

  • 首先,内网主机(如主机A)发送数据包时,会根据自身的路由表判断目标网络是否在本地子网内。如果目标网络不在本地子网,主机会将数据包发送到默认网关(路由器)。
  • 路由器收到数据包后,会进行NAT转换,将数据包中的源IP地址替换为自身的WAN口IP地址,同时可能修改源端口号(NAPT)。路由器在NAT转换过程中会生成并维护一张映射表,记录原始数据包的四元组(源IP、源端口、目的IP、目的端口)和转换后的四元组。这张映射表用于确保响应数据包能够正确返回内网中的原始主机。
  • 服务器收到数据包后,会将响应发送到路由器的WAN口IP地址,路由器根据映射表将响应数据包转发回主机A。NAT映射表的唯一性保证了数据包的正确转发。内网中的源IP和源端口组合在内网中是唯一的,而公网中的目的IP和目的端口组合在公网中也是唯一的。因此,四元组的整体组合具有全局唯一性,确保路由器能够准确识别和转发数据包。

NAT技术的局限性

  • NAT破坏了端到端的通信模型,使得某些依赖IP地址直接通信的应用(如P2P、VoIP)难以正常工作
  • ⽆法从NAT外部向内部服务器建⽴连接
  • 装换表的⽣成和销毁都需要额外开销
  • 通信过程中⼀旦NAT设备异常, 即使存在热备, 所有的TCP连接也都会断开

内网穿透

内网穿透技术允许用户从外部网络访问位于内网中的设备。

典型场景包括从学校远程登录家中的Linux机器,虽然两者都处于不同的内网环境中。实现方法是在内网主机上运行一个客户端程序,主动与公网服务器建立连接,这样就在内网和公网之间建立了通信通道。当外部用户访问公网服务器时,服务器会将请求通过已建立的连接转发到内网主机。这种技术需要三个组件:内网中的客户端程序、公网服务器程序以及访问公网服务器的用户。所有通信都通过这个预先建立的通道进行,包括认证和操作命令。

内网穿透使得外部用户能够像直接访问内网设备一样操作远程主机,而实际上所有请求都是通过公网服务器中转的。这种技术特别适用于需要远程访问内网设备但又无法直接连接的场景。

FRP内网穿透工具

FRP是一个开源的内网穿透工具,包含客户端(frpc)和服务器端(frps)两个组件。客户端运行在内网主机上,主动与部署在公网服务器上的frps建立连接。当外部用户访问公网服务器的特定端口时,frps会将请求通过已建立的连接转发到内网主机。FRP支持将内网主机的各种服务(如HTTP、SSH)暴露在公网上,用户只需访问公网服务器的对应端口即可。工具自动处理了NAT穿透的所有复杂细节,包括连接建立、请求转发和响应返回。FRP的配置包括指定要暴露的内网服务类型和端口,以及公网服务器上的监听端口。建立连接后,所有通信都通过这个安全通道进行,使得内网服务对公网用户完全透明可用。

内网打洞

内网打洞是一种技术,允许不同内网中的设备通过运营商网络直接通信,而无需经过云服务器转发。以直播场景为例,主播(如老师)通过云服务器开播,观众通过云服务器听课。传统方式下,云服务器需转发所有数据,资源消耗大。而内网打洞技术中,云服务器仅需交换主播和观众的路由器IP及端口信息,后续数据可直接通过运营商网络传输,无需经过云服务器。主播将直播数据直接发送给观众的路由器IP和端口,观众也将互动消息直接发送给主播的路由器IP和端口。

运营商拥有出入口路由器的控制权,可以允许或禁止路由器之间的直接通信。若运营商允许打洞,则设备可通过路由器IP和端口直接通信;若运营商禁止,则数据仍需通过云服务器转发。

内网打洞适用于UDP和TCP协议,可显著降低云服务器负载,提升数据传输效率。直播平台需具备技术能力并得到运营商支持才能实现内网打洞。

实际应用场景

远程桌面控制

内网穿透技术广泛应用于远程桌面控制等场景。远程控制软件如TeamViewer等利用类似原理,通过在两端安装专用客户端实现穿透。这些客户端会自动与公网服务器建立连接,创建通信通道。当用户发起远程控制请求时,请求会通过这个通道在两台内网设备之间传输。这种技术使得位于不同内网中的设备能够直接通信,无需复杂的网络配置。内网穿透不仅限于远程桌面,还可用于访问内网的Web服务、数据库或其他网络应用。其核心价值在于简化了跨网络访问的复杂性,用户无需关心底层网络结构,只需通过统一的公网入口就能访问各种内网资源。

快播

快播是一款具有历史意义的软件,其技术实现与内网穿透和点对点传输相关。快播通过类似内网打洞的技术,允许用户直接交换数据,减少服务器负载。其技术原理涉及路由器IP和端口的直接通信,类似于现代内网打洞的实现方式。快播的成功部分归因于其对运营商网络的巧妙利用,实现了高效的数据分发。然而,快播的技术也面临运营商限制,若网络配置禁止直接通信,则无法实现高效传输。快播作为早期点对点传输技术的代表,展现了内网穿透和打洞技术的潜力,同时也揭示了运营商政策对技术应用的影响。

快播采用了一项重要技术,当用户电脑上安装了快播客户端并下载了电影(如美国队长)时,其他用户想下载同一部电影时,双方的内网环境会通过快播服务器实现打通。云服务器能够识别正在观看特定电影的用户客户端信息,包括账号、路由器IP地址和端口号,以及电影相关信息。通过内网穿透技术,云服务器先将数据传输给请求用户,之后客户端直接向目标路由器发起请求获取资源,无需再访问云服务器。系统会根据网络距离选择最优路径,实现快速下载。

代理

正向代理

正向代理(Forward Proxy)是⼀种常⻅的⽹络代理⽅式,它位于客⼾端和⽬标服务器之间,代表客⼾端向⽬标服务器发送请求。正向代理服务器接收客⼾端的请求,然后将请求转发给⽬标服务器,最后将⽬标服务器的响应返回给客⼾端。通过这种⽅式,正向代理可以实现多种功能,如提⾼访问速度、隐藏客⼾端⾝份、实施访问控制等

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

与NAT技术不同,代理服务器工作在应用层,能够理解并处理HTTP等协议的具体内容。

特点

正向代理的功能特点包括缓存常用资源(如学习资料和电影)、内容过滤(如屏蔽广告和恶意网站)、访问控制(限制特定网站访问和工作时间娱乐网站访问)、隐藏客户端真实IP保护隐私、负载均衡(在多个目标服务器间分配请求提高系统可扩展性)。在企业应用中,代理服务器可以管理员工网络行为,防止上班时间做与工作无关的事情。图书馆和家长也可以利用内容过滤功能屏蔽不良内容,跨境电商等领域也能受益于代理服务器的缓存加速功能。

反向代理

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

基本原理

反向代理服务器位于客⼾端和Web服务器之间,当客⼾端发起请求时,它⾸先会到达反向代理服务器。反向代理服务器会根据配置的规则将请求转发给后端的Web服务器,并将Web服务器的响应返回给客⼾端。在这个过程中,客⼾端并不知道实际与哪个Web服务器进⾏了交互,它只知道与反向代理服务器进⾏了通信

应用场景
  • 负载均衡,可以采用随机、轮询等方式将请求分配给后端服务器提高站点响应速度;
  • 安全保护,通过隐藏后端服务器IP地址防止直接攻击,还能对异常访问IP加入黑名单;
  • 缓存加速,将高频访问的静态资源缓存在代理服务器上直接响应,避免频繁访问数据库;
  • 内容过滤和重写;
  • 动静分离,将静态资源请求直接返回而动态请求转发到后端处理。大型网站通常将静态资源放在反向代理入口处,动态内容交由后端处理。
  • 内容分发网络(CDN)也是反向代理的一种应用,前端框架库等静态资源可以直接从代理服务器获取,无需后端处理。

代理服务器与NAT的区别

代理服务器与NAT(网络地址转换)虽然都涉及请求转发,但两者在功能和应用场景上有显著差异。

  • NAT是网络层技术,部署在路由器或防火墙上,主要用于解决IPv4地址不足问题,通过替换IP和端口实现内网设备与外网的通信。NAT不处理应用层数据,也不提供缓存或流量监控功能。
  • 代理服务器则工作在应用层,通常以软件形式部署在云服务器或本地主机上,例如Nginx。代理服务器不仅能转发请求,还能缓存数据、监控流量、拦截非法内容,甚至用于游戏加速或负载均衡。例如,王者荣耀的静态资源可以通过代理服务器就近分发,减少延迟。此外,代理服务器支持跨网络通信(如内网到公网、公网到公网),而NAT仅限局域网与公网之间的地址转换。
相关推荐
希和202716 小时前
免费AI视频生成工具汇总(国内优先,适合做漫剧、短视频,Obsidian笔记版)
人工智能·笔记·音视频
且从容.16 小时前
ubuntu安装flink
linux·ubuntu·flink
蒸蒸yyyyzwd17 小时前
秋招学习笔记 day109
笔记·八股
爱和冰阔落18 小时前
【Linux网络】TCP 服务器如何并发处理多个客户端?从 fork、僵尸进程到双重 fork
linux·运维·服务器·网络
程序员沉梦听雨18 小时前
WSL2的安装与使用
linux·wsl
微小的鱼18 小时前
Linux的渲染与显示系统链路
android·java·linux
lisanmengmeng19 小时前
alertmanger 标签 rules 打上分组标签
linux·运维·服务器
严肃小白兔19 小时前
Cloudflare 更新 API Token 管理:从最小权限到自动化凭据安全
网络·安全·自动化
Android系统攻城狮19 小时前
Linux FFmpeg深度解析之av_write_frame调用流程与实战(三十三)
linux·运维·服务器·ffmpeg·音视频进阶·ffmpeg音视频
只愿云淡风清20 小时前
正则表达式学习笔记 02:基础语法
笔记·学习·正则表达式