iptables(11)target(SNAT、DNAT、MASQUERADE、REDIRECT)

简介

前面我们已经介绍了ACCEPT、DROP、REJECT、LOG,这篇文章我们介绍SNAT、DNAT、MASQUERADE、REDIRECT,这几个参数的定义我们在上篇文章中都有介绍,我这里再列出回顾一下


DNAT(目标地址转换)和 SNAT(源地址转换)
原理:修改数据包的源或目标 IP 地址。通常用于 NAT(网络地址转换)场景。
时机:当你想在防火墙级别进行地址转换时,例如,将外部 IP 地址映射到内部服务器。

MASQUERADE(或MASQUERADE-SAVE)
原理:对源地址进行伪装,通常用于从私有网络到公共网络的NAT。
时机:在私有网络中的主机需要访问公共网络时。

REDIRECT target通常与NAT(网络地址转换)表一起使用,尤其是PREROUTING链,因为它允许在数据包路由之前更改其目标地址。
通过-t选项选择nat表,可以看到nat表中有4条链PREROUTING INPUT OUTPUT POSTROUTING
此时我们再来回顾一下iptables数据包转发过程

实验环境准备

张这图是不是似曾相似,没错这就是我们在介绍网络防火墙的时候的环境,不能说一模一样,只能说其实就是一个。

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

此时iptables的条目为空,并且所有默认策略都是ACCEPT

此时主机A是无法ping通主机C的,因为主机C没有主机A的路由
此时主机C并没有主机A的路由条目,所以无法回包
​​​​

target:SNAT

在我们的实验环境中,现在主机A需要和主机C通信,需要在主机B上进行地址转换,将内网网段转换为外部主机C可以返回数据包的地址。

我们先添加如下iptables规则,在做解释

创建一条nat规则,当这条nat规则创建完成后,需要查看需要加上-t nat,因为默认情况下查看的是filter表

上图中的规则表示将来自于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 ping主机C已经可以ping通了,为什么只配置了一条SNAT规则就可以通信了呢?我们下面来分析下通信过程。
​​​​
主机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地址

示例如下:

使用-o选项指定出接口,MASQUERADE会自动将源地址修改为出接口的IP地址
此时主机A ping主机C也是可以ping通的

target:DNAT

        假设我们只有一个公网IP,但是内网中却有很多服务器提供各种服务,我们想要通过公网访问这些服务,应该怎么办呢?

        这个时候使用DNAT就可以实现,我们利用DNAT,将公网客户端发送过来的报文的目标地址与端口号做了映射,将访问SSH服务的报文转发到了内网中的C主机中。

配置一条DNAT规则

“-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端口上。

此时当我们访问192.168.170.200的22端口时,iptables会自动将流量转发到192.168.140.248。

注意配置了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链中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Monster✺◟(∗❛ัᴗ❛ั∗)◞✺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值