网络地址转换NAT与代理服务器

NAT技术让少数公有IP地址被使用私有地址的大量主机所共享。这一机制允许远多于IP地址空间所支持的主机共享网络。同时,由于NAT屏蔽了内部网络,也为局域网内的机器提供了安全保障。

而代理服务器(Proxy Server)则实现的是网络信息的中转站。

NAT

网络地址转换(NAT,Network Address Translation)属接入广域网(WAN)技术,是一种将私有(保留)地址转化为合法IP地址的转换技术,它被广泛应用于各种类型Internet接入方式和各种类型的网络中。原因很简单,NAT不仅完美地解决了lP地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。

随着接入Internet的计算机数量的不断猛增,IP地址资源也就愈加显得捉襟见肘。事实上,除了中国教育和科研计算机网(CERNET)外,一般用户几乎申请不到整段的C类IP地址。在其他ISP那里,即使是拥有几百台计算机的大型局域网用户,当他们申请IP地址时,所分配的地址也不过只有几个或十几个IP地址。显然,这样少的IP地址根本无法满足网络用户的需求,于是也就产生了NAT技术。

何时使用NAT

由上可以知道NAT可以减少网络环境中的所需公共IP的地址需求。所以当一个组织改变其ISP(Internet服务供应商),但却不想改变其内部地址时,NAT就可以大展身手了。

以下是具体应用NAT的场景:

  • 用户需要访问Internet但主机没有全球唯一的IP地址
  • 用户更改ISP需要对网络重新编号
  • 用户需要合并地址重复的内网

实现方式

  • 静态转换:指将内部网络的私有IP地址转换为公有IP地址,IP地址对是一对一的,是一成不变的,某个私有IP地址只转换为某个公有IP地址。借助于静态转换,可以实现外部网络对内部网络中某些特定设备(如服务器)的访问。
  • 动态转换:是指将内部网络的私有IP地址转换为公用IP地址时,IP地址对是不确定的,而是随机的,所有被授权访问上Internet的私有IP地址可随机转换为任何指定的合法IP地址。当ISP提供的合法IP地址略少于网络内部的计算机数量时。可以采用动态转换的方式。
  • 端口多路复用:最为流行的NAT配置类型。通过多个源端口,将多个未登记的IP地址映射到一个合法IP地址(多到一)。使用PAT能够使上千个用户仅使用一个全局IP地址连接到Internet。从而可以最大限度地节约IP地址资源,同时,又可隐藏网络内部的所有主机,有效避免来自internet的攻击。

实现细节

当一台小型商务企业的内部网计算机用户连接到 Internet 资源时,该用户的 TCP/IP 协议产生一个 IP 数据包,该数据包包含以下值,这些值位于 IP 和 TCP 或 UDP 标头中:(粗体内容表示受 NAT 影响的项目):
  •目标 IP 地址:Internet 资源 IP 地址
  • 源 IP 地址:私有 IP 地址
  • 目标端口:Internet 资源 TCP 或 UDP 端口
  • 源端口: 源应用程序 TCP 或 UDP 端口  
  请求源主机或者其它路由器将此 IP 数据包发送给 NAT, 然后由 NAT 将向外发送的数据包的地址解析如下:  
  • 目标IP地址:Internet 资源 IP 地址
  • 源IP 地址:ISP 分配的公用地址
  • 目标端口:Internet 资源 TCP 或 UDP 端口
  • 源端口:重新映射的源应用程序TCP 或 UDP 端口  
  NAT 将重新映射的 IP 数据包发送到 Internet 。响应计算机将向 NAT 返回一个响应。当 NAT 接收到此响应时,该数据包将包含以下地址信息:
  • 目标IP 地址:ISP 分配的公用地址
  • 源IP地址:Internet 资源 IP 地址
  • 目标端口:重新映射的源应用程序 TCP 或 UDP 端口
  • 源端口:Internet 资源的 TCP 或者 UDP 端口  
  当 NAT 完成映射和解析地址后,将向 Internet 客户端发送数据包,此数据包包含以下地址信息:  
  • 目标 IP 地址:私有 IP 地址
  • 源 IP 地址:Internet 资源 IP 地址
  • 目标端口:源应用程序TCP 或者 UDP 端口
  • 源端口:Internet 资源 TCP 或 UDP 端口  
  对于向外发送的数据包,源 IP 地址和 TCP/UDP 端口号将被映射到一个公用源 IP 地址和一个可能变化的 TCP/UDP端口号。对于接收的数据包,目标 IP 地址和 TCP/UDP 端口号将被映射到私有 IP 地址和初始 TCP/UDP 端口号。

 那么,NAT转换表何时进行初始化呢,一般有三种方式:手工初始化,外发数据报时,传入名字查找。大多数NAT实现方式都使用外发数据报时初始化转换表,当内部主机通过NAT向外发送数据报时,NAT此时在转换表中创建一个表项。

