【Linux网络-NAT、代理服务、内网穿透】

一、NAT技术

1.NAT技术背景

之前我们讨论了,IPV4协议中,IP地址数量不充足的问题

NAT技术当前解决IP地址不够用的主要手段,是路由器的一个重要功能

NAT(网络地址转换,Network Address Translation)是一种用于网络设备(如路由器或防火墙)上的技术,其主要目的是在局域网(LAN)和广域网(WAN)之间转换IP地址以实现私有地址和公共地址的互通,从而节省公共IP地址资源并提高网络安全性。NAT的应用广泛,尤其在IPv4地址枯竭的情况下更加重要。

NAT主要功能是将内部网络(通常使用私有IP地址)与外部网络(如互联网)连接,通过将私有IP地址映射为公共IP地址,使得内部设备能够访问外部网络,同时保护内部网络不直接暴露于外部。NAT的基本工作机制是将进出数据包中的IP地址进行转换

  • NAT能够将私有IP对外通信时转为全局IP,也就是一种将私有IP和全局IP相互转化的技术方法
  • 很多学校,家庭,公司内部采用每个终端设置私有IP,而在路由器或必要的服务器上设置全局IP;
  • 全局IP要求唯一,但是私有IP不需要;在不同的局域网中出现相同的私有IP是完全不影响的

2.NAT IP 转换过程

  • NAT路由器将源地址 10.0.0.10 替换成全局的IP 202.244.174.37;
  • NAT路由器收到外部的数据时,又会把目标IP从202.244.174.37替换回10.0.0.10;
  • 在NAT路由器内部,有一张自动生成的,用于地址转换的表
  • 当10.0.0.10第一次向163.211.120.9 发送数据时就会生成表中的映射关系

3.NAPT(地址转换表)

那么问题来了,如果局域网内,有多个主机都访问同一个外网服务器,那么对于服务器返回的数据中,目的IP都是相同的。那么NAT路由器如何判定将这个数据包转发给哪个局域网的主机?

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

NAPT(Network Address Port Translation),也称为网络地址端口转换,是一种NAT(网络地址转换)技术的扩展。NAPT利用端口号在地址转换表(NAPT表)中建立映射,从而允许多个局域网内的私有IP地址共享一个公共IP地址访问外网。

NAPT表的结构

NAPT表用于记录局域网内部的私有IP地址、端口号与外部网络中使用的公共IP地址、端口号的映射关系。NAPT表的典型结构包括以下几项:

  • 内部IP地址:局域网内发起请求的私有IP地址
  • 内部端口号:局域网内主机使用的本地端口号
  • 外部IP地址:NAPT路由器的公共IP地址(通常唯一)
  • 外部端口号 :NAPT路由器为区分不同内部主机而分配的临时外部端口号
  • 目标IP地址和端口号(可选):在一些NAPT实现中,也会记录目标服务器的IP地址和端口号,用于数据包的双向匹配和更高效的路由

NAPT表的核心作用是管理这些映射关系,确保每个内部主机的请求都能被唯一识别。

出站数据包的处理过程

当局域网中的某个设备向外部网络发起请求时,NAPT路由器会执行以下步骤:

  1. 记录映射关系:NAPT路由器在NAPT表中创建一条记录,保存该设备的私有IP地址和端口号,同时分配一个外部端口号作为映射标识。
  2. 地址转换:NAPT路由器将数据包的源IP地址替换为自己的公共IP地址,将源端口号替换为分配的外部端口号。
  3. 更新表记录:如果该内部IP和端口号已经存在映射关系,则使用已有的映射;如果是新的请求,则分配新的外部端口号并更新NAPT表。

例如:

  • 主机A的私有IP地址和端口号为192.168.1.10:12345,在NAPT表中映射为203.0.113.1:50001
  • 主机B的私有IP地址和端口号为192.168.1.20:23456,在NAPT表中映射为203.0.113.1:50002
入站数据包的处理过程

