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链中。

相关推荐

  1. <span style='color:red;'>iptables</span>

    iptables

    2024-07-13 09:08:10      19 阅读
  2. iptables使用

    2024-07-13 09:08:10       37 阅读
  3. iptables笔记

    2024-07-13 09:08:10       31 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-13 09:08:10       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-13 09:08:10       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-13 09:08:10       58 阅读
  4. Python语言-面向对象

    2024-07-13 09:08:10       69 阅读

热门阅读

  1. 总结:Hadoop高可用

    2024-07-13 09:08:10       27 阅读
  2. 使用Python进行音频处理:掌握音频世界的魔法

    2024-07-13 09:08:10       28 阅读
  3. ssh:(xshell)远程连接失败

    2024-07-13 09:08:10       25 阅读
  4. Hadoop 面试题(十一)

    2024-07-13 09:08:10       26 阅读
  5. 深入理解外观模式(Facade Pattern)及其实际应用

    2024-07-13 09:08:10       21 阅读
  6. MyBatis(17)MyBatis 如何处理枚举类型

    2024-07-13 09:08:10       22 阅读
  7. RIP 路由 3 个定时器的工作流程和 4 种防环方法

    2024-07-13 09:08:10       22 阅读
  8. 【python】函数重构

    2024-07-13 09:08:10       28 阅读
  9. 服务端生成RSA密钥实例

    2024-07-13 09:08:10       25 阅读
  10. Python面试题:解释一下什么是 `__new__` 方法

    2024-07-13 09:08:10       26 阅读
  11. linux UDP通讯:接口函数&示例

    2024-07-13 09:08:10       23 阅读
  12. Python实现文件访问和加密GUI应用程序

    2024-07-13 09:08:10       19 阅读
  13. 【Docker 系列】学习路线

    2024-07-13 09:08:10       18 阅读
  14. 奖励关(概率dp+状压)

    2024-07-13 09:08:10       20 阅读
  15. QT获得本地IP以及MAC地址

    2024-07-13 09:08:10       22 阅读