NAT,网络地址转换,该技术是为了应对IPv4地址耗尽的问题而产生的。他的产生几乎使IPv4起死回生。在IPv4已经被认为行将结束历史使命之后近20年时间里,人们几乎忘了IPv4的地址空间即将耗尽这样一个事实。

IPv4地址的划分

在弄明白NAT的具体功能前,我们先来看一看IPv4地址的划分。



iptables nat性能_NAT


IPv4协议为了路由和管理方便,43亿的地址空间被按照不同前缀长度划分为A,B,C,D类地址网络和保留地址。其中,A类网络地址127段,每段包括主机地址约1678万个。B类网络地址16384段,每段包括65536个主机地址。


RFC1918规定了三个保留地址段落:10.0.0.0-10.255.255.255;172.16.0.0-172.31.255.255;

192.168.0.0-192.168.255.255。这三个范围分别处于A,B,C类的地址段,不向特定的用户分配,被IANA作为私有地址保留。这些地址可以在任何组织或企业内部使用,和其他Internet地址的区别就是,仅能在内部使用,不能作为全球路由地址。这就是说,出了组织的管理范围这些地址就不再有意义,无论是作为源地址,还是目的地址。对于一个封闭的组织,如果其网络不连接到Internet,就可以使用这些地址而不用向IANA提出申请,而在内部的路由管理和报文传递方式与其他网络没有差异。

SNAT:源IP地址转换

平时说起NAT,一般指的是SNAT。

对于有Internet访问需求而内部又使用私有地址的网络,就要在组织的出口位置部署NAT网关,在报文离开私网进入Internet时,将源IP替换为公网地址,通常是出口设备的接口地址。一个对外的访问请求在到达目标以后,表现为由本组织出口设备发起,因此被请求的服务端可将响应由Internet发回出口网关。出口网关再将目的地址替换为私网的源主机地址,发回内部。这样一次由私网主机向公网服务端的请求和响应就在通信两端均无感知的情况下完成了。依据这种模型,数量庞大的内网主机就不再需要公有IP地址了。

DNAT:目的IP地址转换

DNAT主要有两大用处

1、发布内部服务器,让外面的internet用户能访问到内网的服务器。

2、网络重定向

NAT的弊端

NAT的存在破坏了IP端到端模型。NAT通过修改IP首部的信息变换通信的地址。但是在这个转换过程中只能基于一个会话单位。当一个应用需要保持多个双向连接时,麻烦就很大。NAT不能理解多个会话之间的关联性,无法保证转换符合应用需要的规则。当NAT网关拥有多个公有IP地址时,一组关联会话可能被分配到不同的公网地址,这通常是服务器端无法接受的。更为严重的是,当公网侧的主机要主动向私网侧发送数据时,NAT网关没有转换这个连接需要的关联表,这个数据包无法到达私网侧的主机。这些反方向发送数据的连接总有应用协议的约定或在初始建立的会话中进行过协商。但是因为NAT工作在网络层和传输层,无法理解应用层协议的行为,对这些信息是无知的。NAT希望自己对通信双方是透明的,但是在这些情况下这是一种奢望。



iptables nat性能_IP_02


图形来自(网路之路-NAT篇)



因为NAT的工作依赖于传输层协议的的端口号,这样NAT网关就无法处理ip分片报文,所有通过NAT网关的ip分片报文必须在网关重组后NAT转换后再分片发出去,严重影响了转发速度。

应用层网关(ALG)

应用层网关(ALG)是解决NAT对应用层协议无感知的一个最常用方法,成为NAT设备的一个必需功能。因为NAT不感知应用协议,所以有必要额外为每个应用协议定制协议分析功能,这样NAT网关就能理解并支持特定的协议。ALG与NAT形成互动关系,在一个NAT网关检测到新的连接请求时,需要判断是否为已知的应用类型,这通常是基于连接的传输层端口信息来识别的。在识别为已知应用时,再调用相应功能对报文的深层内容进行检查,当发现任何形式表达的IP地址