当外部服务器将响应数据包返回到NAPT路由器时,NAPT表用于查找原始的内部IP和端口号,以便准确将数据包转发到请求的内部主机:

  1. 查询NAPT表:NAPT路由器根据接收到的数据包的目的端口号和公共IP地址,在NAPT表中查找相应的内部IP和端口号。
  2. 地址恢复:路由器将数据包的目的IP地址替换为对应的内部IP地址,将目的端口号替换为原始内部端口号。
  3. 转发数据包:数据包被转发到相应的内部主机。

例如:

  • 返回数据包的目的IP和端口为203.0.113.1:50001,则路由器查找NAPT表,发现此映射对应于主机192.168.1.10:12345,并将数据包转发给主机A。
  • 目的IP和端口为203.0.113.1:50002的数据包则会被转发至主机192.168.1.20:23456,即主机B。
NAPT的优点
  • 节省公共IP资源:多个私有地址可以共享一个公共IP地址,有效缓解了IPv4地址枯竭的问题。
  • 隐匿内部网络:外部网络只能看到NAPT路由器的公共IP地址,无法直接访问局域网内的主机,从而增强了网络安全性。
  • 灵活性高:可以支持大量的内部主机访问外部网络而不受公共IP数量的限制。
NAPT的缺点

由于 NAT 依赖这个转换表,所以有很多的限制:

  • 端到端连接受限:NAPT破坏了IP协议中的端到端通信,使某些基于IP的应用无法正常工作(例如VoIP、视频会议等),通常需要额外的NAPT穿透技术支持。
  • 处理开销:由于NAPT路由器需要维护大量的映射关系表,会增加设备的处理负荷,尤其是在高并发情况下。
  • 无法从 NAT 外部向内部服务器建立连接。
  • 通信过程中一旦 NAT 设备异常,即使存在热备,所有的 TCP 连接也都会断开。

二、代理服务器

代理服务器是一种应用比较广的技术

  • 翻墙:广域网中的代理
  • 负载均衡:局域网中的代理

代理服务器的功能就是代理网络用户去取得网络信息,代理服务器又分为正向代理和反向代理等;

代理服务器(Proxy Server)是一种中间服务器,用于客户端(如个人计算机)与目标服务器之间的通信。代理服务器在网络请求的过程中充当中介角色,接收客户端的请求后再将其转发到目标服务器,并将返回的数据传递给客户端。代理服务器在网络中具有多种用途,如提高访问速度、增强隐私保护、管理访问权限等。

代理例子:

花王尿不湿是产自日本的一个很经典的尿不湿品牌。张三去日本买尿不湿不方便,但是可以让他在日本工作的表姐去超市买了快递给他。此时超市看到的买家是张三的表姐,张三的表姐就是是 "正向代理"。后来找张三表姐买尿不湿的人太多了,他表姐觉得天天去超市太麻烦,干脆去超市买了一大批尿不湿屯在家里,如果有人来找她代购,就直接把屯在家里的货发出去,而不必再去超市,此时张三表姐就是 "反向代理"。

正向代理用于请求的转发(例如借助代理绕过反爬虫)

反向代理往往作为一个缓存

1.正向代理

正向代理(Forward Proxy)是一种用于客户端和目标服务器之间的代理服务器 ,通常用于帮助客户端访问特定的外部资源正向代理可以隐藏客户端的真实IP地址,绕过网络限制,缓存常用内容,加快访问速度。正向代理服务器的客户端是受控的,这种代理的设置通常需要客户端的参与配置

正向代理的工作原理

正向代理位于客户端和目标服务器之间,主要负责将客户端的请求转发给目标服务器,获取响应后再返回给客户端。正向代理的典型工作流程如下:

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

企业网络管理:企业可以通过正向代理实现对员工网络访问的管理和控制,确保员工在工作时间内专注于工作,避免访问不良网站或泄露公司机密。

公共网络环境:在公共场所如图书馆、学校等提供的网络环境中,通过正向代理可以实现对网络资源的合理分配和管理,确保网络使用的公平性和安全性。

内容过滤与保护:家长可以通过设置正向代理来过滤不良内容,保护孩子免受网络上的不良信息影响。

提高访问速度:对于经常访问的网站或资源,正向代理可以通过缓存机制提高访问速度,减少网络延迟。

