snat和dnat实际过程

来源:互联网

什麼是 NAT? SNAT? DNAT?

在谈到 NAT 的实际运作之前,让我们再来看一下比较简单的封包透过 iptables 而传送到后端主机的流程(请往前参考图八)。当网路佈线如图二的架构, 若内部 LAN 有任何一部主机想要传送封包出去时,那麼这个封包要如何透过 Linux 主机而传送出去? 他是这样的:

先经过 NAT table 的 PREROUTING 链; 

经由路由判断确定这个封包是要进入本机与否,若不进入本机,则下一步; 

再经过 Filter table 的 FORWARD 链; 

通过 NAT table 的 POSTROUTING 链,最后传送出去。 

NAT 主机的重点就在於上面流程的第 1,4 步骤,也就是 NAT table 的两条重要的链:PREROUTING 与 POSTROUTING。 那这两条链有什麼重要的功能呢?重点在於修改 IP 嘛!但是这两条链修改的 IP 是不一样的! POSTROUTING 在修改来源 IP ,PREROUTING 则在修改目标 IP 。 由於修改的 IP 不一样,所以就称為 来源 NAT (Source NAT, SNAT) 及目标 NAT (Destination NAT, DNAT)。我们先来谈一谈 IP 分享器功能的 SNAT 吧!

 

来源 NAT, SNAT

你应该有听说过 IP 分享器这个玩意儿,他可以让你家庭裡的好几部主机同时透过一条 ADSL 网路连线到 Internet 上面, 例如图二连线的方式来说,那个 Linux 主机就是 IP 分享器啦!那麼他是如何达到 IP 分享的功能?就是透过 NAT 表格的 POSTROUTING 来处理的。假设你的网路佈线如图二所示, 那麼 NAT 主机是如何处理这个封包的呢?

 

SNAT 封包传送出去的示意图

wps_clip_image-31246[3][1]

如上图所示,在用户端 192.168.1.100 这部主机要连线到 http://tw.yahoo.com 去时,他的封包表头会如何变化?

用户端所发出的封包表头中,来源会是 192.168.1.100 ,然后传送到 NAT 这部主机; 

NAT 这部主机的内部介面 (192.168.1.2) 接收到这个封包后,会主动分析表头资料, 因為表头资料显示目的并非 Linux 本机,所以开始经过路由, 将此封包转到可以连接到 Internet 的 Public IP 处; 

由於 private IP 与 public IP 不能互通,所以 Linux 主机透过 iptables 的 NAT table 内的 Postrouting 链将封包表头的来源偽装成為 Linux 的 Public IP ,并且将两个不同来源 (192.168.1.100 及 public IP) 的封包对应写入暂存记忆体当中, 然后将此封包传送出去了; 

此时 Internet 上面看到这个封包时,都只会知道这个封包来自那个 Public IP 而不知道其实是来自内部啦。 好了,那麼如果 Internet 回传封包呢?又会怎麼作?

 

SNAT 封包接收的示意图

wps_clip_image-9229[3][1]

在 Internet 上面的主机接到这个封包时,会将回应资料传送给那个 Public IP 的主机; 

当 Linux NAT 主机收到来自 Internet 的回应封包后,会分析该封包的序号,并比对刚刚记录到记忆体当中的资料, 由於发现该封包為后端主机之前传送出去的,因此在 NAT Prerouting 链中,会将目标 IP 修改成為后端主机,亦即那部 192.168.1.100,然后发现目标已经不是本机 (public IP), 所以开始透过路由分析封包流向; 

封包会传送到 192.168.1.2 这个内部介面,然后再传送到最终目标 192.168.1.100 机器上去! 

经过这个流程,您就可以发现到,所有内部 LAN 的主机都可以透过这部 NAT 主机连线出去, 而大家在 Internet 上面看到的都是同一个 IP (就是 NAT 那部主机的 public IP 啦!), 所以,如果内部 LAN 主机没有连上不明网站的话,那麼内部主机其实是具有一定程度的安全性的啦! 因為 Internet 上的其他主机没有办法主动攻击你的 LAN 内的 PC 嘛!所以我们才会说, NAT 最简单的功能就是类似 IP 分享器啦!那也是 SNAT 的一种。

Tips:

NAT 主机与路由器有啥不同?基本上,NAT 主机一定是路由器,不过, NAT 主机由於会修改 IP 表头资料, 因此与单纯转递封包的路由器不同。最常见的 IP 分享器就是一个路由器,但是这个 IP 分享器一定会有一个 Public IP 与一个 Private IP,让 LAN 内的 Private IP 可以透过 IP 分享器的 Public IP 传送出去喔! 至於路由器通常两边都是 Public IP 或同时為 Private IP。  

--------------------------------------------------------------------------------

目标 NAT, DNAT

SNAT 主要是应付内部 LAN 连接到 Internet 的使用方式,至於 DNAT 则主要用在内部主机想要架设可以让 Internet 存取的伺服器啦! 就有点类似图四的 DMZ 内的主机啊!底下也先来谈一谈 DNAT 的运作吧!

DNAT 的封包传送示意图

wps_clip_image-28186[3][1]

如上图所示,假设我的内部主机 192.168.1.210 啟动了 WWW 服务,这个服务的 port 开啟在 port 80 , 那麼 Internet 上面的主机 (61.xx.xx.xx) 要如何连接到我的内部伺服器呢?当然啦, 还是得要透过 Linux NAT 主机嘛!所以这部 Internet 上面的机器必须要连接到我们的 NAT 的 public IP 才行。

外部主机想要连接到目的端的 WWW 服务,则必须要连接到我们的 NAT 主机上头; 

我们的 NAT 主机已经设定好要分析出 port 80 的封包,所以当 NAT 主机接到这个封包后, 会将目标 IP 由 public IP 改成 192.168.1.210 ,且将该封包相关资讯记录下来,等待内部伺服器的回应; 

上述的封包在经过路由后,来到 private 介面处,然后透过内部的 LAN 传送到 192.168.1.210 上头! 

192.186.1.210 会回应资料给 61.xx.xx.xx ,这个回应当然会传送到 192.168.1.2 上头去; 

经过路由判断后,来到 NAT Postrouting 的链,然后透过刚刚第二步骤的记录,将来源 IP 由 192.168.1.210 改為 public IP 后,就可以传送出去了! (类似图十的状态!)。 

其实整个步骤几乎就等於 SNAT 的反向传送哩!这就是 DNAT 囉!很简单吧!

wps_clip_image-23177[3][1]

iptables 内建各表格与链的相关性(简图)

wps_clip_image-3436[3][1]

发表评论