NAT: POSTROUTING修改的是源IP
  PREROUTING修改的是目的IP

 

 如图所示,在客户端192.168.1.100这台主机要联机到http://tw.yahoo.com时,它的数据包
表头会如何变化: 
 (1)客户端所发出的数据包表头中,来源是192.168.1.100,然后传送到NAT这台主机
 (2)NAT这台主机的内部接口(192.168.1.2)接收到这个数据包后,会主动分析表头数据,
    因为表头数据显示数目的并非linux本机,所以开始经过路由分析,将此数据包转到
    可以连接到Internet的Public IP处
 (3)由于Private IP与Public IP不能互通,所以linux主机通过iptables的NAT tablespoon内的
  Postrouting链将数据包表头的来源伪装成linux的Public IP,并且将两个不同来源
  (192,168.1.100及Public IP)的数据包对应写入暂存内存中,然后将此数据包传送出去

 在此过程中Internet上看到的这个数据包时,都只会知道这个数据包来自Public IP,而不知道其实
来自内部,现在我们来看下回传数据包:


 (1)在Internet上的主机接到这个数据包时,会将响应数据传送给那个Public IP的主机
 (2)当linux NAT主机收到来自Internet的响应数据包后,会分析该数据包的序号,并比
 对刚刚记录到内存中的数据,由于发现该数据包为后端主机之前传送出去的,因此在NAT
 Prerouting链中,会将目标IP修改成为后端主机,亦即那台192.168.1.100,然后发现目
 标已经不是本机(Public IP),所以开始通过路由分析数据包流向
 (3)数据包会传送到192.168.1.2这个内部接口,然后再传到最终目标192.168.1.100机器上去

 

 

2、目标NAT(DNAT)

SNAT主要是应付内部LAN连接到Internet的使用方式,DNAT则主要为内部主机架设能被Internet

访问的服务器,有点类似图中:

 

如图所示,假设内部主机192.168.1.210启动了www服务,这个服务器端口为80,那么Internet

上的主机(61.xx.xx.xx)要如何连接到内部服务器呢,当然,还得通过Linux NAT主机,所以这台

Internet上的机器需要连接到我们NAT的Public IP才行

外部主机想要访问目的端的www服务,则需要连接到我们的NAT主机上:

(1)NAT主机已经设置好分心出port 80 数据包,所以当NAT主机接到这个数据包后,会将目标

IP由Public IP改成192.168.1.210,且将该数据包记录下来,等待内部服务器响应

 

(2)上述数据包在经过路由分析后,来到private接口,然后通过内部的LAN传送到192.168.1.210上

 

(3)192.168.1.210会响应数据给61.xx.xx.xx,这个响应当然会被传送到192.168.1.2上去

经过路由判断后,来到NAT Postrouting的链,然后通过(2)的记录,将来源IP由192.168.1.210

改为Public IP后,就可以传送出去了,整个过程机会就等于SNAT的反向传送

 

注:MASQUERADE:该目标与SNAT作用相同,只是使用该目标时不需要指明--to-source。  MASQUERADE是专门设计用于那些动态
    获取IP地址的连接(比如拨号上网等),如果有固定的IP地址,可推荐直接使用SNAT(也可以使用MASQUERADE)
    和SNAT一样,只能用于nat表的POSTROUTING链,而且它只有一个参数(不是必需的)--to-ports用于指定端口,
    使用该参数时必需配合-p使用