优缺点

优势 不足
节约合法注册地址 转换导致交换路径延时
解决地址重叠问题 导致端到端IP地址无法追溯
提高访问internet灵活性 某些应用程序无法使用
网络变动无需地址重新编号

代理服务器

代理服务器 (Proxy) 就是以类似代理人的身份去取得用户所需要的数据。由于它的『代理』能力,使得我们可以透过代理服务器来达成防火墙功能与用户浏览数据的分析。此外,也可以藉由代理服务器来达成节省带宽的目的,以及加快内部网络对因特网的 WWW 访问速度。

Proxy

由上图可以看出,代理服务器是架设在整个局域网之上的,在局域网内部的计算机也是通过代理服务器Proxy来向Internet请求数据的。(此架构只是一个例子,Proxy还存在其他架构)。

在《鸟哥Linux私房菜》中有下面的一个例子:

假如鸟哥在我的浏览器设定了我们学校的代理服务器主机 proxy.ksu.edu.tw 做为我的 Proxy 好了,再假设我的 IP 是 120.114.141.51 ,那么当我想要取得 Yahoo 的新闻信息时,事实上,都是 proxy.ksu.edu.tw 帮我去取得的,所以在 Yahoo 的网站上面看到要求数据的人是谁呢?呵呵!当然就是 proxy.ksu.edu.tw 而不是 120.114.141.51 啰!

所以,可以看到。有了Proxy的存在,客户端向外网请求数据时,都是通过Proxy来取得的,而站在Internet角度看,请求数据的IP是Proxy的而不是客户端的IP。因此,Proxy还有了一个附带的防火墙功能,使Proxy处于网络连接的最外部。

代理服务器运行流程

下图流程表明了,代理服务器的运作方式(选自《鸟哥私房菜》,其中快取就是cache的意思):

Proxy_cache

当客户端指定了代理服务器之后,在客户端想要取得因特网上面的信息时,它是这样取得数据的 (注:那个 Cache 表示为 Proxy 服务器的硬盘的意思):

  • 当 Proxy 的快取拥有用户所想要的数据时 (Step a ~ d):
  • Client 端向 Server 端发送一个数据需求封包;
  • Server 端接收之后,先比对这个封包的『来源』与预计要前往的『目标』网站是否为可接受? 如果来源与目标都是合法的,或者说,来源与目标网站我们的 Proxy 都能帮忙取得资料时,那么 Server 端会开始替 Client 取得资料。这个步骤中比较重要的就是『比对政策』啦,有点像是认证的感觉啦;
  • Server 首先会检查自己快取 (新的数据可能在内存中,较旧的数据则放置在硬盘上) 数据, 如果有 Client 所需的数据,那就将数据准备取出,而不经过向 Internet 要求数据的程序;
  • 最后当然就是将数据回传给 Client 端啰!
  • 当 Proxy 的快取没有用户所想要的数据时 (Step 1 ~ 5):
  • Client 端向 Server 端发送一个数据需求封包;
  • Server 端接收之后,开始进行政策比对;
  • Server 发现快取并没有 Client 所需要的资料,准备前往因特网抓取数据;
  • Server 开始向 Internet 发送要求与取得相关资料;
  • 最后当然就是将数据回传给 Client 端

通过上面流程可以知道,在Proxy的cache中有新请求所需要的数据时,Proxy并不会向Internet请求,而是直接从自己的cache中拿出来,所以也给用户一种使用Proxy后网络被加速的“错觉”。所以,也可以说cache的速度决定了网络的数据传输速度,其实cache就是Proxy的硬盘,其影响直接决定了Proxy的效率。

两者的差异

  • NAT:NAT 功能主要透过封包过滤的方式, 并使用 iptables 的 nat 表格进行 IP 伪装 (SNAT) ,让客户端自行前往因特网上的任何地方的一种方式。主要的运作行为是在 OSI 七层协定的二、三、四层。由于是透过封包过滤与伪装,因此客户端可以使用的端口号码 (第四层) 较弹性;
  • Proxy:主要透过 Proxy 的服务程序 (daemon) 提供网络代理的任务,因此 Proxy 能不能进行某些工作,与该服务的程序功能有关。 举例来说,如果你的 Proxy 并没有提供邮件或 FTP 代理,那么你的客户端就是无法透过 Proxy 去取得这些网络资源。 主要运作的行为在 OSI 七层协议的应用层部分 (所谓的比较”高阶”之意)。

由此可见,NAT服务器处于较底层的网络进行分析的工作,而也只是对目标IP地址和源IP地址的修改,至于其数据报具体要干什么,NAT并不关心。Proxy的daemon的功能则决定了此代理服务器的功能。