iptables中DNAT与SNAT的理解

iptables中DNAT与SNAT的理解linux

 

设置Linux网关或者防火墙时的两种方式ide

SNAT(Source Network Address Translation,源地址转换):源映谢。post

DNAT(Destination Network Address Translation,目的地址转换) :目的映谢。spa

 

 

首先,咱们要了解一下IP包的结构,以下图所示:
iphdr
在任何一个IP数据包中,都会有Source IP Address与Destination IP Address这两个字段,数据包所通过的路由器也是根据这两个字段是断定数据包是由什么地方发过来的,它要将数据包发到什么地方去。而iptables的DNAT与SNAT就是根据这个原理,对Source IP Address与Destination IP Address进行修改。翻译

而后,咱们再看看数据包在iptables中要通过的链(chain):
netfilter_packet_flow
        图中正菱形的区域是对数据包进行断定转发的地方。在这里,系统会根据IP数据包中的destination ip address中的IP地址对数据包进行分发。若是destination ip adress是本机地址,数据将会被转交给INPUT链。若是不是本机地址,则交给FORWARD链检测。
这也就是说,咱们要作的DNAT要在进入这个菱形转发区域以前,也就是在PREROUTING链中作,好比咱们要把访问202.103.96.112的访问转发到192.168.0.112上:blog

         iptables -t nat -A PREROUTING -d 202.103.96.112 -j DNAT --to-destination 192.168.0.112ip

这个转换过程中,其实就是将已经达到这台Linux网关(防火墙)上的数据包上的destination ip address从202.103.96.112修改成192.168.0.112而后交给系统路由进行转发。路由

而SNAT天然是要在数据包流出这台机器以前的最后一个链也就是POSTROUTING链来进行操做get

         iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 58.20.51.66input

这个语句就是告诉系统把即将要流出本机的数据的source ip address修改为为58.20.51.66。这样,数据包在达到目的机器之后,目的机器会将包返回到58.20.51.66也就是本机。若是不作这个操做,那么你的数据包在传递的过程当中,reply的包确定会丢失。

       在prerouting链里面作不了SNAT,postrouting链里面作不了DNAT。

       当一个数据包进入linux系统之后,首先进入mangle表的prerouting链,进行某些预路由的修改(也可能不改),而后数据包进入nat表的 prerouting链,进行dnat之类(改变数据包的目的地址,好比咱们所说的网关,好比从外网返回的数据包并不知道是内网的哪台机器须要这个数据包,都发给了网关的外网地址,而网关就要把这些数据包的目的地址改成正确的目的地址,而不是本身)的事情,而后进行判断这个数据包是发给这台计算机自身的仍是仅仅须要转发的。若是是转发,就发送给mangle表的FORWARD链,进行一些参数修改(好比tos什么的参数)或者不修改,而后送给 filter表的forward链进行过滤(就是一般所说的转发过滤规则),而后送给mangle表的postrouting链进行进一步的参数修改(或者不修改),而后发给nat表的postrouting链修改(或者不修改)源地址(好比网关这个时候会把原本发自内网ip的数据包的源地址改成本身的外网IP,这样发送出去后,外面的主机就会觉得这是网关发出的数据包了),而后发给网卡设备发送到网上。

 

总结:        

input —对进入本机的数据进行过滤
output —-对从本机出去的数据进行处理
forward—– 对本网段的数据进行处理
prerouting —— dnat 和 ports redirect
postrouting ——-snat 和 masquerade

iptables 其实 只有两条chains 是对本机有用的 input 和 output
而 forwad 实际上是用来处理局域网中的数据包的(由于linux通常是用来充当网关或者是路由器的)

而 prerouting 和 postrouting 属于nat 表,这个 —实际上是iptables的附加功能,主要是用来作翻译的

 

转自:http://blog.myhnet.cn/2009/01/12/my-understanding-about-dnat-and-snat-in-iptables/

相关文章
相关标签/搜索