跨境电商与海外访问:对于跨境电商或需要访问海外资源的企业和个人,正向代理可以帮助他们突破网络限制,顺畅地访问海外网站和资源。

2.反向代理

反向代理(Reverse Proxy)是一种代理服务器技术,主要用于代理外部用户访问内部服务器,将来自客户端的请求转发给后端服务器,并将服务器的响应返回给客户端。反向代理不仅可以隐藏内部服务器的实际IP地址和结构,还可以分担服务器负载、提高访问速度并增强安全性。

基本原理

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

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

3.NAT和代理服务器

路由器往往都具备NAT设备的功能,通过 NAT设备进行中转,完成子网设备和其他子网设备的通信过程.

代理服务器看起来和 NAT设备有一点像.客户端像代理服务器发送请求,代理服务器将请求转发给真正要请求的服务器;服务器返回结果后,代理服务器又把结果回传给客户端.

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

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

三、内网穿透

内网穿透(NAT 穿透或内网映射)是一种技术,用于解决处于内网或防火墙后面的设备难以被外部网络直接访问的问题。该技术通常用于让外网用户通过特定的隧道或端口访问内网中的服务,而不需要改变内网结构或配置。

几个例子

远程办公访问公司内网服务

场景:

公司员工在家办公时,需要访问公司内网中的 ERP 系统或数据库服务,但没有直接的 VPN 通道。

解决方案:

公司可以搭建 frp(Fast Reverse Proxy) 服务,在公司的外网服务器上配置 frp 服务,并在内网服务器上配置 frpc(frp 客户端)。通过 frp 的端口转发功能,将 ERP 系统的端口映射到外网服务器的一个端口上,员工在家访问外网服务器即可实现对公司内网 ERP 系统的访问。这种方法适合需要长期稳定连接的应用

物联网设备远程控制

场景:

一家智能家居公司希望实现外网对家庭物联网设备(如摄像头、温控器等)的远程控制和监控,而这些设备处于家庭路由器内网中。

解决方案:

可以使用中继服务器实现内网穿透。物联网设备会通过 UDP 打洞技术连接到公司的云服务器(例如使用 P2P 协议如 WebRTC),然后外网用户可以通过云服务器发送指令到设备端,实现远程控制。这种方案适合物联网场景,能够确保多台设备的连接稳定性。

游戏服务器的联机功能

场景:

游戏开发者希望让玩家在没有公网 IP 的情况下也能通过 P2P 实现游戏联机(如局域网对战游戏或桌游等)。

解决方案:

使用 UDP 打洞技术,通过中继服务器让玩家间建立 P2P 连接。中继服务器协助交换内网 IP 地址和端口信息,玩家通过 NAT 穿透直接建立连接,适用于联机游戏或低延迟应用场景。

四、内网打洞

内网打洞(NAT Traversal),通常被称为 NAT 穿透打洞技术,是一种让位于不同内网中的设备可以直接建立连接的技术,主要应用于需要点对点(P2P)通信的场景,如文件传输、视频通话、游戏联机等。内网打洞的核心原理是通过中继服务器协调,让两个内网设备可以穿透各自的 NAT 设备或防火墙,从而实现直接通信。

内网打洞的主要原理

NAT 的作用是通过将私有 IP 地址映射为公共 IP 地址来节省 IP 地址资源,但这会导致内网设备无法直接被外网访问。打洞技术可以突破这个限制,使内网设备之间建立直接连接。常见的打洞技术主要包括 UDP 打洞TCP 打洞,其中 UDP 打洞更为常用,因为其对 NAT 穿透更友好。

1. UDP 打洞(UDP Hole Punching)

UDP 打洞是内网打洞最常用的方法。基本过程如下:

  • 步骤 1:两台内网设备(设备 A 和设备 B)先分别向一个中继服务器(通常位于外网)发送 UDP 数据包,以建立起与中继服务器的连接。中继服务器会记录它们的 NAT 公网地址和端口信息。
  • 步骤 2:中继服务器将 A 的公网地址和端口信息发送给 B,同时也将 B 的公网地址和端口信息发送给 A。
  • 步骤 3:设备 A 和设备 B 使用获得的对方公网地址和端口信息,直接向对方发送 UDP 数据包。由于两端的 NAT 设备都已经打开了对这个地址的通信端口,通信请求可以穿透 NAT,实现内网到内网的连接。

