SHIHUC

好记性不如烂笔头,还可以分享给别人看看! 专注基础算法,互联网架构,人工智能领域的技术实现和应用。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

NAT,网络地址转换详解

Posted on 2016-01-17 17:39  shihuc  阅读(2100)  评论(0编辑  收藏  举报

这个技术,是一个非常成熟的技术了,但是,为了将其弄得清楚点,体系点,也为了备忘,还是有必要在这里梳理一下!

 

NAT:Network Address Translation. 这个主要是用在网络地址(IP)需要改变的地方。典型的应用场景就是内网IP和公网IP之间的通信。

 

NAT的工作原理,其实还是很简单的:将IP 数据包头中的IP 地址转换为另一个IP 地址的过程。在实际应用中,NAT 主要用于实现私有网络访问公共网络的功能。这种通过使用少量的公有IP 地址代表较多的私有IP 地址的方式,将有助于减缓可用的IP地址空间的枯竭。实际使用过程中,又分为静态,动态,以及端口复用等三种形式。

 

静态:也就是内网IP地址和某个公网IP地址之间是一个固定的绑定关系,不管有没有数据交互,他们之间都是固定存在映射关系的。这种静态绑定的好处就是可以实现外部网络对内网某些特定服务器或设备的访问。不足在于,这个公网IP可能就存在资源浪费。

动态:是指将内部网络的私有 IP 地址转换为公用 IP 地址时, IP 地址是不确定的,是随机的,所有被授权访问上 Internet 的私有 IP 地址可随机转换为任何指定的合法 IP 地址。也就是说,只要指定哪些内部地址可以进行转换,以及用哪些合法地址作为外部地址时,就可以进行动态转换。动态转换可以使用多个合法外部地址集。当 ISP提供的合法 IP 地址略少于网络内部的计算机数量时。可以采用动态转换的方式。

端口复用(PAT):是指改变外出数据包的 源端口 并进行端口转换,即端口地址转换 ( PAT , Port AddressTranslation). 采用端口多路复用方式。内部网络的所有主机均可共享一个合法外部IP地址实现对Internet 的访问,从而可以最大限度地节约IP地址资源。同时,又可隐藏网络内部的所有主机 ,有效避免来自 internet 的攻击。这种使用方式是目前相对使用较多的方式。

 

静态,有时候相当于动态的一个子集。比如内部多个IP转换为外部的一个IP。或者内部只有一个IP转换为多个外部IP中的某个(当然,这种情况通常不存在,因为这么做找不到其价值,公网IP是要钱的啊。。。)

 

对于单个内网IP道外网IP的NAT过程,就不做过多介绍,这个比较简单,容易理解。他们之间存在一对一的简单映射关系。这里,主要说的是,内网主机很多,不是一个,比如有5个,而外网IP(能够访问公网的IP)只有1个,那么这5个内网主机如何通过这个公网IP上网呢?这个时候,PAT就派上用场了。

通常,这个公网IP会配置给网关或者路由器上,让其和Internet互联,而内部的主机,则通过交换机或者直接连接到路由器的LAN端口上。为了将这个场景的问题描述清楚,举个例子,当内网主机A(A1:192.168.100.20)访问163主页,唯一的一个公网IP配置在网关G(设地址为A2)上。

先说从内部向外部发送请求:当A的请求IP数据包到达网关G时,网关G将收到的IP请求数据包中源IP(即A的内网IP)地址转换为自己的网关IP(就是那个唯一的一个公网IP)地址,让后将请求数据包中的源端口号P1转换为一个随机的没有被用到的端口号P2,然后再将数据包转发到公网上去。这里,之所以修改源端口号,就是为了区分内网其他的主机的请求的。这时,存在一个新的映射关系,即A1:P1 vs A2:p2.

再说外部请求给予了相应的过程:假设这个相应的数据包已经到达网关G了,网关就要将这个数据做反向地址转换。即将数据包中目的地址为A2端口号为P2的数据包做地址转换,将其目的地址转换为A1,目的端口号转换为P1,然后再发向与A1:P1对应的进来时的物理端口,完成数据的转发。

 

这里,我要再解释下,为何要引入源(响应数据时则是目的端口)端口的转换,主要是为了正确的将响应的数据准确的转发回来。如果不做端口转换时,比如某个时候,有2个内网主机(H1,H2)都向外网发起访问,都是80的HTTP请求(假设他们请求中源端口分别为HP1,HP2),H1访问的是163,另一个访问的是sina,不做端口映射时,数据包出去时的源IP和端口分别为A2:HP1和A2:HP2。相应的数据包中目的IP和目的端口号当然也是A2:HP1和A2:HP2了,毫无疑问(若不理解,则请自己google一下IP通信中IP地址和端口号的使用原理)。到这里,读者可能会说,这有什么问题呢?呵呵,当然不会绝对的发生问题,但是,若HP1和HP2相同了,会发生什么情况?网关这个时候是不是不知道收到的响应数据包该往哪个内网主机发了,对不对???所以,网关做端口的转换,就是用来维护请求出去和响应进来的数据包之间的映射匹配关系的。

 

NAT的过程,主要是IP(以及端口)的转换过程。当然,有人会说,网关收到数据做转发的时候,同样也修改了MAC地址。说的没错,MAC地址是链路层的地址,IP通信过程中,只要涉及到物理端口的变迁,都涉及到MAC地址的变化,这个变化都是源MAC地址被改变。而这个不是NAT的特性,是IP通信的特性,不要混淆了!

 

也许还有人会问,为何要做地址转换?比如,内部请求时。试想下,不转换,请求可以出去,没有问题,但是你想过没有,响应数据如何回来?内网IP是在公网的IP通信过程中不被认知的。不做NAT,这就等于买了一张去往火星的单程票,去的了,回不来啊!

 

另外,基本常识,在这里需要说说的是MAC地址是链路层的地址,交换机访问域里面通信的地址,交换机端口学习以及生成树等都需要这个地址哟。IP地址是网络层的地址,也就是常熟的层三的地址,是路由逻辑的输入哟。端口这个概念,是传输层的东西哟,比如TCP或者UDP等才有这个概念,其他的常说的HTTP协议默认用的是80端口,哎,HTTP是应用层的协议,他是要依托TCP来传递数据的,所以啊,这个默认的80真正意义上指的是传输层的端口号。。

 

总结上面的地址转换,可以分为源地址转换(SNAT)和目的地址转换(DNAT).他们只是方向上的不同,但应用场合也完全不同。

这里,说下,NAT如何配置,主要是在网关上配置iptables的nat表。当然也可以用ip指令配置。这里用iptables指令说明如何操作。

SNAT(典型的场合:如前面说的多内网IP的主机共享一个公网IP上网),假设:内网IPs为192.168.100.0/24,外网IP为54.168.100.101且端口为2000至5000范围内,网关上配置iptables:

iptables -t nat -A POSTROUTING -p tcp -s 192.168.100.0/24 --dport 80 -o eth0 -j SNAT --to-source 54.168.100.101:2000-5000

DNAT(典型的应用就是负载均衡):例如将所有的要去向100.10.10.10的请求,转向到IP为200.10.20.30~40的主机群。网关上配置的iptables如下:

iptables -t nat -A PREROUTING -d 100.10.10.10 -i eth1 -j DNAT --to-destination 200.10.20.30-200.10.20.40

注意:iptables表中的nat表,POSTROUTING只能用在SNAT这个target中,而PREROUTING这个chain只能用在DNAT这个target中.

 

这里附录上SNAT及DNAT配置相关的常用命令选项:

-j SNAT:源网络地址转换,SNAT就是重写包的源地址
-j SNAT --to-source ipaddr[-ipaddr][:port-port]

-j DNAT:目的网络地址转换,DNAT就是重写包的目的地址
-j DNAT --to-destination ipaddr[-ipaddr][:port-port]


ipaddr:

  • a single new source/destination IP address
  • range of IP addresses
  • or you can add several --to-source/--to-destination options. a simple round-robin takes place between these adresses.

port range(only valid if the rule also specifies -p tcp or -p udp). If no port range is specified, then source/destination ports below 512 will be mapped to other ports below 512.

 

 

到这里,NAT的原理及应用,应该说的差不多了。关于iptables的工作原理,可以参考我前面的博文。