原文链接:http://www.jb51.net/LINUXjishu/402441.html

DNAT(Destination Network Address Translation,目的地址转换) 通常被叫做目的映谢。而SNAT(Source Network Address Translation,源地址转换)通常被叫做源映谢。
这是我们在设置Linux网关或者防火墙时经常要用来的两种方式。以前对这两个都解释得不太清楚,现在我在这里解释一下。
首先,我们要了解一下IP包的结构,如下图所示:

在任何一个IP数据包中,都会有Source IP Address与Destination IP Address这两个字段,数据包所经过的路由器也是根据这两个字段是判定数据包是由什么地方发过来的,它要将数据包发到什么地方去。而iptables的DNAT与SNAT就是根据这个原理,对Source IP Address与Destination IP Address进行修改。
然后,我们再看看数据包在iptables中要经过的链(chain):

图中正菱形的区域是对数据包进行判定转发的地方。在这里,系统会根据IP数据包中的destination ip address中的IP地址对数据包进行分发。如果destination ip adress是本机地址,数据将会被转交给INPUT链。如果不是本机地址,则交给FORWARD链检测。
这也就是说,我们要做的DNAT要在进入这个菱形转发区域之前,也就是在PREROUTING链中做,比如我们要把访问202.103.96.112的访问转发到192.168.0.112上:
iptables -t nat -A PREROUTING -d 202.103.96.112 -j DNAT --to-destination 192.168.0.112
这个转换过程当中,其实就是将已经达到这台Linux网关(防火墙)上的数据包上的destination ip address从202.103.96.112修改为192.168.0.112然后交给系统路由进行转发。
而SNAT自然是要在数据包流出这台机器之前的最后一个链也就是POSTROUTING链来进行操作
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 58.20.51.66
这个语句就是告诉系统把即将要流出本机的数据的source ip address修改成为58.20.51.66。这样,数据包在达到目的机器以后,目的机器会将包返回到58.20.51.66也就是本机。如果不做这个操作,那么你的数据包在传递的过程中,reply的包肯定会丢失。

注意,DNAT target只能用在nat表的PREOUTING 和 OUTPUT 链中,或者是被这两条链调用的链里。但还要注意的是,包含DNAT target的连不能被除此之外的其他链调用,如POSTROUTING。

代码如下:

Table 6-16. DNAT target
Option --to-destination
Example iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.1.1-192.168.1.10

Explanation指定要写入IP头的地址,这也是包要被转发到的地方。上面的例子就是把所有发往地址15.45.23.67的包都转发到一段LAN使用的私有地址中,即192.168.1.1到192.168.1.10。如前所述,在这种情况下,每个流都会被随机分配一个要转发到的地址,但同一个流总是使用同一个地址。我们也可以只指定一个IP地址作为参数,这样所有包都被转发到同一台机子。我们还可以在地址后指定一个或一个范围的端口。比如:--to-destination 192.168.1.1:80或192.168.1.1:80-100。SNAT的语法和这个target的一样,只是目的不同罢了。要注意,只有先用--protocol指定了TCP或UDP协议,才能使用端口。
    因为DNAT要做很多工作,所以我要再啰嗦一点。我们通过一个例子来大致理解一下它是如何工作的。比如,我想通过Internet连接发布我们的网站,但是HTTP server在我们的内网里,而且我们对外只有一个合法的IP,就是防火墙那个对外的IP——$INET_IP。防火墙还有一个内网的IP——$LAN_IP,HTTP server的IP是%HTTP_IP(当然这是内网的了)。为了完成我们的设想,要做的第一件事就是把下面这个简单的规则加入到nat表的PREROUTING链中:

代码如下:

iptables -t nat -A PREROUTING --dst$INET_IP -p tcp --dport 80 -j DNAT / --to-destination $HTTP_IP

