【网络编程】之NAT技术与代理
【网络编程】之NAT技术与代理
- NAT技术
- 为什么需要NAT技术
- NAT技术原理介绍
- NAPT
- 缺陷与不足
- 代理服务器
- 正向代理
- 基本概念
- 正向代理步骤
- 正向代理典型应用
- 反向代理
- 基本概念
- 反向代理步骤
- 反向代理典型应用
- 正向代理与反向代理的区别
- 内网穿透与内网打洞
- 内网穿透
- 基本概念介绍
- 内网穿透的原理
- 内网打洞
- 基本概念介绍
- 为什么需要内网打洞
- 内网打洞的原理
NAT技术
为什么需要NAT技术
原先的网络划分(将IP地址划分为不同的类比)浪费了大量的IP地址,而由于网络的飞快发展,IP地址早就不够了,传统的网络划分不再能满足我们对ip
地址的需求,新的网络划分技术CIDR
出现。
CIDR
技术构建的互联网中,引入了私网IP的概念,而且整个互联网的边缘几乎都是由私网ip
构建的小局域网,又称之为内网,内网中IP地址可以重复,这变相的缓解了IP
地址不足的问题,但是当内网中的主机想访问公网中的服务器,可源IP
却是一个内网IP,当服务器想给主机返回报文的时候就无法返回了。
由此NAT技术应运而生。
NAT技术原理介绍
NAT技术是当代路由器的核心功能,它主要负责在进行网络通信时,将内网中的主机的源IP地址(私网IP)与当前路由器的WAN
口的IP地址不断替换,直到这个IP地址变成公网IP,简单点说,NAT技术就是将内网IP在对外进行网络通信时将其转化为公网IP、而当报文想要发送给内网中的主机时又将公网IP转化为内网IP的技术。
NAT转化过程:
-
当路由器收到来自服务器A的数据时,又会把目标IP地址从
107.150.99.145
转化为10.0.0.2
: -
为什么内网中可能有很多主机,路由器能准确的直到应该将数据帧中的IP报文的目的
IP
替换为哪一个主机的内网IP
地址的,因为路由器中维护着一张NAT转换表,动态的维护着转换信息,路由器可以解析并识别IP
报文的信息,还可以更改它的源IP/目的IP的值,所以路由器是工作在网络层。下面是一张常见的简单基础的NAT转换表:
内部私有IP | 目标外部IP |
---|---|
192.168.1.10 | 93.184.216.34 |
192.168.1.11 | 8.8.8.8 |
192.168.1.12 | 216.58.200.14 |
192.168.1.13 | 172.217.14 |
NAPT
上述NAT
技术虽然一定程度上实现了私网IP和公网IP的转换,但是NAT
转换表只是简单的存储私有IP与目的IP并不能解决所有的问题,因为有时候同一个私网中,可能存在很多主机访问同一公网服务器,这个时候公网服务器返回了报文,你应该将报文交给哪个主机呢?
由此,NAPT
技术发展,它是NAT
技术的升级版,采用地址+端口号双重映射的方式。
并且为了防止端口号重复造成和上面一样的情况,NAPT
还会动态替换源端口号,以防止源端口号重复,在报文返回的时候,会替换回原来的私网IP
地址和源端口号,下面是一个典型的NAPT
转换表:
内部私有IP:端口 | 转换后公网IP:端口 | 协议类型 | 目标外部IP:端口 | 过期时间戳 |
---|---|---|---|---|
192.168.1.10:54321 | 203.0.113.5:60001 | TCP | 216.58.200.14:443 | 1676974200 |
192.168.1.11:49152 | 203.0.113.5:60002 | UDP | 8.8.8.8:53 | 1676974150 |
192.168.1.12:54321 | 203.0.113.5:3389 | TCP | 216.58.200.14:443 | 1676974300 |
192.168.1.13:55000 | 203.0.113.5:60003 | ICMP | 172.217.14.206 | 1676974100 |
NAPT
又常常被称为动态NAT。
缺陷与不足
- 维护
NAT
转换表需要一定的成本,NAT
转换表会有溢出的风险。 - 如果
NAT
路由设备出现故障,其子网中的主机与外部的连接会直接断掉。 - 外部服务器无法直接与
NAT
中的内部主机之间建立连接(破坏端到端通信的特性,因为中间有这个NAT服务器更改了数据帧的内容),需要通过内网打洞技术。
ipv6
协议是128位,彻底解决了ip
地址不足的问题,所以ipv6
标准是明确建议不使用NAT
的。
代理服务器
正向代理
基本概念
正向代理位于客户端与服务器之间,代表客户端向服务器发送请求。实际的网络请求是代理服务器发出的,而不是客户端,所以客户端不会向服务器暴露自己真实的IP地址。
正向代理步骤
- 客户端配置通过代理服务器访问网络。
- 当客户端进行网络通信时,它首先会把网络请求发送给代理服务器。
- 代理服务器收到请求后,会代替客户端向目标服务器发送请求。
- 目标服务器将响应返回给代理服务器,代理服务器再将结果返回给客户端。
正向代理图:
正向代理典型应用
- 流量过滤:如学校或者公司的网络,通常都会部署一个代理服务器,当学生或者职员连接上网络后,请求服务会先发送给代理服务器,就可以在代理服务器中设置出站规则,比如如果访问了不合法网站(娱乐网站)就不代理了,而是发送一个
RST
报文或者重定向到警告页面。 - 匿名上网:不暴露客户端的IP地址,服务器也就不知道访问它服务的是谁。
- 缓存:当多个客户端访问某个相同的服务器的服务时,代理服务器可以将其内容进行缓存(比如视频),然后直接返回给客户端,节省带宽,提高了访问速度。
- 绕过防火墙:用户可以通过代理服务器访问被封锁的服务,用户直接访问是不允许的,因为国内有防火墙,发现目的IP如果在黑名单中会直接返回
RST
重置连接,但是通过正向代理可以实现,因为防火墙并不是封锁了所以的境外IP和端口。但是防火墙会识别你的报文的内容,如果不合规也会掐掉,所以需要使用一些加密算法。
反向代理
基本概念
反向代理和正向代理不同,反向代理服务的对象是服务器,而正向代理它服务的对象是客户端,反向代理位于客户端和一组内部服务器之间,对于客户端来说,反向代理服务器就像是服务器本身,对于内部服务器来说,所有的请求都来自反向代理服务器。
反向代理步骤
- 客户端向反向代理服务器发送网络请求。
- 反向代理服务器在接收到网络请求后,按照预定的规则再决定将请求发送发送给哪个后端服务器。
- 该后端服务器将请求报文处理后将响应报文发送给反向代理服务器。
- 反向代理服务器再将响应报文返回给客户端,就像它是原始的服务器一样。
反向代理典型应用
-
负载均衡:反向代理服务器可以检测后端服务器的空闲情况(负载均衡算法),然后再决定将请求交给哪个后端服务器处理,优化资源利用,提高响应速度和服务质量。
-
安全性:不直接暴露后端服务器的
IP
地址,增加一层防护,增强了服务器的安全性。 -
缓存:反向代理服务器也可以缓存静态内容,减轻后端服务器的压力。
-
高可用性:如果某个后端服务器崩溃,反向代理服务器可以将其更换,保证服务可以继续进行。
正向代理与反向代理的区别
核心区别:
特性 | 正向代理 | 反向代理 |
---|---|---|
代理对象 | 客户端(用户) | 服务端(服务器) |
用户感知 | 客户端主动配置代理 | 客户端无感知 |
主要用途 | 隐藏客户端身份/突破访问限制 | 隐藏服务器/负载均衡/缓存 |
典型场景 | 翻墙、公司内网访问控制 | 网站负载均衡、CDN、HTTPS终结 |
请求方向 | 客户端 → 代理 → 目标服务器 | 客户端 → 代理 → 真实服务器 |
生活场景类比:
- 正向代理:
类似“中介租房” —— 你(客户端)通过中介(代理)联系房东(服务器),房东不知道你的真实身份。 - 反向代理:
类似“酒店前台” —— 客人(客户端)找前台(代理)点名要某个服务,前台背后可能有多个服务员(真实服务器)处理请求,客人不知道具体是谁服务的。
内网穿透与内网打洞
内网穿透
基本概念介绍
内网穿透是一种技术,它允许从某一个私网中间接的访问另一个私网中的设备或服务,由于NAT技术的存在,我们无法直接访问它,只能通过外部服务器间接的访问它,这种技术非常有用,如果你需要从互联网中访问处于家庭网络(内网)中的摄像头设备。
内网穿透的原理
内网穿透的基本思想是在内网和外网中建立一条双向通信的通道。它有很多种不同的实现方式,下面我们来介绍一种常见的实现方式:隧道技术。
通过SSH隧道、GRE隧道或者专门的软件如Ngrok、FRP(Fast Reverse Proxy)等创建加密的安全通道。这种方法不仅能够穿透NAT,还能提供额外的安全性。
内网穿透原理图:
内网打洞
基本概念介绍
内网打洞是一种常见的网络技术,用于在两个NAT
网络中的子网设备间建立点对点的连接。这种技术常用于P2P(Peer-to-Peer)应用中,比如在线游戏、VoIP(如Skype)、文件共享等场景,允许这些应用穿透NAT或防火墙,实现直接通信。
为什么需要内网打洞
大多数家庭网络和小型办公室都使用NAT
技术,这使得内部网络中的设备使用私网IP,并通过一个公网IP访问互联网。这意味着如果通信双方都在NAT
之后,则它们必须通过外部服务器进行通信,而无法进行直接的访问,因为它们都无法知道对方的公网IP。内网打洞旨在解决上述问题,实现通信双方即使都在NAT之后,也能进行直接通信。
内网打洞的原理
常见的内网打洞分为UDP打洞、TCP打洞和STUN/TURN服务器。
我们下面介绍UDP打洞:
- 假设A、B双方想要通信,它们需要向一台已知的公网服务器发送UDP数据包。
- 公网服务器记录下它们对应的外网IP地址和端口号(经过NAT转换的),然后分别告知对方。
- 尝试直接连接:然后,A和B分别根据从服务器获得的信息直接向对方的映射地址发送UDP数据包。此时,NAT设备会在其映射表中为每个新的“传出”连接创建一个新的条目,允许相应的“传入”流量通过。
UDP打洞成功的条件:NAT设备允许内部主机之前未访问过的IP地址向它发送报文。有一些NAT设备为了安全考虑并不允许。