一 NAT的基本概念
在讲述nat这张表如何处理之前,先了解一下NAT的基本概念。
NAT(Network Address Translation,网络地址转换),顾名思义,就是从一个IP地址转换为另一个IP地址。当然,这里面的根本原因是还是IP地址不够用的问题(解决IP地址枯竭的方法一个是IPv6,另外一个是NAT)。所以NAT,大家基本做得还是公网地址与私网地址的互相转换。如果一定要在公网地址之间转换,或者私有地址之间互相转换,技术上是支持的,只是这种场景非常少。
NAT,从实现技术角度,分为:静态NAT、动态NAT和端口复用三种方案。
1 静态NAT
静态NAT,有两个特征:
1.1 私网IP地址与公网IP地址的转换规则是静态指定的,比如10.10.10.1与50.0.0.1互相转换,这个是静态指定好的。
1.2 私网IP地址与公网IP地址是1:1,即一个私网IP地址对应1个公网IP地址。
2 动态NAT
一般情况下是公网IP比私网IP少的时候,用到动态NAT方案。如果公网IP地址比私网IP地址多或者相等,则用静态NAT就可以了,没必要这么麻烦。
动态NAT,就是一批私网IP地址与公网IP地址之间不是固定的转换关系,而是在IP报文处理过程中由NAT模块进行动态匹配。虽然,公网IP比私网IP地址少,但是,同时在线的私网IP需求小于等于公网IP数量,不然某些私网IP将得不到正确的转换,从而导致网络通信失败。
动态NAT,有三个特征:
2.1 私网和公网IP地址不是固定匹配转换的,而是变化的
2.2 两者之间的规则不是静态指定的,而是动态匹配的
2.3 私网IP地址与公网IP地址之间是m:n,一般m<n
3 端口多路复用PAT
如果私网IP地址有多个,而公网IP地址只有一个,那么,静态NAT显然是不行了。动态NAT也基本不行(只有一个公网IP,不够用)。此时,就需要用到端口多路复用。多个私网IP映射到同一个公网IP,不同的私网IP利用端口号进行区分,这里的端口号指的是TCP/UDP端口号。所以端口号复用又叫PAT(Port Address Translation)。
端口多路复用的特征是:
3.1 私网IP:公网IP=m:1
3.2 以公网IP+端口号来区分私网IP
二 SNAT/DNAT
前面说的静态NAT和动态NAT,不能简称SNAT和DNAT,因为SNAT和DNAT有另外的含义,是另外的缩写。
要区分SNAT(Source Network Address Tranlation,源地址转换)与DNAT(Destination Network Address Translation,目的地址转换)这两个功能可以简单地由连接发起者来区分。
1 内部地址要访问公网上的服务时(如web访问),内部地址会主动发起连接,由路由器或者防火墙上的网关对内部地址做个地址转换,将内部地址的私有IP转换为公网的公有IP,网关的这个地址转换称为SNAT,主要是内部共享IP访问外部。
2 当内部需要提供对外服务时(如对外发布web网站),外部地址发起主动连接,由路由器或者防火墙上的网关接收这个连接,然后将连接转换到内部,此过程是由带有公网IP的网关地址替代内部服务来接收外部的连接,然后在内部做地址转换,此转换称为DNAT,主要用于内部服务对外发布。
三 Netfilter中的NAT Chain
说china有点太学究,大白话就是时刻点。NAT一共在三个时刻点对IP报文做了处理。
1 NAT-PREROUTING(DNAT)
NAT-PREROUTING(DNAT)的处理时刻点,如下图:
IP报文流的顺序是图中的“1-2-3-4-5”,在图的A处,即PREROUTING时刻点进行NAT处理,IP报文的目的地址是IP1(公网IP),这个IP1就是Linux内核空间对外(公网)呈现的IP地址(说明这样的IP地址可以有多个)。当报文达到PREROUTING这个时刻点时,NAT模块会做处理。如果需要(提前做了相关NAT配置),NAT模块会将目的IP从IP1转换为IP2(这个是提前配置好的),这也就是所谓的DNAT。
2 NAT-POSTROUTING(SNAT)
NAT-POSTROUTING(SNAT)的处理时刻点,如下图:
IP报文流的顺序是图中的“1-2-3-4-5”,在图中“E”处,即POSTROUTING时刻点进行NAT处理。IP报文的源地址IP3(私网IP),这个报文最后经过POSTROUTING这个时刻点时,如果需要(提前做好了相关NAT配置),NAT模块会做处理。NAT模块会将源IP从IP3转换成IP1(这个提前配置好),这就就是所谓的SNAT。这个IP1就是Linux内核空间对外(公网)呈现的IP地址(说明,这样IP地址可以有多个)。
3 NAT-OUTPUT(DNAT)
NAT-OUTPUT(DNAT)的处理时刻点,如下图:
该图给人一种迷惑/诡异的感觉,这个IP报文是谁发出来的?如果我们把Linux内核空间(Netfilter)往外设想一下,把它想象成一个网元,比如防火墙(防火墙可以有NAT功能),这个防火墙自己对外发送一个报文。这个报文在D处,即OUTPUT时刻点,会做一个DNAT。这样这个报文不需要在3处,即POSTROUTING时刻点再做NAT,因为内核空间IP源地址已经是公网IP,而目的地址已经在“2”处,即D处的OUTPUT时刻点已经做了DNAT。
四 小结
Linux内核空间Netfilter模块的NAT处理,一共有三个Chain(处理时刻点),如下表:
来源:CSDN
作者:cakincqm
链接:https://blog.csdn.net/chengqiuming/article/details/80206157