现在,所有从Internet来的、到防火墙的80端口去的包都会被转发(或称作被DNAT)到在内网的HTTP服务器上。如果你在Internet上试验一下,一切正常吧。再从内网里试验一下,完全不能用吧。这其实是路由的问题。下面我们来好好分析这个问题。为了容易阅读,我们把在外网上访问我们服务器的那台机子的IP地址记为$EXT_BOX。
    包从地址为$EXT_BOX的机子出发,去往地址为$INET_IP的机子。
    包到达防火墙。
    防火墙DNAT(也就是转发)这个包,而且包会经过很多其他的链检验及处理。
    包离开防火墙向$HTTP_IP前进。
    包到达HTTP服务器,服务器就会通过防火墙给以回应,当然,这要求把防火墙作为HTTP到达$EXT_BOX的网关。一般情况下,防火墙就是HTTP服务器的缺省网关。
    防火墙再对返回包做Un-DNAT(就是照着DNAT的步骤反过来做一遍),这样就好像是防火墙自己回复了那个来自外网的请求包。
    返回包好像没经过这么复杂的处理、没事一样回到$EXT_BOX。
    现在,我们来考虑和HTTP服务器在同一个内网(这里是指所有机子不需要经过路由器而可以直接互相访问的网络,不是那种把服务器和客户机又分在不同子网的情况)的客户访问它时会发生什么。我们假设客户机的IP为$LAN_BOX,其他设置同上。
    包离开$LAN_BOX,去往$INET_IP。
    包到达防火墙。
    包被DNAT,而且还会经过其他的处理。但是包没有经过SNAT的处理,所以包还是使用它自己的源地址,就是$LAN_BOX(译者注:这就是IP传输包的特点,只根据目的地的不同而改变目的地址,但不因传输过程要经过很多路由器而随着路由器改变其源地址,除非你单独进行源地址的改变。其实这一步的处理和对外来包的处理是一样的,只不过内网包的问题就在于此,所以这里交代一下原因)。
    包离开防火墙,到达HTTP服务器。
    HTTP服务器试图回复这个包。它在路由数据库中看到包是来自同一个网络的一台机子,因此它会把回复包直接发送到请求包的源地址(现在是回复包的目的地址),也就是$LAN_BOX。
    回复包到达客户机,但它会很困惑,因为这个包不是来自它访问的那台机子。这样,它就会把这个包扔掉而去等待“真正”的回复包。
    针对这个问题有个简单的解决办法,因为这些包都要进入防火墙,而且它们都去往需要做DNAT才能到达的那个地址,所以我们只要对这些包做SNAT操作即可。比如,我们来考虑上面的例子,如果对那些进入防火墙而且是去往地址为$HTTP_IP、端口为80的包做SNAT操作,那么这些包就好像是从$LAN_IP来的了。这样,HTTP服务器就会把回复包发给防火墙,而防火墙会再对包做Un-DNAT操作,并把包发送到客户机。解决问题的规则如下:
    iptables -t -nat -A POSTROUTING -p tcp --dst$HTTP_IP --dport 80 -j SNAT / --to-source $LAN_IP
    要记住,按运行的顺序POSTROUTING链是所有链中最后一个,因此包到达这条链时,已经被做过DNAT操作了,所以我们在规则里要基于内网的地址$HTTP_IP(包的目的地)来匹配包。
    警告:我们刚才写的这条规则会对日志产生很大影响,这种影响应该说是很不好的,因为来自Internet包在防火墙内先后经过了DNAT和SNAT处理,才能到达HTTP服务器(上面的例子),所以HTTP服务器就认为包是防火墙发来的,而不知道真正的源头是其他的IP。这样, 当它记录服务情况时,所有访问记录的源地址都是防火墙的IP而不是真正的访问源。我们如果想根据这些记录来了解访问情况就不可能了。因此上面提供的“简单办法”并不是一个明智的选择,但它确实可以解决“能够访问”的问题,只是没有考虑到日志而已。
    其他的服务也有类似的问题。比如,你在LAN内建立了SMTP服务器,那你就要设置防火墙以便能转发SMTP的数据流。这样你就创建了一个开放SMTP的中继服务器,随之而来的就是日志的问题了。
    一定要注意,这里所说的问题只是针对没有建立DMZ或类似结构的网络,并且内网的用户访问的是服务器的外网地址而言的。(译者注:因为如果建立的DMZ,或者服务器和客户机又被分在不同的子网里,那就不需要这么麻烦了。因为所有访问的源头都不在服务器所在的网里,所以就没有必要做SNAT去改变包的源地址了,从而记录也就不是问题了。如果内网客户是直接访问服务器的内网地址那就更没事了)
    比较好的解决办法是为你的LAN在内网建立一台单独的DNS服务器(译者注:这样,内网客户使用网站名访问HTTP服务器时,DNS就可以把他解析成内网地址。客户机就可以直接去访问HTTP服务器的内网地址了,从而避免了通过防火墙的操作,而且包的源地址也可以被HTTP服务器的日志使用,也就没有上面说的日志问题了。),或者干脆建立DMZ得了(这是最好的办法,但你要有钱哦,因为用的设备多啊)。
    对上面的例子应该考虑再全面些,现在还有一个问题没解决,就是防火墙自己要访问HTTP服务器时会发生什么,能正常访问吗?你觉得呢:)很可惜,现在的配置还是不行,仔细想想就明白了。我们这里讨论的基础都是假设机子访问的是HTTP服务器的外网地址,那客户机就会看到页面内容,不过这不是它想看到的(它想要的在DNAT上了),如果没有HTTP服务,客户就只能收到错误信息了。前面给出的规则之所以不起作用是因为从防火墙发出的请求包不会经过那两条链。还记得防火墙自己发出的包经过哪些链吧:) 我们要在nat表的OUTPUT链中添加下面的规则:

