新睿云

> NAT网关 > linux下的nat也就是所谓“IP分享器”搭建原理

linux下的nat也就是所谓“IP分享器”搭建原理

作者/来源:新睿云小编 发布时间:2019-08-13

NAT的全名是Network Address Translation,字面上的意思是网络地址的转换。由字面上的意思我们来想一想, TCP/IP的网络封包不是有IP地址吗?那IP地址不是有来源与目的吗?我们的iptables指令就能够修改IP封包的表头数据。

一、什么是NAT?SNAT?DNAT?

在谈到NAT的实际运作之前,让我们再来看一下比较简单的封包透过iptables而传送到后端主机的表格与链流程(请往前参考图9.3-4)。当网络布线如图9.1-2的架构,若内部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吧!

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

image.png

二、SNAT 封包传送出去的示意图

如上图所示,在客户端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 回传封包呢?又会怎么作?

image.png

三、SNAT 封包接收的示意图

在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。

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

image.png

四、DNAT 的封包传送示意图

如上图所示,假设我的内部主机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 啰!很简单吧!更多相关知识可以了解《静态NAT与动态NAT的实现原理以及实际作用》。

本文整理自鸟哥的私房菜,感谢原作者的辛勤劳动。

热门标签
免费领云产品
在线客服   
{{item.description}}

—您的烦恼我们已经收到—

我们会将处理结果发送至您的手机

请耐心等待