这种方法通常用于实时通信场景,且建立连接后延迟较低。

2. TCP 打洞(TCP Hole Punching)

TCP 打洞的过程与 UDP 打洞类似,但由于 TCP 是面向连接的协议,打洞的成功率通常较低。其实现步骤如下:

  • 步骤 1:与 UDP 打洞类似,设备 A 和设备 B 首先分别与中继服务器建立 TCP 连接,中继服务器记录它们的公网地址和端口信息。
  • 步骤 2:中继服务器将两端的公网信息相互传递,A 和 B 分别使用 TCP 向对方建立连接。
  • 步骤 3:由于 TCP 的连接需要三次握手,在某些 NAT 环境中,可能会导致连接建立失败,因此在实际应用中,通常会优先选择 UDP 打洞。

内网打洞的应用场景

  • 视频会议和实时语音通话:通过打洞技术,避免通过中继服务器转发流量,减少延迟,提升通话质量。
  • P2P 文件传输:在文件传输软件中,打洞技术可以使两个用户直接传输数据,而无需通过中转服务器。
  • 联机游戏:实现玩家之间的直接连接,减少延迟,提升游戏体验。
  • 物联网设备控制:在智能家居等场景中,通过打洞技术可以实现远程控制和数据传输,避免家庭路由器配置的复杂性。

内网打洞的限制

尽管内网打洞在 P2P 通信中非常有用,但它也存在一些限制:

  1. 依赖 NAT 类型:对称型 NAT 通常不支持打洞,而全锥形 NAT 支持度较高。
  2. 连接可靠性:在 NAT 设备频繁重置端口映射的情况下,连接可能会中断。
  3. 防火墙限制:某些防火墙会阻止未知的连接尝试,从而影响打洞的成功率。

内网打洞的技术实现

常见的内网打洞协议和技术包括 STUN(Session Traversal Utilities for NAT)ICE(Interactive Connectivity Establishment)

  • STUN:通过与外部服务器协作,帮助设备发现自身的公网地址和 NAT 类型,并辅助打洞。
  • ICE:提供了对多个连接候选地址的检测机制,尝试通过多种网络路径建立 P2P 连接。

打洞工具和实现

  • WebRTC:WebRTC 是一个开源框架,广泛应用于网页中的实时通信,它集成了 STUN、ICE 等技术,能够在浏览器中实现 NAT 穿透。
  • Libjingle:Google 开发的一个用于 P2P 连接的开源库,包含了 NAT 穿透功能,广泛应用于 Google Talk 和其他实时通信产品中。

内网打洞技术在 P2P 通信中起到了重要作用,通过与中继服务器配合,使内网中的设备能够直接建立连接,降低了对中继的依赖,提高了通信效率。然而,由于 NAT 类型和防火墙策略的多样性,内网打洞的实现仍然具有一定的挑战性。

相关推荐
若云止水1 分钟前
ngx_http_add_listen
网络·网络协议·http
千航@abc4 分钟前
虚拟机添加多块网卡,重启时,ip绑定错误如何解决
linux·服务器·网络·虚拟化·kvm
zru_96021 小时前
在Windows和Linux系统上的Docker环境中使用的镜像是否相同
linux·运维·docker
群联云防护小杜1 小时前
分布式节点池:群联云防护抗DDoS的核心武器
前端·网络·分布式·udp·npm·node.js·ddos
inquisiter2 小时前
SEV内存加密位linux内核设置过程
linux·运维·支持向量机
xhaoDream2 小时前
NFS客户端与服务端用户不一致问题
linux·服务器·经验分享
qq_386322693 小时前
华为网路设备学习-16 虚拟路由器冗余协议(VRRP)
学习·华为·智能路由器
车载测试工程师3 小时前
车载以太网网络测试-17【传输层-TCP】
网络·经验分享·网络协议·tcp/ip·php
熬夜敲代码的大学生4 小时前
网络基础梳理
网络
航月4 小时前
linux中VI命令的详细解释
linux·运维·服务器