代码如下:

iptables -t nat -A OUTPUT --dst$INET_IP -p tcp --dport 80 -j DNAT / --to-destination $HTTP_IP

有了最后这条规则,一切都正常了。和HTTP服务器不在同一个网的机子能正常访问服务了,和它在一个网内的机子也可以正常访问服务了,防火墙本身也可以正常访问服务了,没有什么问题了。    我想大家应该能明白这些规则只是说明了数据包是如何恰当的被DNAT和SNAT的。除此之外,在filter表中还需要其他的规则(在FORWARD链里),以允许特定的包也能经过前面写的(在POSTROUTING链和OUTPUT链里的)规则。千万不要忘了,那些包在到达FORWARD链之前已经在PREROUTING链里被DNAT过了,也就是说它们的目的地址已经被改写,在写规则时要注意这一点。

转载于:https://www.cnblogs.com/qy-blogs/p/8901477.html

iptables SNAT 和DNAT的转化配置实验相关推荐

  1. SNAT和DNAT原理及配置方法

    文章目录 SNAT策略概述 DNAT策略概述 SNAT和DNAT配置 防火墙规则的备份和还原 SNAT策略概述 原理:修改数据包中的源IP地址 作用:可以实现局域网共享上网 配置的表及链:nat表中的 ...

  2. linux服务-iptables( snat 和dnat )

    iptables snat 和dnat说明 1.dnat是用来做目的网络地址转换的,就是重写包的目的IP地址.比如,你的Web服务器在LAN内部,而且没有可在Internet上使用的真实IP地址,那就 ...

  3. iptables中的snat与dnat配置技术文档

    文章目录 一.SNAT实验: 二.DNAT实验 首先需要弄清楚snat与dnat的区别: 从定义来讲它们一个是源地址转换(snat),一个是目的地址转换(dnat).都是地址转换的功能,将私有地址转换 ...

  4. iptables之SNAT与DNAT

    iptables之SNAT与DNAT 前言 一.SNAT策略及应用 (1)SNAT策略概述 ①SNAT应用环境 ②SNAT的策略原理 ③SNAT转换前提条件 (2)开启SNAT命令 (3)SNAT案例 ...

  5. iptables防火墙(二)——SNAT和DNAT

    目录 一:SNAT策略及应用 1.1SNAT应用环境和SNAT策略的原理 1.1.1SNAT策略的典型应用环境 1.1.2SNAT策略的原理 1.1.3SNAT转换前提条件 1.2SNAT策略的工作原 ...

  6. Linux系统的iptables防火墙、SNAT、DNAT原理与设置规则

    Linux的iptables防火墙.SNAT.DNAT 一.iptables概述 1.netfilter/iptables关系 2.四表五链 四表 五链 规则表之间的优先顺序 规则链之间的匹配顺序 二 ...

  7. iptables 防火墙中的SNAT和DNAT

    目录 前言 一.SNAT策略 1.1 SNAT应用环境 1.2 SNAT原理 1.3 SNAT转换前提条件 1.4 SNAT转换流程 1.4 SNAT 应用 1.4.1 临时打开 1.4.2 永久打开 ...

  8. iptables防火墙之SNAT与DNAT

    目录 一.SNAT策略及应用 1.1 SNAT策略概述 1.1.1 SNAT 应用环境 1.1.2 SNAT 原理 1.1.3 SNAT 转换前提条件 1.2 开启SNAT的命令 1.2.1 临时打开 ...

  9. 【综合实验】之 SNAT 和 DNAT

    文章目录 1 关闭三台虚拟机防火墙 2 配置网关服务器 4 配置内网192.168.80.20 5 配置外网12.0.0.200 6 测试三台虚拟机是否可以正常访问 7 配置网关服务器的 iptabl ...

  10. Linux下防火墙iptables用法规则详及其防火墙配置

    原博主文章更美丽: http://www.cnblogs.com/yi-meng/p/3213925.html iptables规则 规则--顾名思义就是规矩和原则,和现实生活中的事情是一样的,国有国 ...