和端口时,将会把这些信息同步转换,并且为这个新连接创建一个附加的转换表项。这样,当报文到达公网侧的目的主机时,应用层协议中携带的信息就是NAT网关提供的地址和端口。一旦公网侧主机开始发送数据或建立连接到此端口,NAT网关就可以根据关联表信息进行转换,再把数据转发到私网侧的主机。很多应用层协议实现不限于一个初始连接(通常为信令或控制通道)加一个数据连接,可能是一个初始连接对应很多后续的新连接。比较特别的协议,在一次协商中会产生一组相关连接,比如RTP/RTCP协议规定,一个RTP通道建立后占用连续的两个端口,一个服务于数据,另一个服务于控制消息。此时,就需要ALG分配连续的端口为应用服务。ALG能成功解决大部分协议的NAT穿越需求。但是,出于安全性需要,有些应用类型报文从源端发出就已经加密,这种报文在网络中间无法进行分析,所以ALG无能为力。


Netfilter 提供了ALG的基础框架,后续会以ftp协议为例来讲解ALG的具体实现。


使用iptables来配置NAT

Iptables 中nat功能时有 target  来实现的。分为SNAT和DNAT。


还有一些NAT的功能 MASQUERADENETMAPREDIRECT



iptables nat性能_NAT_03


1、SNAT 

源IP地址转换,只能用在nat表中的POSTROUTING chain中

--to-source ipaddr[-ipaddr][:port[-port]]   //指定转换后的源IP地址,如果是udp/tcp的报文,可以指定转换后的端口号

--random  //端口号映射时采用随机的映射

--persistent  //端口号映射时采用连续的端口号映射



如图所示:

在NAT网关上配置

iptables -t nat -A POSTROUTING  -p udp  -j SNAT --to-source 9.9.9.9

在client 上发源ip和源端口号为192.168.3.227:60 的udp报文,在server上抓包结果如下:



iptables nat性能_端口号_04


源IP地址已经改变为9.9.9.9,但源端口号没有改变


iptables -t nat -A POSTROUTING  -p udp  -j SNAT --to-source 9.9.9.9:100

在client 上发源ip和源端口号为192.168.3.227:60 的udp报文,在server上抓包结果如下:



iptables nat性能_端口号_05


源端口号已经改变为100了。


iptables -t nat -A POSTROUTING  -p udp  -j SNAT --to-source 9.9.9.9:100-200

在client 上分别发一个源ip 为192.168.3.227的,源端口号分别是50和70的udp报文,在server上抓包结果如下:



iptables nat性能_iptables nat性能_06


发现端口号映射是连续映射的


iptables -t nat -A POSTROUTING  -p udp  -j SNAT --to-source 9.9.9.9 --random

在client 上分别发一个源ip 和源端口号为192.168.3.227:50的udp报文,在server上抓包结果如下:



iptables nat性能_端口号_07


发现源端口号发生了改变,并且是随机分配了一个


2、MASQUERADE

地址伪装,本质跟SNAT一样,都是替换源IP地址。SNAT是通过命令行给定IP地址,MASQUERADE是用NAT网关的发送报文的三层的IP地址来替换报文的源IP地址,主要用在NAT网关通过DHCP动态获取IP地址的应用场景


iptables -t nat -A POSTROUTING -j MASQUERADE

通过 client ping server,在server端抓包看到如下结果:



iptables nat性能_IP_08


发现报文的源IP已经被替换成了NAT网关接口的IP地址。

3、DNAT

目的网络地址转换,该Target只能用在 PREROUTING 和 OUTPUT两个chain上


例、

iptables -t nat -A PREROUTING  -j DNAT --to-destination 192.168.3.227

这时从server 端 ping  192.168.5.1 时,报文就会被DNAT到client端,在client端就能抓到icmp报文



iptables nat性能_端口号_09



4、REDIRECT

和DNAT原理一样,只是把目的IP地址替换成接收端口的IP地址。该Target只能用在 PREROUTING 和 OUTPUT两个chain上

例:

iptables -t nat -A PREROUTING -j REDIRECT


这时从client 端构造 目的地址是192.168.3.5的icmp  request报文,在NAT网关上抓包如下:



iptables nat性能_NAT_10


发现经过目的地址替换后,NAT网关代替192.168.3.5 回应了该icmp request。

说明该功能可以用在网关代理某些功能的应用场景。