简介
前面我们已经介绍了ACCEPT、DROP、REJECT、LOG,这篇文章我们介绍SNAT、DNAT、MASQUERADE、REDIRECT,这几个参数的定义我们在上篇文章中都有介绍,我这里再列出回顾一下
DNAT(目标地址转换)和 SNAT(源地址转换)
原理:修改数据包的源或目标 IP 地址。通常用于 NAT(网络地址转换)场景。
时机:当你想在防火墙级别进行地址转换时,例如,将外部 IP 地址映射到内部服务器。
MASQUERADE(或MASQUERADE-SAVE)
原理:对源地址进行伪装,通常用于从私有网络到公共网络的NAT。
时机:在私有网络中的主机需要访问公共网络时。
REDIRECT target通常与NAT(网络地址转换)表一起使用,尤其是PREROUTING链,因为它允许在数据包路由之前更改其目标地址。


实验环境准备

其中A为我们内部网络的主机,B为配置了iptables的防火墙主机,C为外网服务。注意:此时主机A的默认路由指向主机B,主机B的默认路由指向主机C,但是由于C是公网,所以C不可能有主机A的路由,C只能有主机B的路由。例如我们家的宽带,路由器出口可以从运营商获取公网IP地址,这个IP地址全球唯一(如果运营商分配的是真正的公网地址的话),那么家里的所有设备访问外网的时候只需要将数据包发送到路由器,路由器转发到公网,公网返回数据包也只会返回给路由器,因为公网不可能知道你的私有IP地址,且私有IP地址也不允许在公网出现。



target:SNAT
在我们的实验环境中,现在主机A需要和主机C通信,需要在主机B上进行地址转换,将内网网段转换为外部主机C可以返回数据包的地址。
我们先添加如下iptables规则,在做解释

上图中的规则表示将来自于192.168.140.0/24网段的报文的源地址改为192.168.170.200这个IP地址。
“-t nat”表示操作nat表,就是不同的表有不同的功能,filter表的功能是过滤,nat表的功能就是地址转换,所以我们需要在nat表中定义nat规则。
“-I POSTROUTING”表示将SNAT规则添加到POSTROUTING链。
为什么SNAT规则必须定义在POSTROUTING链中,我们可以这样认为,POSTROUTING链是iptables中报文发出的最后一个”关卡”,我们应该在报文马上发出之前,修改报文的源地址,否则就再也没有机会修改报文的源地址了,也可以将SNAT规则定义在INPUT链中。
“-s 192.168.140.0/24″表示报文来自于192.168.140.0/24网段。
“-j SNAT”表示使用SNAT动作,对匹配到的报文进行处理,对匹配到的报文进行源地址转换。
“–to-source 192.168.170.200″表示将匹配到的报文的源IP修改为192.168.170.200,前文中,我们已经总结过,某些动作会有自己的选项,”–to-source”就是SNAT动作的常用选项,用于指定SNAT需要将报文的源IP修改为哪个IP地址

主机A----------------------------------主机B(iptables)------------------------------主机C
192.168.140.248 192.168.140.250 192.168.170.200 192.168.170.128
A访问C------------------------------------->SNAT--------------------------------------->
源地址192.168.140.248 源地址转换为192.168.170.200 主机C收到了主机A的数据包,会发现源地址为192.168.170.200
主机A<-------------------------------------SNAT<---------------------------------------------------------------------------------------主机C
主机A收到了主机C返回的数据包 主机B收到数据包会按照NAT表,将发到192.168.170.200的数据包转发到192.168.140.248 主机C给主机A回包的目的地址为192.168.170.200,因为他收到数据包看到的源地址为170.200
target:MASQUERADE
当我们在使用拨号网上时或者接口IP地址是dhcp获取的时候,每次分配的IP地址往往不同,不会长期分给我们一个固定的IP地址,如果这时,我们想要让内网主机共享公网IP上网,因为每次IP地址发生变化以后,我们都要重新配置SNAT规则,这个时候,我们可以通过MASQUERADE即可解决这个问题,MASQUERADE会动态的将源地址转换为可用的IP地址,其实与SNAT实现的功能完全一致,都是修改源地址,只不过SNAT需要指明将报文的源地址改为哪个IP,而MASQUERADE则不用指定明确的IP,会动态的将报文的源地址修改为指定网卡上可用的IP地址
示例如下:


target:DNAT
假设我们只有一个公网IP,但是内网中却有很多服务器提供各种服务,我们想要通过公网访问这些服务,应该怎么办呢?
这个时候使用DNAT就可以实现,我们利用DNAT,将公网客户端发送过来的报文的目标地址与端口号做了映射,将访问SSH服务的报文转发到了内网中的C主机中。

“-t nat -I PREROUTING”表示在nat表中的PREROUTING链中配置DNAT规则,DNAT规则只配置在PREROUTING链与OUTPUT链中。注意DNAT能不能配置在INPUT链中呢?答案是不能,可以参考上面iptables数据包处理流程,INPUT是在route过程后才进入的,也就是说已经进行了路由选择才到INPUT,而我们需要修改的是目的地址,所以这个过程应该发生在route之前,所以DNAT只能配置在PREROUTING和OUTPUT链中。
“-d 192.168.170.200 -p tcp –dport 22″表示报文的目标地址为防火墙出口的公网IP地址,目标端口为tcp的22号端口,当外部主机访问该IP的22号端口时,报文则符合匹配条件。
“-j DNAT –to-destination 192.168.140.248″表示将符合条件的报文进行DNAT,也就是目标地址转换,将符合条件的报文的目标地址与目标端口修改为192.168.140.248:22,”–to-destination”就是动作DNAT的常用选项。
那么综上所述,上图中定义的规则的含义为,当外网主机访问防火漆出口IP 192.168.170.200的22时,其报文的目标地址与端口将会被转换为192.168.140.248的22端口上。

注意配置了DNAT还要有对应的SNAT出现,否则将无法回包。例如,主机C通过ssh连接主机B192.168.170.200的22端口,主机B将流量转发至主机A,主机A回包,主机A看到的源IP地址是主机C的地址,此时要给主机C回包,数据包发送到主机B,主机B如果不进行SNAT转换,那么主机C将看到的是主机A的地址,此时主机C没有主机A的路由,故连接是无法建立的。

target:REDIRECT
使用REDIRECT动作可以在本机上进行端口映射
比如,将本机的80端口映射到本机的8080端口上
iptables -t nat -A PREROUTING -p tcp –dport 443 -j REDIRECT –to-ports 8443
经过上述规则映射后,当别的机器访问本机的443端口时,报文会被重定向到本机的8443端口上。
REDIRECT规则只能定义在PREROUTING链或者OUTPUT链中。