最新文章

  1. 5G 对无线通讯芯片产业链的影响
  2. UML类图、接口、包、关系
  3. 高颜值的神经网络可视化工具:3D、彩色、可定制,还能可视化参数重要性 | 开源...
  4. mysql 存储过程 无限分类_mysql存储过程实现无限分类
  5. 第五届工业互联网大数据:配件需求29th方案与代码
  6. 烂泥:【解决】-bash: ftp: command not found
  7. mysql整站源码安装_MySQL入门01-MySQL源码安装
  8. cesium three性能比较_Go学习_21_Golang代码性能检测Benchmark
  9. 笔记本电脑桌面的计算机不见了,小编为你分析win7系统笔记本电脑桌面计算机图标不见了的设置方案....
  10. Web 组件势必取代前端?
  11. getCacheDir()和getFilesDir()方法区别
  12. 【rqnoj】 1 明明的随机数
  13. Spark 自己实现分箱逻辑遇到的坑
  14. Php开发银行接口之浦发银行
  15. java楼盘管理系统_javaweb房产信息管理系统
  16. linux系统安装详细教程
  17. SourceTree拉取代码出现错误
  18. 2.1.1 理论模型
  19. Unable to open JDBC Connection for DDL execution
  20. 未封装的扩展程序是什么意思_晶圆级封装是什么意思?

热门文章

  1. 打造一个基于机器学习的图像解码平台
  2. JavaScript完成知乎页面
  3. Spring Cloud Loadbalancer
  4. linux 输入两个命令,Linux两条命令touch、vi
  5. 基于k-means的大数据客户细分 - python 数据挖掘
  6. 三菱FX5U系列程序 伺服轴自动运行计数回原点程序,工位单步运行程序,轴JOG,回原点,绝对定位,相对定位,力矩控制
  7. NLP task2 N-Gram
  8. 为什么计算机是32位64位,64位是x86还是x64_为什么64位是X64,32位是X86?
  9. 解决 kindle 书籍字体颜色偏淡问题的方法
  10. WordPress 网站使用微信和支付宝支付插件功能