个人主页:C++忠实粉丝
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C++忠实粉丝 原创计算机网络之NAT、代理服务、内网穿透、内网打洞
收录于专栏【计算机网络】
本专栏旨在分享学习计算机网络的一点学习笔记,欢迎大家在评论区交流讨论💌
目录
NAT 技术背景
NAT IP 转换过程
NAPT
NAT 技术的缺陷
代理服务器
正向代理
反向代理
区分正向代理和反向代理
NAT 和代理服务器
内网穿透
内网打洞
内网穿透与内网打洞的区别
NAT 技术背景
之前我们讨论了,IPv4 协议中,IP 地址数量不充足的问题
NAT 技术当前解决 IP 地址不够用的主要手段,是路由器的一个重要功能;
NAT 能够将私有 IP 对外通信时转为全局 IP。也就是一种将私有 IP 和全局 IP 互相转化的技术方法
很多学校、家庭、公司内部采用每个终端设置私有 IP,而在路由器或必要的服务器上设置全局 IP;
全局 IP 要求唯一,但是私有 IP 不需要;在不同的局域网中出现相同的私有 IP 是完全不影响的;
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.221.120.9 发送数据时就会生成表中的映射关系;
NAPT
那么问题来了,如果局域网内,有多个主机都访问同一个外网服务器,那么对于服务器返回的数据中,目的 IP 都是相同的,那么 NAT 路由器如何判定将这个数据包转发给哪个局域网的主机?
这时候 NAPT 来解决这个问题了。使用 IP + port 来建立这个关联关系
这种关联关系也是由 NAT 路由器自动维护的。例如在 TCP 的情况下,建立连接时,就会生成这个表项;在断开连接后,就会删除这个表项。
NAT 技术的缺陷
由于 NAT 依赖这个转换表,所有有诸多限制;
无法从 NAT 外部向内部服务器建立连接;
装换表的生成和销毁都需要额外开销;
通信过程中一旦 NAT 设备异常,即使存在热设备,所有的 TCP 连接也都会断开
代理服务器
正向代理
概述:
正向代理 (Forward Proxy)是一种常见的网络代理方式。它位于客户端的目标服务器之间,代表客户端向目标服务器发送请求。正向代理服务器接收客户端的请求,然后将请求转发给目标服务器,最后将目标服务器的响应返回给客户端。通过这种方式, 正向代理可以实现多种功能,如提高访问速度、隐藏客户端身份、实施访问控制等。
工作原理
客户端将请求发送给正向代理服务器。
正向代理服务器接收请求,并根据配置进行处理,如缓存查找、内容过滤等。
正向代理服务器将处理后的请求转发给目标服务器。
目标服务器处理请求,并响应返回给正向代理服务器。
正向代理服务器将响应返回给客户端。
功能特点
缓存功能:正向代理服务器可以缓存经常访问的资源,当客户端再次请求这些资源时,可以直接从换从种获取,提高访问速度
内容过滤:正向代理可以根据预设的规则对请求或响应进行过滤,如屏蔽广告、阻止恶意网站等。
访问控制:通过正向代理,可以实现对特定网站的访问控制,如限制员工在工作时间访问娱乐网站。
隐藏客户端身份:正向代理可以隐藏客户端的真是 IP 地址,保护客户端的隐私。
负载均衡
场景应用
企业网络管理:企业可以通过正向代理实现对员工网络访问的管理和控制,确保员工在工作时间内专注于工作,避免访问不良网站或泄露公司机密。
公共网络环境:在公共场所如图书馆,学校等提供的网络环境中,通过正向代理可以实现对网络资源的合理分配和管理,确保网络使用的公平性和安全性。
内容过滤于保护:家长可以通过设置正向代理来过滤不良内容,保护孩子免受网上的不良信息影响。
提高访问速度:对于经常访问的网络或资源,正向代理可以通过缓存机制提高访问速度,减少网络延迟。
跨境电商与海外访问:对于跨境电商或需要访问海外资源的企业和个人,正向代理可以帮助他们突破网络限制,顺利地访问海外网站和资源。
反向代理
概述
反向代理服务器是一种网络架构模式,其作为 Web 服务器的前置服务器,接收来自客户端的请求,并将这些请求转发给后端服务器,然后将后端服务器的响应返回给客户端。这种架构模式可以提升网站的性能、安全性和可维护性等。
基本原理
反向代理服务器位于客户端和 Web 服务器之间,当客户端发起请求时,它首先会到达反向代理服务器。反向代理服务器会根据配置的规则将请求转发给后端的 Web 服务器,并将 Web 服务器的响应返回给客户端。这个过程中,客户端并不知道实际与哪个 Web 服务器进行了交互,它只知道与反向代理服务器进行了通信。
应用场景
负载均衡:反向代理服务器可以根据配置的负载均衡策略,将客户端的请求分发到多个后端服务器上,以实现负载均衡。这有助于提升网站的整体性能和响应速度,特别是在高并发场景下。
安全保护:反向代理服务器可以隐藏后端 Web 服务器的真实 IP 地址,降低其被直接攻击的风险。同时,它还可以配置防火墙、访问控制列表(ACL)等安全策略,对客户端的请求进行过滤和限制,以保护后端服务器的安全。
缓存加速:反向代理服务器可以缓存后端 Web 服务器的响应内容,对于重复的请求,它可以直接从缓存中返回响应,而无需再次向后端服务器发起请求。这可以大大减少后端服务器的负载,提升网站的响应速度。
内容过滤和重写:反向代理服务器可以根据配置的规则对客户端的请求进行过滤和重写,例如添加或删除请求头、修改请求路径等。这有助于实现一些特定的业务需要,如URL 重写,用户认证等。
动静分离:在大型网站中,通常需要将静态资源和动态资源分开处理。通过将静态资源部署在反向代理服务器上,可以直接从反向代理服务器返回静态资源的响应,而无需再次向后端服务器发起请求。这可以大大提升静态资源的访问速度。
CDN(Content Delivery Network,内容分发网络)就是采用了反向代理的原理。
区分正向代理和反向代理
花王尿不湿是一个很经典的尿不湿品牌, 产自日本. 我自己去日本买尿不湿比较不方便, 但是可以让我在日本工作的表姐去超市买了快递给我. 此时超市看到的买家是我表姐, 我的表姐就是 "正向代理"; 后来找我表姐买尿不湿的人太多了, 我表姐觉得天天去超市太麻烦, 干脆去超市买了一大批尿不湿屯在家里, 如果有人来找她代购, 就直接把屯在家里的货发出去,而不必再去超市. 此时我表姐就是 "反向代理"
正向代理用于请求的转发(例如借助代理绕过反爬虫)。
反向代理往往作为一个缓存。
NAT 和代理服务器
路由器往往都具备 NAT 设备的功能,通过 NAT 设备进行中转,完成子网设备和其他子网设备的通信过程。
代理服务器看起来和 NAT 设备有一点像,客户端向代理服务器发送请求,代理服务器将请求转发给真正要请求的服务器;服务器返回结果后,代理服务器又把结果回传给客户端。
那么 NAT 和代理服务器的区别有哪些呢?
从应用上讲,NAT 设备时网络基础设备之一,解决的是 IP 不足的问题,代理服务器则是更贴近具体应用,比如通过代理服务器进行 fq,另外像迅游这样的加速器,也是使用代理服务器。
从底层实现上讲,NAT 是工作在网络层,直接对 IP 地址进行替换,代理服务器往往工作在应用层。
从使用范围上讲,NAT 一般在局域网的出口部署,代理服务器可以在局域网做,也可以在广域网做,也可以跨网。
从部署位置上看,NAT 一般集成在防火墙,路由器等硬件设备上,代理服务器则是一个软件程序,需要部署在服务器上。
代理服务器是一种应用比较广的技术。
fq:广域网中的代理
负载均衡:局域网中的代理
内网穿透
概念:
内网穿透(NAT穿透)是指在内网环境下,由于网络地址转换(NAT,Network Address Translation)机制的存在,使得局域网中的设备不能直接被外部网络访问的情况下,如何让外部网络访问到内网设备的技术。
为什么需要内网穿透?
在家庭或公司中,很多设备(如计算机、路由器、摄像头等)都在内网(局域网)中,这些设备的IP地址通常是私有IP地址,如192.168.x.x、10.x.x.x等,而公网IP通常是唯一的。NAT技术使得内网设备共享一个公网IP,外界无法直接访问这些内网设备。内网穿透的目标就是通过某些技术手段,实现外部设备能够访问到内网设备。
内网穿透的常见场景
远程访问:如远程桌面、SSH访问内网服务器。
P2P连接:某些P2P应用(如视频通话、文件共享)需要穿透NAT来建立连接。
IoT设备管理:通过手机或PC远程访问家中的智能设备(如监控摄像头、家居控制系统等)。
游戏联机:很多多人在线游戏使用内网穿透来实现玩家之间的直接对战。
内网穿透的工作原理
内网穿透通常有三种主要方式:端口映射、反向代理、第三方中转服务器。
1. 端口映射(Port Mapping)/端口转发(Port Forwarding)
端口映射是通过路由器或防火墙将公网IP的某些端口转发到内网设备的对应端口。这个方法要求配置路由器或防火墙。
外部设备访问公网IP的特定端口。
路由器根据预设规则将数据包转发到内网设备的指定IP和端口。
例如,家庭路由器将公网IP的8080端口映射到内网服务器的192.168.1.100:80端口,那么外部访问公网IP的8080端口就会被转发到内网的HTTP服务。
这种方式的局限性是:
公网IP的端口需要显式地配置转发规则。
如果公网IP为动态分配的(如ADSL拨号上网),公网IP会变化,可能需要使用动态DNS。
2. 反向代理(Reverse Proxy)
反向代理是指外部设备通过一个中介服务器(通常是公网服务器)来访问内网设备。内网设备通过主动连接外部服务器,将流量转发回来。
内网设备与公网服务器建立一个持久的连接(通常使用WebSocket、HTTP长连接等技术)。
外部设备访问公网服务器,通过反向代理服务器转发请求到内网设备。
常见的反向代理工具有 nginx、Apache、HAProxy 等。
这种方法的优点是:
不需要更改内网设备的配置。
比较安全,因为内网设备并不直接暴露给外部网络。
3. 第三方中转服务器(STUN/TURN/ICE、frp、ngrok等)
这类技术通过借助外部的中转服务器来实现内网穿透。外部设备通过这些中转服务器间接连接到内网设备。
STUN(Session Traversal Utilities for NAT):一种用于NAT穿透的协议,帮助内网设备发现自己的公共IP地址和NAT类型。
TURN(Traversal Using Relays around NAT):当STUN无法穿透NAT时,使用中继服务器转发数据流。
ICE(Interactive Connectivity Establishment):用于WebRTC中的一种穿透技术,它结合了STUN和TURN。
frp(Fast Reverse Proxy):一个高效的反向代理工具,支持内网穿透。
ngrok:一个知名的内网穿透服务,提供简单易用的穿透解决方案。
frp和ngrok的工作原理通常是:
用户在外网服务器上启动一个客户端程序,建立与外网服务器的连接。
内网设备通过该连接将数据发送到外网服务器。
外部用户通过访问外网服务器的特定端口或域名,间接访问到内网设备。
这种方法通常不需要用户手动配置路由器,且对内网设备没有高要求,简单易用。它们适合开发者、临时访问和测试等场景。
内网穿透的优缺点
优点:
简便性:对于普通用户,尤其是没有技术背景的人,内网穿透工具(如ngrok)通常提供开箱即用的解决方案,配置简单,操作方便。
跨越防火墙与NAT:通过这些技术,用户可以绕过公司、家庭路由器的NAT和防火墙,直接从外部访问内网设备。
避免公网IP暴露:通过中转服务器、反向代理等方式,内网设备可以不直接暴露公网IP,增强安全性。
缺点:
性能问题:依赖中转服务器时,所有数据需要经过中继服务器转发,可能会导致延迟增高、带宽限制等性能问题。
安全隐患:如果内网穿透配置不当,容易导致内网设备暴露,可能带来安全风险(如黑客攻击、数据泄露等)。
依赖第三方服务:如果使用ngrok、frp等第三方服务,可能会受到服务稳定性、流量限制等问题的影响。
不适合大规模应用:对于企业级应用,频繁的外部访问可能导致服务的稳定性和安全性下降,需额外的专业配置和监控。
内网打洞
内网打洞(NAT打洞)是一种通过NAT(网络地址转换)设备建立两个内网或NAT后的设备之间直接连接的技术。它通常用于解决NAT环境下,内网设备无法直接相互通信的问题。内网打洞技术常用于P2P(点对点)通信、远程访问、视频通话、文件共享等应用场景。
为什么需要内网打洞?
在许多家庭或企业的网络环境中,设备(如计算机、服务器、智能设备等)都处于NAT后的局域网(LAN)中,而这些设备使用的是私有IP地址(如192.168.x.x、10.x.x.x等)。NAT设备(如路由器、防火墙)将多个内网设备共享一个公网IP地址,外部设备无法直接访问内网设备。
在这种情况下,两个内网设备需要建立直接的连接进行数据交换时,若没有合适的机制,它们会遇到以下问题:
无法直接连接:NAT设备会阻止内网设备直接向公网发起连接,无法形成双向连接。
无法通信:由于公网IP和端口的转换,两个设备之间的连接建立变得困难。
内网打洞的目标就是通过一定的技术手段,使得两个内网设备能够通过NAT设备建立直接连接,避免中转服务器的性能瓶颈和安全隐患。
内网打洞的基本原理
内网打洞技术通过让设备借助公网服务器(如STUN服务器、TURN服务器)来实现彼此之间的连接。具体过程通常包括以下几个步骤:
NAT设备的特性:内网设备通过NAT路由器向外部公网发起请求,NAT路由器会为这些连接分配一个公网端口,并保持映射关系。这个过程称为NAT的“映射”。
使用STUN服务器进行NAT类型检测:每个内网设备都首先通过一个STUN服务器(Session Traversal Utilities for NAT)检测自己所在的NAT类型,并得知自己外部可访问的公共IP和端口。这一过程让内网设备知道如何在NAT环境中“暴露”自己。
相互发现与协作:两个内网设备在与STUN服务器交互后,可以通过交换自己的公网IP地址和映射的端口信息,尝试与对方建立连接。这一过程称为“打洞”,即设备在NAT中“打通”一条通道,允许流量通过。
建立直接连接:两个设备通过NAT路由器或防火墙的“映射”端口,发起相互的连接请求。如果NAT路由器的配置允许它们建立直接的连接,则数据流可以直接传输,而无需经过中继服务器。
内网打洞的过程举例
假设有两个内网设备:A和B,它们分别位于不同的网络(可能经过不同的NAT设备)。为了使得这两个设备能够直接通信,通常会通过以下步骤:
A和B都连接到一个公网STUN服务器,该服务器能够告知A和B的公共IP地址和端口。
A和B交换各自的公共IP和端口信息,例如,A通过STUN服务器知道它的公网IP是 203.0.113.1,端口是 12345,B的公网IP是 203.0.113.2,端口是 54321。
A和B相互尝试建立连接,它们分别向对方的公网IP和端口发送数据包。由于NAT的机制,它们的路由器可能会允许这个连接建立。
如果双方都能够成功发送数据并接收到响应,则两个设备之间的直接通信通道就建立起来了。这时,数据流就可以通过NAT设备直接传输,而不再依赖中转服务器。
内网打洞的技术实现
内网打洞的实现主要依赖以下几种技术和协议:
STUN(Session Traversal Utilities for NAT)
STUN是NAT穿透的基础协议,它的作用是帮助设备获取其在公网中的公共IP和端口信息,并检测NAT的类型。STUN协议通过向STUN服务器发送请求,返回一个公网IP和端口,使得设备知道如何在NAT环境中进行通信。
STUN的工作原理:
内网设备向STUN服务器发起请求。
STUN服务器返回该设备的公网IP和端口(通过NAT设备的映射)。
内网设备得到公网信息后,能够与其他设备建立连接。
TURN(Traversal Using Relays around NAT)
TURN是STUN的补充方案,当STUN无法穿透NAT时,TURN提供中继服务器,帮助数据通过中继服务器进行转发。虽然TURN能确保通信的成功,但它会导致较高的延迟和带宽消耗,因此通常只在STUN无法使用时才会启用。
ICE(Interactive Connectivity Establishment)
ICE是一个综合性的协议,结合了STUN和TURN技术,旨在通过各种方式在NAT设备后建立可靠的连接。ICE广泛应用于WebRTC(网页实时通信)中,它通过多种连接策略和回退机制确保在复杂的NAT环境下建立连接。
UPnP(Universal Plug and Play)和NAT-PMP(NAT Port Mapping Protocol)
这两种协议可以让内网设备请求路由器将特定端口映射到外网,帮助内网设备穿透NAT。UPnP和NAT-PMP的缺点是它们需要路由器支持,且存在安全隐患,因为它们允许设备自行更改路由器的端口映射配置。
内网打洞的应用场景
内网打洞技术广泛应用于以下领域:
P2P(点对点)通信
文件共享:如BitTorrent协议的文件下载,文件节点之间通常需要通过内网打洞技术建立直接连接。
视频通话:例如WebRTC,支持音视频通话的应用通常利用内网打洞技术建立端对端连接,减少延迟和带宽消耗。
在线游戏
很多在线游戏中的多人联机模式使用内网打洞技术来实现玩家之间的直接对战,减少服务器负载并提高游戏体验。
远程访问
远程桌面、SSH等应用可以通过内网打洞技术让外部设备访问内网设备。
物联网(IoT)
一些智能设备和摄像头等IoT设备,常通过内网打洞技术实现远程控制和监控。
内网打洞的优缺点
优点:
直接连接:通过内网打洞,设备可以直接建立连接,减少了数据传输的延迟和中转服务器的带宽消耗。
节省资源:避免了中继服务器的使用,减轻了服务器的负担,尤其是带宽和计算资源的消耗。
适用于P2P场景:非常适合P2P通信,如文件共享、即时通讯、在线游戏等。
缺点:
NAT类型影响:NAT的类型不同,穿透的难易程度也不同。一些高级的NAT(如对称NAT)可能会阻止内网打洞的建立。
依赖STUN/TURN服务器:尽管STUN协议能帮助打洞,但对于某些复杂的NAT环境,仍然需要TURN服务器作为中继,这会增加延迟和带宽消耗。
安全隐患:内网打洞技术可能带来安全风险,若配置不当,容易暴露内网设备的端口,导致潜在的网络攻击。
内网穿透与内网打洞的区别
内网穿透和内网打洞是两种常用于解决NAT(网络地址转换)环境下内网设备之间通信问题的技术。虽然它们的目标相似,但实现方式和适用场景有所不同。下面详细对比这两者的区别:
1. 定义与核心原理
内网打洞(NAT打洞):
核心原理:内网打洞是一种通过NAT设备(如路由器、防火墙)建立直接连接的技术。设备通过公网服务器(如STUN、TURN服务器)交换信息,然后尝试通过各自的NAT映射端口进行直接连接。这种方法依赖于NAT设备的映射机制,通常用于P2P(点对点)通信。
工作方式:设备通过STUN服务器获知公网IP和端口后,直接尝试连接对方的公网IP和端口。如果NAT路由器允许,通信就可以直接通过NAT打洞成功建立。
内网穿透:
核心原理:内网穿透是一种更为通用的技术,用于在内网与公网之间建立连接。它可以通过多种方法(如端口映射、反向代理、中继服务器等)实现设备间的通信。内网穿透不一定要求使用打洞,且更广泛地包含了通过外部服务器中转通信的方式。
工作方式:内网穿透包括但不限于使用NAT打洞。它还可以通过外部服务器进行数据转发,或者通过VPN、代理等方式绕过NAT限制,允许外部设备访问内网服务。
2. 实现方式
内网打洞的实现方式:
通过STUN服务器检测设备的公网IP和端口信息,并尝试通过NAT设备的映射关系建立直接连接。
如果打洞成功,通信数据通过NAT映射的端口直接在内网设备之间传输,无需经过外部服务器。
主要用于P2P通信,如VoIP、即时通讯、在线游戏、视频通话等。
内网穿透的实现方式:
NAT打洞:当NAT环境适合打洞时,内网穿透可以通过打洞技术直接建立连接。
端口映射:在一些路由器中,设备可以通过UPnP或手动配置端口转发来将内网端口映射到公网端口,使外部设备可以访问内网设备。
反向代理:使用外部服务器作为中介,内网设备通过反向代理或VPN等方式将请求转发到内网设备。
中继服务器:如果直接连接不可行,内网穿透可以通过中继服务器(如TURN服务器)来转发数据,保证设备之间的通信。
3. 适用场景
内网打洞:
适用于点对点通信,如P2P协议、VoIP、视频通话等需要直接建立设备间通信的场景。
典型应用:WebRTC(网页实时通信)、P2P文件共享、在线游戏中的玩家直接连接等。
对NAT类型要求较高,对于某些对称NAT(Symmetric NAT)类型的路由器,打洞可能会失败。
内网穿透:
适用于更广泛的场景,不仅限于P2P通信,还可以用于远程控制、内网访问等情况。
典型应用:远程桌面(如VNC、RDP)、远程访问家庭网络或企业局域网、通过VPN或反向代理访问内网服务等。
更灵活,不局限于NAT类型,能够通过中继服务器、端口映射等方式实现穿透。
4. 安全性
内网打洞:
优点:如果成功打洞,通信速度快,因为数据直接传输,不需要中继服务器转发。
缺点:安全性可能存在问题,尤其是当设备与外部设备直接连接时。打洞过程中需要保证NAT设备的配置正确,否则可能暴露设备的端口,存在一定的安全风险。
内网穿透:
优点:可以通过安全的中继服务器、VPN或反向代理等方式保护内网设备,避免暴露内网IP和端口。
缺点:需要依赖中继服务器或代理,可能增加延迟和带宽消耗。
5. 可靠性与适应性
内网打洞:
适合特定类型的NAT设备(如对称NAT或全锥形NAT)可能无法成功打洞。
对NAT类型有较高要求,因此在一些复杂的NAT环境下,打洞失败的可能性较高。
内网穿透:
更具适应性,支持多种方式,如通过中继服务器、端口映射、VPN等,可以适应各种复杂的网络环境。
更加可靠,可以在NAT打洞无法完成时,使用其他方法(如TURN服务器或VPN)确保连接。
6. 性能差异
内网打洞:
优点:打洞成功后,通信数据直接在内网设备之间传输,延迟低、带宽消耗少,通信效率高。
缺点:如果打洞失败,需要依赖中继服务器,可能导致延迟增加。
内网穿透:
优点:对于复杂的NAT环境,内网穿透可以保证连接的建立,灵活性高。
缺点:如果依赖中继服务器或反向代理,可能会导致更高的延迟和带宽消耗。
7. 复杂性
内网打洞:
实现相对复杂,需要STUN、TURN等协议的支持,而且打洞过程可能会失败,因此需要实现多种回退机制。
内网穿透:
实现更为复杂,因为它包括了多种方法,如端口映射、VPN、中继服务器等,适用于更复杂的网络拓扑。